From b24bb68603c9cfe53defb247951c6be3b55656ac Mon Sep 17 00:00:00 2001 From: Zalgo <80800403+ZalgoSoft@users.noreply.github.com> Date: Wed, 30 Mar 2022 00:46:33 +0800 Subject: [PATCH 01/12] add ptz on GPIO and dashboard --- app_httpd.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ esp32-cam-webserver.ino | 21 +++++++++++++++++++++ index_other.h | 27 +++++++++++++++++++++++++++ index_ov2640.h | 27 +++++++++++++++++++++++++++ 4 files changed, 116 insertions(+) diff --git a/app_httpd.cpp b/app_httpd.cpp index f2b11a9..e7b1948 100644 --- a/app_httpd.cpp +++ b/app_httpd.cpp @@ -20,6 +20,7 @@ #include #include +#include #include "index_ov2640.h" #include "index_ov3660.h" #include "index_other.h" @@ -67,6 +68,11 @@ extern char otaPassword[]; extern unsigned long xclk; extern int sensorPID; +extern Servo servo1; +extern Servo servo2; +extern int servo1Pos; +extern int servo2Pos; +#define SERVO_STEP 5 typedef struct { httpd_req_t *req; size_t len; @@ -425,6 +431,41 @@ static esp_err_t cmd_handler(httpd_req_t *req){ flashLED(50); delay(150); Serial.print('.'); + + } + } + else if (!strcmp(variable, "ptz")) { + if (val == 1 ) { + if (servo1Pos <= 180) { + servo1Pos += SERVO_STEP; + servo1.write(servo1Pos); + } + Serial.println(servo1Pos); + Serial.println("Up"); + } + else if (val == 3 ) { + if (servo2Pos <= 180) { + servo2Pos += SERVO_STEP; + servo2.write(servo2Pos); + } + Serial.println(servo2Pos); + Serial.println("Left"); + } + else if (val == 2 ) { + if (servo2Pos >= 0) { + servo2Pos -= SERVO_STEP; + servo2.write(servo2Pos); + } + Serial.println(servo2Pos); + Serial.println("Right"); + } + else if (val == 4 ) { + if (servo1Pos >= 0) { + servo1Pos -= SERVO_STEP; + servo1.write(servo1Pos); + } + Serial.println(servo1Pos); + Serial.println("Down"); } } else { diff --git a/esp32-cam-webserver.ino b/esp32-cam-webserver.ino index 38b22fa..373b5c1 100644 --- a/esp32-cam-webserver.ino +++ b/esp32-cam-webserver.ino @@ -9,6 +9,7 @@ #include "time.h" #include +#include /* This sketch is a extension/expansion/reork of the 'official' ESP32 Camera example * sketch from Expressif: @@ -61,6 +62,14 @@ camera_config_t config; // used for non-volatile camera settings #include "storage.h" +#define SERVO_1 14 +#define SERVO_2 15 +#define SERVO_STEP 5 +Servo servo1; +Servo servo2; +int servo1Pos = 64; +int servo2Pos = 64; +//ESP32PWM pwm; // Sketch Info int sketchSize; int sketchSpace; @@ -664,6 +673,18 @@ void setup() { delay(5000); } } + // Allow allocation of all timers + // ESP32PWM::allocateTimer(0); + // ESP32PWM::allocateTimer(1); + // ESP32PWM::allocateTimer(2); + // ESP32PWM::allocateTimer(3); + //servo1.setPeriodHertz(50); // standard 50 hz servo + //servo2.setPeriodHertz(50); // standard 50 hz servo + servo1.attach(SERVO_1); + servo2.attach(SERVO_2); + servo1.write(servo1Pos); + servo2.write(servo2Pos); + // pwm.attachPin(12, 10000);//10khz #if defined(LED_PIN) // If we have a notification LED, set it to output pinMode(LED_PIN, OUTPUT); diff --git a/index_other.h b/index_other.h index 1eda91e..06c4236 100644 --- a/index_other.h +++ b/index_other.h @@ -64,6 +64,24 @@ const uint8_t index_simple_html[] = R"=====( +
+ + + + + + + +
+ +
+ + + +
+ +
+
@@ -92,6 +110,10 @@ const uint8_t index_simple_html[] = R"=====( const closeButton = document.getElementById('close-stream') const swapButton = document.getElementById('swap-viewer') + const ptzup = document.getElementById('ptzup') + const ptzdown = document.getElementById('ptzdown') + const ptzleft = document.getElementById('ptzleft') + const ptzright = document.getElementById('ptztight') const hide = el => { el.classList.add('hidden') } @@ -303,6 +325,11 @@ const uint8_t index_simple_html[] = R"=====( } }) + function toggleCheckbox(x) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", "http://github.com/control?var=ptz&val=" + x, true); + xhr.send(); + } )====="; diff --git a/index_ov2640.h b/index_ov2640.h index 179cb15..1f56118 100644 --- a/index_ov2640.h +++ b/index_ov2640.h @@ -258,6 +258,24 @@ const uint8_t index_ov2640_html[] = R"=====( +
+ + + + + + + +
+ +
+ + + +
+ +
+
@@ -320,6 +338,10 @@ const uint8_t index_ov2640_html[] = R"=====( const rebootButton = document.getElementById('reboot') const minFrameTime = document.getElementById('min_frame_time') + const ptzup = document.getElementById('ptzup') + const ptzdown = document.getElementById('ptzdown') + const ptzleft = document.getElementById('ptzleft') + const ptzright = document.getElementById('ptztight') const hide = el => { el.classList.add('hidden') } @@ -627,6 +649,11 @@ const uint8_t index_ov2640_html[] = R"=====( } }) + function toggleCheckbox(x) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", "http://github.com/control?var=ptz&val=" + x, true); + xhr.send(); + } )====="; From ead540f691cd40cb043e39db1fb6ff4e69b5568a Mon Sep 17 00:00:00 2001 From: Zalgo <80800403+ZalgoSoft@users.noreply.github.com> Date: Wed, 30 Mar 2022 00:53:32 +0800 Subject: [PATCH 02/12] desc added --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index faa576c..d73e772 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # ESP32-CAM example revisited.     [![CI Status](https://travis-ci.com/easytarget/esp32-cam-webserver.svg?branch=master)](https://travis-ci.com/github/easytarget/esp32-cam-webserver)    ![ESP-EYE logo](Docs/logo.svg) - +# simple PTZ patch and related GUI changes ## Taken from the ESP examples, and expanded This sketch is a extension/expansion/rework of the 'official' ESP32 Camera example sketch from Espressif: From 5a13500fae759eeebd0ecafd0557b3a29d2fb6ba Mon Sep 17 00:00:00 2001 From: Zalgo <80800403+ZalgoSoft@users.noreply.github.com> Date: Thu, 31 Mar 2022 09:56:54 +0800 Subject: [PATCH 03/12] add web log and useing second core (0) --- app_httpd.cpp | 208 +++++++++++++++++------------ esp32-cam-webserver.ino | 286 +++++++++++++++++++++------------------- 2 files changed, 277 insertions(+), 217 deletions(-) diff --git a/app_httpd.cpp b/app_httpd.cpp index e7b1948..67fc9a0 100644 --- a/app_httpd.cpp +++ b/app_httpd.cpp @@ -12,6 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. +#define configUSE_TRACE_FACILITY 1 +#define configUSE_STATS_FORMATTING_FUNCTIONS 1 +#define configSUPPORT_DYNAMIC_ALLOCATION 1 #include #include #include @@ -20,6 +23,12 @@ #include #include +#include // The T-Logging library. +#include +#include +#include +#include +#include #include #include "index_ov2640.h" #include "index_ov3660.h" @@ -70,8 +79,8 @@ extern int sensorPID; extern Servo servo1; extern Servo servo2; -extern int servo1Pos; -extern int servo2Pos; +extern int ptz_y; +extern int ptz_x; #define SERVO_STEP 5 typedef struct { httpd_req_t *req; @@ -98,52 +107,54 @@ uint8_t temprature_sens_read(); #endif void serialDump() { - Serial.println(); + Log.println(); // Module - Serial.printf("Name: %s\r\n", myName); + Log.printf("Name: %s\r\n", myName); if (haveTime) { - Serial.print("Time: "); + Log.print("Time: "); printLocalTime(true); } - Serial.printf("Firmware: %s (base: %s)\r\n", myVer, baseVersion); + Log.printf("Firmware: %s (base: %s)\r\n", myVer, baseVersion); float sketchPct = 100 * sketchSize / sketchSpace; - Serial.printf("Sketch Size: %i (total: %i, %.1f%% used)\r\n", sketchSize, sketchSpace, sketchPct); - Serial.printf("MD5: %s\r\n", sketchMD5.c_str()); - Serial.printf("ESP sdk: %s\r\n", ESP.getSdkVersion()); + Log.printf("Sketch Size: %i (total: %i, %.1f%% used)\r\n", sketchSize, sketchSpace, sketchPct); + Log.printf("MD5: %s\r\n", sketchMD5.c_str()); + Log.printf("ESP sdk: %s\r\n", ESP.getSdkVersion()); if (otaEnabled) { if (strlen(otaPassword) != 0) { - Serial.printf("OTA: Enabled, Password: %s\n\r", otaPassword); + Log.printf("OTA: Enabled, Password: %s\n\r", otaPassword); } else { - Serial.printf("OTA: Enabled, No Password! (insecure)\n\r"); + Log.printf("OTA: Enabled, No Password! (insecure)\n\r"); } } else { - Serial.printf("OTA: Disabled\n\r"); + Log.printf("OTA: Disabled\n\r"); } // Network if (accesspoint) { if (captivePortal) { - Serial.printf("WiFi Mode: AccessPoint with captive portal\r\n"); + Log.printf("WiFi Mode: AccessPoint with captive portal\r\n"); } else { - Serial.printf("WiFi Mode: AccessPoint\r\n"); + Log.printf("WiFi Mode: AccessPoint\r\n"); } - Serial.printf("WiFi SSID: %s\r\n", apName); + Log.printf("WiFi SSID: %s\r\n", apName); } else { - Serial.printf("WiFi Mode: Client\r\n"); + Log.printf("WiFi Mode: Client\r\n"); String ssidName = WiFi.SSID(); - Serial.printf("WiFi Ssid: %s\r\n", ssidName.c_str()); - Serial.printf("WiFi Rssi: %i\r\n", WiFi.RSSI()); + Log.printf("WiFi Ssid: %s\r\n", ssidName.c_str()); + Log.printf("WiFi Rssi: %i\r\n", WiFi.RSSI()); String bssid = WiFi.BSSIDstr(); - Serial.printf("WiFi BSSID: %s\r\n", bssid.c_str()); + Log.printf("WiFi BSSID: %s\r\n", bssid.c_str()); } - Serial.printf("WiFi IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); + Log.printf("WiFi IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); if (!accesspoint) { - Serial.printf("WiFi Netmask: %d.%d.%d.%d\r\n", net[0], net[1], net[2], net[3]); - Serial.printf("WiFi Gateway: %d.%d.%d.%d\r\n", gw[0], gw[1], gw[2], gw[3]); + Log.printf("WiFi Netmask: %d.%d.%d.%d\r\n", net[0], net[1], net[2], net[3]); + Log.printf("WiFi Gateway: %d.%d.%d.%d\r\n", gw[0], gw[1], gw[2], gw[3]); } - Serial.printf("WiFi Http port: %i, Stream port: %i\r\n", httpPort, streamPort); + Log.printf("WiFi Http port: %i, Stream port: %i\r\n", httpPort, streamPort); byte mac[6]; WiFi.macAddress(mac); - Serial.printf("WiFi MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + Log.printf("WiFi MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + Log.print("serialDump CPU "); + Log.println(xPortGetCoreID()); // System int64_t sec = esp_timer_get_time() / 1000000; int64_t upDays = int64_t(floor(sec/86400)); @@ -152,31 +163,31 @@ void serialDump() { int upSec = sec % 60; int McuTc = (temprature_sens_read() - 32) / 1.8; // celsius int McuTf = temprature_sens_read(); // fahrenheit - Serial.printf("System up: %" PRId64 ":%02i:%02i:%02i (d:h:m:s)\r\n", upDays, upHours, upMin, upSec); - Serial.printf("Active streams: %i, Previous streams: %lu, Images captured: %lu\r\n", streamCount, streamsServed, imagesServed); - Serial.printf("CPU Freq: %i MHz, Xclk Freq: %i MHz\r\n", ESP.getCpuFreqMHz(), xclk); - Serial.printf("MCU temperature : %i C, %i F (approximate)\r\n", McuTc, McuTf); - Serial.printf("Heap: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getHeapSize(), ESP.getFreeHeap(), ESP.getMinFreeHeap(), ESP.getMaxAllocHeap()); + Log.printf("System up: %" PRId64 ":%02i:%02i:%02i (d:h:m:s)\r\n", upDays, upHours, upMin, upSec); + Log.printf("Active streams: %i, Previous streams: %lu, Images captured: %lu\r\n", streamCount, streamsServed, imagesServed); + Log.printf("CPU Freq: %i MHz, Xclk Freq: %i MHz\r\n", ESP.getCpuFreqMHz(), xclk); + Log.printf("MCU temperature : %i C, %i F (approximate)\r\n", McuTc, McuTf); + Log.printf("Heap: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getHeapSize(), ESP.getFreeHeap(), ESP.getMinFreeHeap(), ESP.getMaxAllocHeap()); if(psramFound()) { - Serial.printf("Psram: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getPsramSize(), ESP.getFreePsram(), ESP.getMinFreePsram(), ESP.getMaxAllocPsram()); + Log.printf("Psram: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getPsramSize(), ESP.getFreePsram(), ESP.getMinFreePsram(), ESP.getMaxAllocPsram()); } else { - Serial.printf("Psram: Not found; please check your board configuration.\r\n"); - Serial.printf("- High resolution/quality settings will show incomplete frames to low memory.\r\n"); + Log.printf("Psram: Not found; please check your board configuration.\r\n"); + Log.printf("- High resolution/quality settings will show incomplete frames to low memory.\r\n"); } // Filesystems if (filesystem && (SPIFFS.totalBytes() > 0)) { - Serial.printf("Spiffs: %i, used: %i\r\n", SPIFFS.totalBytes(), SPIFFS.usedBytes()); + Log.printf("Spiffs: %i, used: %i\r\n", SPIFFS.totalBytes(), SPIFFS.usedBytes()); } else { - Serial.printf("Spiffs: No filesystem found, please check your board configuration.\r\n"); - Serial.printf("- Saving and restoring camera settings will not function without this.\r\n"); + Log.printf("Spiffs: No filesystem found, please check your board configuration.\r\n"); + Log.printf("- Saving and restoring camera settings will not function without this.\r\n"); } - Serial.println("Preferences file: "); + Log.println("Preferences file: "); dumpPrefs(SPIFFS); if (critERR.length() > 0) { - Serial.printf("\r\n\r\nAn error or halt has occurred with Camera Hardware, see previous messages.\r\n"); - Serial.printf("A reboot is required to recover from this.\r\nError message: (html)\r\n %s\r\n\r\n", critERR.c_str()); + Log.printf("\r\n\r\nAn error or halt has occurred with Camera Hardware, see previous messages.\r\n"); + Log.printf("A reboot is required to recover from this.\r\nError message: (html)\r\n %s\r\n\r\n", critERR.c_str()); } - Serial.println(); + Log.println(); return; } @@ -184,7 +195,8 @@ static esp_err_t capture_handler(httpd_req_t *req){ camera_fb_t * fb = NULL; esp_err_t res = ESP_OK; - Serial.println("Capture Requested"); + Log.print("capture_handler CPU "); + Log.println(xPortGetCoreID()); if (autoLamp && (lampVal != -1)) { setLamp(lampVal); delay(75); // coupled with the status led flash this gives ~150ms for lamp to settle. @@ -195,7 +207,7 @@ static esp_err_t capture_handler(httpd_req_t *req){ fb = esp_camera_fb_get(); if (!fb) { - Serial.println("CAPTURE: failed to acquire frame"); + Log.println("CAPTURE: failed to acquire frame"); httpd_resp_send_500(req); if (autoLamp && (lampVal != -1)) setLamp(0); return ESP_FAIL; @@ -211,14 +223,14 @@ static esp_err_t capture_handler(httpd_req_t *req){ res = httpd_resp_send(req, (const char *)fb->buf, fb->len); } else { res = ESP_FAIL; - Serial.println("Capture Error: Non-JPEG image returned by camera module"); + Log.println("Capture Error: Non-JPEG image returned by camera module"); } esp_camera_fb_return(fb); fb = NULL; int64_t fr_end = esp_timer_get_time(); if (debugData) { - Serial.printf("JPG: %uB %ums\r\n", (uint32_t)(fb_len), (uint32_t)((fr_end - fr_start)/1000)); + Log.printf("JPG: %uB %ums\r\n", (uint32_t)(fb_len), (uint32_t)((fr_end - fr_start)/1000)); } imagesServed++; if (autoLamp && (lampVal != -1)) { @@ -236,7 +248,9 @@ static esp_err_t stream_handler(httpd_req_t *req){ streamKill = false; - Serial.println("Stream requested"); + print_client_ip(req); Log.print("Stream requested"); + Log.print(" stream_handler CPU "); + Log.println(xPortGetCoreID()); if (autoLamp && (lampVal != -1)) setLamp(lampVal); streamCount = 1; // at present we only have one stream handler, so values are 0 or 1.. flashLED(75); // double flash of status LED @@ -252,7 +266,7 @@ static esp_err_t stream_handler(httpd_req_t *req){ if(res != ESP_OK){ streamCount = 0; if (autoLamp && (lampVal != -1)) setLamp(0); - Serial.println("STREAM: failed to set HTTP response type"); + Log.println("STREAM: failed to set HTTP response type"); return res; } @@ -265,11 +279,11 @@ static esp_err_t stream_handler(httpd_req_t *req){ while(true){ fb = esp_camera_fb_get(); if (!fb) { - Serial.println("STREAM: failed to acquire frame"); + Log.println("STREAM: failed to acquire frame"); res = ESP_FAIL; } else { if(fb->format != PIXFORMAT_JPEG){ - Serial.println("STREAM: Non-JPEG frame returned by camera module"); + Log.println("STREAM: Non-JPEG frame returned by camera module"); res = ESP_FAIL; } else { _jpg_buf_len = fb->len; @@ -297,12 +311,12 @@ static esp_err_t stream_handler(httpd_req_t *req){ if(res != ESP_OK){ // This is the error exit point from the stream loop. // We end the stream here only if a Hard failure has been encountered or the connection has been interrupted. - Serial.printf("Stream failed, code = %i : %s\r\n", res, esp_err_to_name(res)); + Log.printf("Stream failed, code = %i : %s\r\n", res, esp_err_to_name(res)); break; } if((res != ESP_OK) || streamKill){ // We end the stream here when a kill is signalled. - Serial.printf("Stream killed\r\n"); + Log.printf("Stream killed\r\n"); break; } int64_t frame_time = esp_timer_get_time() - last_frame; @@ -311,7 +325,7 @@ static esp_err_t stream_handler(httpd_req_t *req){ delay(frame_delay); if (debugData) { - Serial.printf("MJPG: %uB %ums, delay: %ums, framerate (%.1ffps)\r\n", + Log.printf("MJPG: %uB %ums, delay: %ums, framerate (%.1ffps)\r\n", (uint32_t)(_jpg_buf_len), (uint32_t)frame_time, frame_delay, 1000.0 / (uint32_t)(frame_time + frame_delay)); } @@ -321,7 +335,7 @@ static esp_err_t stream_handler(httpd_req_t *req){ streamsServed++; streamCount = 0; if (autoLamp && (lampVal != -1)) setLamp(0); - Serial.println("Stream ended"); + Log.println("Stream ended"); last_frame = 0; return res; } @@ -426,46 +440,46 @@ static esp_err_t cmd_handler(httpd_req_t *req){ periph_module_disable(PERIPH_I2C1_MODULE); periph_module_reset(PERIPH_I2C0_MODULE); periph_module_reset(PERIPH_I2C1_MODULE); - Serial.print("REBOOT requested"); + Log.print("REBOOT requested"); while(true) { flashLED(50); delay(150); - Serial.print('.'); + Log.print('.'); } } else if (!strcmp(variable, "ptz")) { if (val == 1 ) { - if (servo1Pos <= 180) { - servo1Pos += SERVO_STEP; - servo1.write(servo1Pos); + if (ptz_y <= 180) { + ptz_y += SERVO_STEP; + servo1.write(ptz_y); } - Serial.println(servo1Pos); - Serial.println("Up"); + Log.printf("PTZ: %i\t%i\t",ptz_x,ptz_y); + Log.println("Up"); } else if (val == 3 ) { - if (servo2Pos <= 180) { - servo2Pos += SERVO_STEP; - servo2.write(servo2Pos); + if (ptz_x <= 180) { + ptz_x += SERVO_STEP; + servo2.write(ptz_x); } - Serial.println(servo2Pos); - Serial.println("Left"); + Log.printf("PTZ: %i\t%i\t",ptz_x,ptz_y); + Log.println("Left"); } else if (val == 2 ) { - if (servo2Pos >= 0) { - servo2Pos -= SERVO_STEP; - servo2.write(servo2Pos); + if (ptz_x >= 0) { + ptz_x -= SERVO_STEP; + servo2.write(ptz_x); } - Serial.println(servo2Pos); - Serial.println("Right"); + Log.printf("PTZ: %i\t%i\t",ptz_x,ptz_y); + Log.println("Right"); } else if (val == 4 ) { - if (servo1Pos >= 0) { - servo1Pos -= SERVO_STEP; - servo1.write(servo1Pos); + if (ptz_y >= 0) { + ptz_y -= SERVO_STEP; + servo1.write(ptz_y); } - Serial.println(servo1Pos); - Serial.println("Down"); + Log.printf("PTZ: %i\t%i\t" , ptz_x , ptz_y); + Log.println("Down"); } } else { @@ -566,8 +580,11 @@ static esp_err_t logo_svg_handler(httpd_req_t *req){ static esp_err_t dump_handler(httpd_req_t *req){ flashLED(75); - Serial.println("\r\nDump requested via Web"); + print_client_ip(req); Log.println("\r\nDump requested via Web"); serialDump(); + Log.print("dump_handler CPU "); + Log.println(xPortGetCoreID()); + static char dumpOut[2000] = ""; char * d = dumpOut; // Header @@ -674,7 +691,7 @@ static esp_err_t dump_handler(httpd_req_t *req){ static esp_err_t stop_handler(httpd_req_t *req){ flashLED(75); - Serial.println("\r\nStream stop requested via Web"); + print_client_ip(req); Log.println("\r\nStream stop requested via Web"); streamKill = true; httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); return httpd_resp_send(req, NULL, 0); @@ -689,7 +706,7 @@ static esp_err_t style_handler(httpd_req_t *req){ static esp_err_t streamviewer_handler(httpd_req_t *req){ flashLED(75); - Serial.println("Stream viewer requested"); + print_client_ip(req); Log.println("Stream viewer requested"); httpd_resp_set_type(req, "text/html"); httpd_resp_set_hdr(req, "Content-Encoding", "identity"); return httpd_resp_send(req, (const char *)streamviewer_html, streamviewer_html_len); @@ -697,7 +714,7 @@ static esp_err_t streamviewer_handler(httpd_req_t *req){ static esp_err_t error_handler(httpd_req_t *req){ flashLED(75); - Serial.println("Sending error page"); + Log.println("Sending error page"); std::string s(error_html); size_t index; while ((index = s.find("")) != std::string::npos) @@ -710,6 +727,21 @@ static esp_err_t error_handler(httpd_req_t *req){ httpd_resp_set_hdr(req, "Content-Encoding", "identity"); return httpd_resp_send(req, (const char *)s.c_str(), s.length()); } +void print_client_ip(httpd_req_t *req) +{ + int sockfd = httpd_req_to_sockfd(req); + char ipstr[INET6_ADDRSTRLEN]; + struct sockaddr_in6 addr; // esp_http_server uses IPv6 addressing + socklen_t addr_size = sizeof(addr); + if (getpeername(sockfd, (struct sockaddr *)&addr, &addr_size) < 0) { + Log.println( "Error getting client IP"); + return; + } +// inet_ntop(AF_INET, &addr.sin6_addr, ipstr, sizeof(ipstr)); + inet_ntop(AF_INET, &addr.sin6_addr.un.u32_addr[3], ipstr, sizeof(ipstr)); + Log.print ("Client IP => "); + Log.println(ipstr); +} static esp_err_t index_handler(httpd_req_t *req){ char* buf; @@ -748,13 +780,18 @@ static esp_err_t index_handler(httpd_req_t *req){ } if (strncmp(view,"simple", sizeof(view)) == 0) { - Serial.println("Simple index page requested"); + print_client_ip(req) ; + Log.print(" Simple index page requested"); + Log.print("CPU "); + Log.println(xPortGetCoreID()); if (critERR.length() > 0) return error_handler(req); httpd_resp_set_type(req, "text/html"); httpd_resp_set_hdr(req, "Content-Encoding", "identity"); return httpd_resp_send(req, (const char *)index_simple_html, index_simple_html_len); } else if(strncmp(view,"full", sizeof(view)) == 0) { - Serial.println("Full index page requested"); + print_client_ip(req) ; + Log.print (" Full index page requested "); + Log.print("CPU "); Log.println(xPortGetCoreID()); if (critERR.length() > 0) return error_handler(req); httpd_resp_set_type(req, "text/html"); httpd_resp_set_hdr(req, "Content-Encoding", "identity"); @@ -764,7 +801,8 @@ static esp_err_t index_handler(httpd_req_t *req){ return httpd_resp_send(req, (const char *)index_ov2640_html, index_ov2640_html_len); } else if(strncmp(view,"portal", sizeof(view)) == 0) { //Prototype captive portal landing page. - Serial.println("Portal page requested"); + print_client_ip(req); Log.print("Portal page requested"); + Log.print("CPU "); Log.println(xPortGetCoreID()); std::string s(portal_html); size_t index; while ((index = s.find("")) != std::string::npos) @@ -777,8 +815,8 @@ static esp_err_t index_handler(httpd_req_t *req){ httpd_resp_set_hdr(req, "Content-Encoding", "identity"); return httpd_resp_send(req, (const char *)s.c_str(), s.length()); } else { - Serial.print("Unknown page requested: "); - Serial.println(view); + print_client_ip(req); Log.print("Unknown page requested: "); + Log.println(view); httpd_resp_send_404(req); return ESP_FAIL; } @@ -888,7 +926,8 @@ void startCameraServer(int hPort, int sPort){ // Request Handlers; config.max_uri_handlers (above) must be >= the number of handlers config.server_port = hPort; config.ctrl_port = hPort; - Serial.printf("Starting web server on port: '%d'\r\n", config.server_port); +// config.core_id = 1; + Log.printf("Starting web server on port: '%d'\r\n", config.server_port); if (httpd_start(&camera_httpd, &config) == ESP_OK) { if (critERR.length() > 0) { httpd_register_uri_handler(camera_httpd, &error_uri); @@ -909,7 +948,8 @@ void startCameraServer(int hPort, int sPort){ config.server_port = sPort; config.ctrl_port = sPort; - Serial.printf("Starting stream server on port: '%d'\r\n", config.server_port); +// config.core_id = 0; + Log.printf("Starting stream server on port: '%d'\r\n", config.server_port); if (httpd_start(&stream_httpd, &config) == ESP_OK) { if (critERR.length() > 0) { httpd_register_uri_handler(camera_httpd, &error_uri); diff --git a/esp32-cam-webserver.ino b/esp32-cam-webserver.ino index 373b5c1..62ac9db 100644 --- a/esp32-cam-webserver.ino +++ b/esp32-cam-webserver.ino @@ -49,6 +49,10 @@ stationList[] = {{"ESP32-CAM-CONNECT","InsecurePassword", true}}; #endif +#include // The T-Logging library. +#include +WebSerialStream webSerialStream = WebSerialStream(8514); +TaskHandle_t Task1Handle; // Upstream version string #include "src/version.h" @@ -67,8 +71,8 @@ camera_config_t config; #define SERVO_STEP 5 Servo servo1; Servo servo2; -int servo1Pos = 64; -int servo2Pos = 64; +int ptz_y = 64; +int ptz_x = 64; //ESP32PWM pwm; // Sketch Info int sketchSize; @@ -242,12 +246,12 @@ bool debugData; void debugOn() { debugData = true; - Serial.println("Camera debug data is enabled (send 'd' for status dump, or any other char to disable debug)"); + Log.println("Camera debug data is enabled (send 'd' for status dump, or any other char to disable debug)"); } void debugOff() { debugData = false; - Serial.println("Camera debug data is disabled (send 'd' for status dump, or any other char to enable debug)"); + Log.println("Camera debug data is disabled (send 'd' for status dump, or any other char to enable debug)"); } // Serial input (debugging controls) @@ -282,10 +286,10 @@ void setLamp(int newVal) { // Apply a logarithmic function to the scale. int brightness = round((pow(2,(1+(newVal*0.02)))-2)/6*pwmMax); ledcWrite(lampChannel, brightness); - Serial.print("Lamp: "); - Serial.print(newVal); - Serial.print("%, pwm = "); - Serial.println(brightness); + Log.print("Lamp: "); + Log.print(newVal); + Log.print("%, pwm = "); + Log.println(brightness); } #endif } @@ -293,15 +297,48 @@ void setLamp(int newVal) { void printLocalTime(bool extraData=false) { struct tm timeinfo; if(!getLocalTime(&timeinfo)){ - Serial.println("Failed to obtain time"); + Log.println("Failed to obtain time"); } else { - Serial.println(&timeinfo, "%H:%M:%S, %A, %B %d %Y"); + Log.println(&timeinfo, "%H:%M:%S, %A, %B %d %Y"); } if (extraData) { - Serial.printf("NTP Server: %s, GMT Offset: %li(s), DST Offset: %i(s)\r\n", ntpServer, gmtOffset_sec, daylightOffset_sec); + Log.printf("NTP Server: %s, GMT Offset: %li(s), DST Offset: %i(s)\r\n", ntpServer, gmtOffset_sec, daylightOffset_sec); } } +void Task1Core0 (void * pvParameters ){ + Log.print("Task1Core0 start CPU "); + Log.println(xPortGetCoreID()); + // Start the camera server + startCameraServer(httpPort, streamPort); + if (critERR.length() == 0) { + Log.printf("\r\nCamera Ready!\r\nUse '%s' to connect\r\n", httpURL); + Log.printf("Stream viewer available at '%sview'\r\n", streamURL); + Log.printf("Raw stream URL is '%s'\r\n", streamURL); + #if defined(DEBUG_DEFAULT_ON) + debugOn(); + #else + debugOff(); + #endif + } else { + Log.printf("\r\nCamera unavailable due to initialisation errors.\r\n\r\n"); + } + // Info line; use for Info messages; eg 'This is a Beta!' warnings, etc. as necesscary + Log.print("\r\nThis is the 4.1 beta\r\n"); + // do something every 5 seconds. + static unsigned long last_report = millis(); + for (;;) { + Log.loop(); + if (millis() - last_report < 8 * 1000) + {} + else { + Log.print (millis()); + Log.print(" CPU "); Log.println(xPortGetCoreID()); + last_report = millis(); + } + } +} + void calcURLs() { // Set the URL's #if defined(URL_HOSTNAME) @@ -312,7 +349,7 @@ void calcURLs() { } sprintf(streamURL, "http://%s:%d/", URL_HOSTNAME, streamPort); #else - Serial.println("Setting httpURL"); + Log.println("Setting httpURL"); if (httpPort != 80) { sprintf(httpURL, "http://%d.%d.%d.%d:%d/", ip[0], ip[1], ip[2], ip[3], httpPort); } else { @@ -323,6 +360,8 @@ void calcURLs() { } void StartCamera() { + Log.print("StartCamera CPU "); + Log.println(xPortGetCoreID()); // Populate camera config structure with hardware and other defaults config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; @@ -365,9 +404,9 @@ void StartCamera() { esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { delay(100); // need a delay here or the next serial o/p gets missed - Serial.printf("\r\n\r\nCRITICAL FAILURE: Camera sensor failed to initialise.\r\n\r\n"); - Serial.printf("A full (hard, power off/on) reboot will probably be needed to recover from this.\r\n"); - Serial.printf("Meanwhile; this unit will reboot in 1 minute since these errors sometime clear automatically\r\n"); + Log.printf("\r\n\r\nCRITICAL FAILURE: Camera sensor failed to initialise.\r\n\r\n"); + Log.printf("A full (hard, power off/on) reboot will probably be needed to recover from this.\r\n"); + Log.printf("Meanwhile; this unit will reboot in 1 minute since these errors sometime clear automatically\r\n"); // Reset the I2C bus.. may help when rebooting. periph_module_disable(PERIPH_I2C0_MODULE); // try to shut I2C down properly in case that is the problem periph_module_disable(PERIPH_I2C1_MODULE); @@ -380,7 +419,7 @@ void StartCamera() { esp_task_wdt_init(60,true); esp_task_wdt_add(NULL); } else { - Serial.println("Camera init succeeded"); + Log.println("Camera init succeeded"); // Get a reference to the sensor sensor_t * s = esp_camera_sensor_get(); @@ -388,11 +427,11 @@ void StartCamera() { // Dump camera module, warn for unsupported modules. sensorPID = s->id.PID; switch (sensorPID) { - case OV9650_PID: Serial.println("WARNING: OV9650 camera module is not properly supported, will fallback to OV2640 operation"); break; - case OV7725_PID: Serial.println("WARNING: OV7725 camera module is not properly supported, will fallback to OV2640 operation"); break; - case OV2640_PID: Serial.println("OV2640 camera module detected"); break; - case OV3660_PID: Serial.println("OV3660 camera module detected"); break; - default: Serial.println("WARNING: Camera module is unknown and not properly supported, will fallback to OV2640 operation"); + case OV9650_PID: Log.println("WARNING: OV9650 camera module is not properly supported, will fallback to OV2640 operation"); break; + case OV7725_PID: Log.println("WARNING: OV7725 camera module is not properly supported, will fallback to OV2640 operation"); break; + case OV2640_PID: Log.println("OV2640 camera module detected"); break; + case OV3660_PID: Log.println("OV3660 camera module detected"); break; + default: Log.println("WARNING: Camera module is unknown and not properly supported, will fallback to OV2640 operation"); } // OV3660 initial sensors are flipped vertically and colors are a bit saturated @@ -464,22 +503,22 @@ void WifiSetup() { flashLED(300); delay(100); flashLED(300); - Serial.println("Starting WiFi"); + Log.println("Starting WiFi"); // Disable power saving on WiFi to improve responsiveness // (https://github.com/espressif/arduino-esp32/issues/1484) WiFi.setSleep(false); - Serial.print("Known external SSIDs: "); + Log.print("Known external SSIDs: "); if (stationCount > firstStation) { - for (int i=firstStation; i < stationCount; i++) Serial.printf(" '%s'", stationList[i].ssid); + for (int i=firstStation; i < stationCount; i++) Log.printf(" '%s'", stationList[i].ssid); } else { - Serial.print("None"); + Log.print("None"); } - Serial.println(); + Log.println(); byte mac[6] = {0,0,0,0,0,0}; WiFi.macAddress(mac); - Serial.printf("MAC address: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + Log.printf("MAC address: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); int bestStation = -1; long bestRSSI = -1024; @@ -487,21 +526,21 @@ void WifiSetup() { uint8_t bestBSSID[6]; if (stationCount > firstStation) { // We have a list to scan - Serial.printf("Scanning local Wifi Networks\r\n"); + Log.printf("Scanning local Wifi Networks\r\n"); int stationsFound = WiFi.scanNetworks(); - Serial.printf("%i networks found\r\n", stationsFound); + Log.printf("%i networks found\r\n", stationsFound); if (stationsFound > 0) { for (int i = 0; i < stationsFound; ++i) { // Print SSID and RSSI for each network found String thisSSID = WiFi.SSID(i); int thisRSSI = WiFi.RSSI(i); String thisBSSID = WiFi.BSSIDstr(i); - Serial.printf("%3i : [%s] %s (%i)", i + 1, thisBSSID.c_str(), thisSSID.c_str(), thisRSSI); + Log.printf("%3i : [%s] %s (%i)", i + 1, thisBSSID.c_str(), thisSSID.c_str(), thisRSSI); // Scan our list of known external stations for (int sta = firstStation; sta < stationCount; sta++) { if ((strcmp(stationList[sta].ssid, thisSSID.c_str()) == 0) || (strcmp(stationList[sta].ssid, thisBSSID.c_str()) == 0)) { - Serial.print(" - Known!"); + Log.print(" - Known!"); // Chose the strongest RSSI seen if (thisRSSI > bestRSSI) { bestStation = sta; @@ -512,7 +551,7 @@ void WifiSetup() { } } } - Serial.println(); + Log.println(); } } } else { @@ -523,22 +562,22 @@ void WifiSetup() { if (bestStation == -1) { if (!accesspoint) { #if defined(WIFI_AP_ENABLE) - Serial.println("No known networks found, entering AccessPoint fallback mode"); + Log.println("No known networks found, entering AccessPoint fallback mode"); accesspoint = true; #else - Serial.println("No known networks found"); + Log.println("No known networks found"); #endif } else { - Serial.println("AccessPoint mode selected in config"); + Log.println("AccessPoint mode selected in config"); } } else { - Serial.printf("Connecting to Wifi Network %d: [%02X:%02X:%02X:%02X:%02X:%02X] %s \r\n", + Log.printf("Connecting to Wifi Network %d: [%02X:%02X:%02X:%02X:%02X:%02X] %s \r\n", bestStation, bestBSSID[0], bestBSSID[1], bestBSSID[2], bestBSSID[3], bestBSSID[4], bestBSSID[5], bestSSID); // Apply static settings if necesscary if (stationList[bestStation].dhcp == false) { #if defined(ST_IP) - Serial.println("Applying static IP settings"); + Log.println("Applying static IP settings"); #if !defined (ST_GATEWAY) || !defined (ST_NETMASK) #error "You must supply both Gateway and NetMask when specifying a static IP address" #endif @@ -557,7 +596,7 @@ void WifiSetup() { #endif #endif #else - Serial.println("Static IP settings requested but not defined in config, falling back to dhcp"); + Log.println("Static IP settings requested but not defined in config, falling back to dhcp"); #endif } @@ -570,19 +609,20 @@ void WifiSetup() { unsigned long start = millis(); while ((millis() - start <= WIFI_WATCHDOG) && (WiFi.status() != WL_CONNECTED)) { delay(500); - Serial.print('.'); + Log.print('.'); } + Log.begin(); // If we have connected, inform user if (WiFi.status() == WL_CONNECTED) { - Serial.println("Client connection succeeded"); + Log.println("Client connection succeeded"); accesspoint = false; // Note IP details ip = WiFi.localIP(); net = WiFi.subnetMask(); gw = WiFi.gatewayIP(); - Serial.printf("IP address: %d.%d.%d.%d\r\n",ip[0],ip[1],ip[2],ip[3]); - Serial.printf("Netmask : %d.%d.%d.%d\r\n",net[0],net[1],net[2],net[3]); - Serial.printf("Gateway : %d.%d.%d.%d\r\n",gw[0],gw[1],gw[2],gw[3]); + Log.printf("IP address: %d.%d.%d.%d\r\n",ip[0],ip[1],ip[2],ip[3]); + Log.printf("Netmask : %d.%d.%d.%d\r\n",net[0],net[1],net[2],net[3]); + Log.printf("Gateway : %d.%d.%d.%d\r\n",gw[0],gw[1],gw[2],gw[3]); calcURLs(); // Flash the LED to show we are connected for (int i = 0; i < 5; i++) { @@ -590,7 +630,7 @@ void WifiSetup() { delay(150); } } else { - Serial.println("Client connection Failed"); + Log.println("Client connection Failed"); WiFi.disconnect(); // (resets the WiFi scan) } } @@ -598,20 +638,20 @@ void WifiSetup() { if (accesspoint && (WiFi.status() != WL_CONNECTED)) { // The accesspoint has been enabled, and we have not connected to any existing networks #if defined(AP_CHAN) - Serial.println("Setting up Fixed Channel AccessPoint"); - Serial.print(" SSID : "); - Serial.println(stationList[0].ssid); - Serial.print(" Password : "); - Serial.println(stationList[0].password); - Serial.print(" Channel : "); - Serial.println(AP_CHAN); + Log.println("Setting up Fixed Channel AccessPoint"); + Log.print(" SSID : "); + Log.println(stationList[0].ssid); + Log.print(" Password : "); + Log.println(stationList[0].password); + Log.print(" Channel : "); + Log.println(AP_CHAN); WiFi.softAP(stationList[0].ssid, stationList[0].password, AP_CHAN); # else - Serial.println("Setting up AccessPoint"); - Serial.print(" SSID : "); - Serial.println(stationList[0].ssid); - Serial.print(" Password : "); - Serial.println(stationList[0].password); + Log.println("Setting up AccessPoint"); + Log.print(" SSID : "); + Log.println(stationList[0].ssid); + Log.print(" Password : "); + Log.println(stationList[0].password); WiFi.softAP(stationList[0].ssid, stationList[0].password); #endif #if defined(AP_ADDRESS) @@ -628,7 +668,7 @@ void WifiSetup() { net = WiFi.subnetMask(); gw = WiFi.gatewayIP(); strcpy(apName, stationList[0].ssid); - Serial.printf("IP address: %d.%d.%d.%d\r\n",ip[0],ip[1],ip[2],ip[3]); + Log.printf("IP address: %d.%d.%d.%d\r\n",ip[0],ip[1],ip[2],ip[3]); calcURLs(); // Flash the LED to show we are connected for (int i = 0; i < 5; i++) { @@ -637,7 +677,7 @@ void WifiSetup() { } // Start the DNS captive portal if requested if (stationList[0].dhcp == true) { - Serial.println("Starting Captive Portal"); + Log.println("Starting Captive Portal"); dnsServer.start(DNS_PORT, "*", ip); captivePortal = true; } @@ -647,44 +687,42 @@ void WifiSetup() { void setup() { Serial.begin(115200); Serial.setDebugOutput(true); - Serial.println(); - Serial.println("===="); - Serial.print("esp32-cam-webserver: "); - Serial.println(myName); - Serial.print("Code Built: "); - Serial.println(myVer); - Serial.print("Base Release: "); - Serial.println(baseVersion); - Serial.println(); - - // Warn if no PSRAM is detected (typically user error with board selection in the IDE) - if(!psramFound()){ - Serial.println("\r\nFatal Error; Halting"); - while (true) { - Serial.println("No PSRAM found; camera cannot be initialised: Please check the board config for your module."); + Log.addPrintStream(std::make_shared(webSerialStream)); + if (stationCount == 0) { + Log.println("\r\nFatal Error; Halting"); + while (true) { + Log.println("No wifi details have been configured; we cannot connect to existing WiFi or start our own AccessPoint, there is no point in proceeding."); delay(5000); } } - - if (stationCount == 0) { - Serial.println("\r\nFatal Error; Halting"); + // Start Wifi and loop until we are connected or have started an AccessPoint + while ((WiFi.status() != WL_CONNECTED) && !accesspoint) { + WifiSetup(); + } + Log.begin(); + Log.print("setup: Log.begin(), CPU "); + Log.println(xPortGetCoreID()); + Log.println(); + Log.println("===="); + Log.print("esp32-cam-webserver: "); + Log.println(myName); + Log.print("Code Built: "); + Log.println(myVer); + Log.print("Base Release: "); + Log.println(baseVersion); + Log.println(); + // Warn if no PSRAM is detected (typically user error with board selection in the IDE) + if(!psramFound()){ + Log.println("\r\nFatal Error; Halting"); while (true) { - Serial.println("No wifi details have been configured; we cannot connect to existing WiFi or start our own AccessPoint, there is no point in proceeding."); + Log.println("No PSRAM found; camera cannot be initialised: Please check the board config for your module."); delay(5000); } } - // Allow allocation of all timers - // ESP32PWM::allocateTimer(0); - // ESP32PWM::allocateTimer(1); - // ESP32PWM::allocateTimer(2); - // ESP32PWM::allocateTimer(3); - //servo1.setPeriodHertz(50); // standard 50 hz servo - //servo2.setPeriodHertz(50); // standard 50 hz servo servo1.attach(SERVO_1); servo2.attach(SERVO_2); - servo1.write(servo1Pos); - servo2.write(servo2Pos); - // pwm.attachPin(12, 10000);//10khz + servo1.write(ptz_y); + servo2.write(ptz_x); #if defined(LED_PIN) // If we have a notification LED, set it to output pinMode(LED_PIN, OUTPUT); @@ -705,23 +743,18 @@ void setup() { delay(200); // a short delay to let spi bus settle after camera init loadPrefs(SPIFFS); } else { - Serial.println("No Internal Filesystem, cannot load or save preferences"); + Log.println("No Internal Filesystem, cannot load or save preferences"); } /* * Camera setup complete; initialise the rest of the hardware. */ - // Start Wifi and loop until we are connected or have started an AccessPoint - while ((WiFi.status() != WL_CONNECTED) && !accesspoint) { - WifiSetup(); - delay(1000); - } // Set up OTA if (otaEnabled) { // Start OTA once connected - Serial.println("Setting up OTA"); + Log.println("Setting up OTA"); // Port defaults to 3232 // ArduinoOTA.setPort(3232); // Hostname defaults to esp3232-[MAC] @@ -729,9 +762,9 @@ void setup() { // No authentication by default if (strlen(otaPassword) != 0) { ArduinoOTA.setPassword(otaPassword); - Serial.printf("OTA Password: %s\n\r", otaPassword); + Log.printf("OTA Password: %s\n\r", otaPassword); } else { - Serial.printf("\r\nNo OTA password has been set! (insecure)\r\n\r\n"); + Log.printf("\r\nNo OTA password has been set! (insecure)\r\n\r\n"); } ArduinoOTA .onStart([]() { @@ -741,49 +774,51 @@ void setup() { else // U_SPIFFS // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end() type = "filesystem"; - Serial.println("Start updating " + type); + Log.println("Start updating " + type); + Log.print("setup ArduinoOTA.onStart CPU "); + Log.println(xPortGetCoreID()); // Stop the camera since OTA will crash the module if it is running. // the unit will need rebooting to restart it, either by OTA on success, or manually by the user - Serial.println("Stopping Camera"); + Log.println("Stopping Camera"); esp_err_t err = esp_camera_deinit(); critERR = "

OTA Has been started


Camera has Halted!

"; critERR += "

Wait for OTA to finish and reboot, or reboot manually to recover

"; }) .onEnd([]() { - Serial.println("\r\nEnd"); + Log.println("\r\nEnd"); }) .onProgress([](unsigned int progress, unsigned int total) { - Serial.printf("Progress: %u%%\r", (progress / (total / 100))); + Log.printf("Progress: %u%%\r", (progress / (total / 100))); }) .onError([](ota_error_t error) { - Serial.printf("Error[%u]: ", error); - if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); - else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); - else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); - else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); - else if (error == OTA_END_ERROR) Serial.println("End Failed"); + Log.printf("Error[%u]: ", error); + if (error == OTA_AUTH_ERROR) Log.println("Auth Failed"); + else if (error == OTA_BEGIN_ERROR) Log.println("Begin Failed"); + else if (error == OTA_CONNECT_ERROR) Log.println("Connect Failed"); + else if (error == OTA_RECEIVE_ERROR) Log.println("Receive Failed"); + else if (error == OTA_END_ERROR) Log.println("End Failed"); }); ArduinoOTA.begin(); } else { - Serial.println("OTA is disabled"); + Log.println("OTA is disabled"); if (!MDNS.begin(mdnsName)) { - Serial.println("Error setting up MDNS responder!"); + Log.println("Error setting up MDNS responder!"); } - Serial.println("mDNS responder started"); + Log.println("mDNS responder started"); } //MDNS Config -- note that if OTA is NOT enabled this needs prior steps! MDNS.addService("http", "tcp", 80); - Serial.println("Added HTTP service to MDNS server"); + Log.println("Added HTTP service to MDNS server"); // Set time via NTP server when enabled if (haveTime) { - Serial.print("Time: "); + Log.print("Time: "); configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); printLocalTime(true); } else { - Serial.println("Time functions disabled"); + Log.println("Time functions disabled"); } // Gather static values used when dumping status; these are slow functions, so just do them once during startup @@ -800,30 +835,13 @@ void setup() { else setLamp(lampVal); #endif } else { - Serial.println("No lamp, or lamp disabled in config"); + Log.println("No lamp, or lamp disabled in config"); } - // Start the camera server - startCameraServer(httpPort, streamPort); - - if (critERR.length() == 0) { - Serial.printf("\r\nCamera Ready!\r\nUse '%s' to connect\r\n", httpURL); - Serial.printf("Stream viewer available at '%sview'\r\n", streamURL); - Serial.printf("Raw stream URL is '%s'\r\n", streamURL); - #if defined(DEBUG_DEFAULT_ON) - debugOn(); - #else - debugOff(); - #endif - } else { - Serial.printf("\r\nCamera unavailable due to initialisation errors.\r\n\r\n"); - } - - // Info line; use for Info messages; eg 'This is a Beta!' warnings, etc. as necesscary - // Serial.print("\r\nThis is the 4.1 beta\r\n"); // As a final init step chomp out the serial buffer in case we have recieved mis-keys or garbage during startup while (Serial.available()) Serial.read(); + xTaskCreatePinnedToCore(TaskCore0, "TaskCore0", 10000, NULL, 1, &TaskCore0Handle, 0); } void loop() { @@ -849,7 +867,7 @@ void loop() { // We are connected, wait a bit and re-check if (warned) { // Tell the user if we have just reconnected - Serial.println("WiFi reconnected"); + Log.println("WiFi reconnected"); warned = false; } // loop here for WIFI_WATCHDOG, turning debugData true/false depending on serial input.. @@ -862,9 +880,11 @@ void loop() { } else { // disconnected; attempt to reconnect if (!warned) { + Log.print("loop CPU "); + Log.println(xPortGetCoreID()); // Tell the user if we just disconnected WiFi.disconnect(); // ensures disconnect is complete, wifi scan cleared - Serial.println("WiFi disconnected, retrying"); + Log.println("WiFi disconnected, retrying"); warned = true; } WifiSetup(); From 02910285cf78375738fa930b3d5b9ec3399ebdc6 Mon Sep 17 00:00:00 2001 From: Zalgo <80800403+ZalgoSoft@users.noreply.github.com> Date: Fri, 1 Apr 2022 22:27:39 +0800 Subject: [PATCH 04/12] add PTZ gui and some experiments with threading and web logging --- FreeRTOSConfig.h | 323 ++++++++++ css.h | 74 ++- esp32-cam-webserver.ino | 1112 +++++++++++++++++---------------- index_ov2640.h | 1300 ++++++++++++++++++++------------------- storage.cpp | 20 +- 5 files changed, 1638 insertions(+), 1191 deletions(-) create mode 100644 FreeRTOSConfig.h diff --git a/FreeRTOSConfig.h b/FreeRTOSConfig.h new file mode 100644 index 0000000..6bb8189 --- /dev/null +++ b/FreeRTOSConfig.h @@ -0,0 +1,323 @@ +/* + FreeRTOS V10 - Copyright (C) 2021 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +#include "sdkconfig.h" + +/* for likely and unlikely */ +#include "esp_compiler.h" + +// The arch-specific FreeRTOSConfig_arch.h in port//include. +#include "freertos/FreeRTOSConfig_arch.h" + +#if !(defined(FREERTOS_CONFIG_XTENSA_H) \ + || defined(FREERTOS_CONFIG_RISCV_H) \ + || defined(FREERTOS_CONFIG_LINUX_H)) +#error "Needs architecture-speific FreeRTOSConfig.h!" +#endif + +#ifndef CONFIG_FREERTOS_UNICORE +#define portNUM_PROCESSORS 2 +#else +#define portNUM_PROCESSORS 1 +#endif + +#define portUSING_MPU_WRAPPERS 0 +#define configUSE_MUTEX 1 + +#define configNUM_THREAD_LOCAL_STORAGE_POINTERS CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS +#define configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS 1 + +/* configASSERT behaviour */ +#ifndef __ASSEMBLER__ +#include + +// If CONFIG_FREERTOS_ASSERT_DISABLE is set then configASSERT is defined empty later in FreeRTOS.h and the macro +// configASSERT_DEFINED remains unset (meaning some warnings are avoided) + +#if defined(CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE) +#define configASSERT(a) if (unlikely(!(a))) { \ + esp_rom_printf("%s:%d (%s)- assert failed!\n", __FILE__, __LINE__, \ + __FUNCTION__); \ + } +#elif defined(CONFIG_FREERTOS_ASSERT_FAIL_ABORT) +#define configASSERT(a) assert(a) +#endif + +#if CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION +#define UNTESTED_FUNCTION() { esp_rom_printf("Untested FreeRTOS function %s\r\n", __FUNCTION__); configASSERT(false); } while(0) +#else +#define UNTESTED_FUNCTION() +#endif + +#endif /* def __ASSEMBLER__ */ + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * Note that the default heap size is deliberately kept small so that + * the build is more likely to succeed for configurations with limited + * memory. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 1 +#define configUSE_TICK_HOOK 1 +#define configRECORD_STACK_HIGH_ADDRESS 1 +#define configTICK_RATE_HZ ( CONFIG_FREERTOS_HZ ) + +/* This has impact on speed of search for highest priority */ +#define configMAX_PRIORITIES ( 25 ) + +/* Various things that impact minimum stack sizes */ + +/* Higher stack checker modes cause overhead on each function call */ +#if CONFIG_STACK_CHECK_ALL || CONFIG_STACK_CHECK_STRONG +#define configSTACK_OVERHEAD_CHECKER 256 +#else +#define configSTACK_OVERHEAD_CHECKER 0 +#endif + +/* with optimizations disabled, scheduler uses additional stack */ +#if CONFIG_COMPILER_OPTIMIZATION_NONE +#define configSTACK_OVERHEAD_OPTIMIZATION 320 +#else +#define configSTACK_OVERHEAD_OPTIMIZATION 0 +#endif + +/* apptrace mdule increases minimum stack usage */ +#if CONFIG_APPTRACE_ENABLE +#define configSTACK_OVERHEAD_APPTRACE 1280 +#else +#define configSTACK_OVERHEAD_APPTRACE 0 +#endif + +/* Stack watchpoint decreases minimum usable stack size by up to 60 bytes. + See FreeRTOS FREERTOS_WATCHPOINT_END_OF_STACK option in Kconfig. */ +#if CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK +#define configSTACK_OVERHEAD_WATCHPOINT 60 +#else +#define configSTACK_OVERHEAD_WATCHPOINT 0 +#endif + +#define configSTACK_OVERHEAD_TOTAL ( \ + configSTACK_OVERHEAD_CHECKER + \ + configSTACK_OVERHEAD_OPTIMIZATION + \ + configSTACK_OVERHEAD_APPTRACE + \ + configSTACK_OVERHEAD_WATCHPOINT \ + ) + +#define configMINIMAL_STACK_SIZE (768 + configSTACK_OVERHEAD_TOTAL) + +#ifndef configIDLE_TASK_STACK_SIZE +#define configIDLE_TASK_STACK_SIZE CONFIG_FREERTOS_IDLE_TASK_STACKSIZE +#endif + +/* Minimal heap size to make sure examples can run on memory limited + configs. Adjust this to suit your system. */ + + +//We define the heap to span all of the non-statically-allocated shared RAM. ToDo: Make sure there +//is some space left for the app and main cpu when running outside of a thread. +#define configAPPLICATION_ALLOCATED_HEAP 1 +#define configTOTAL_HEAP_SIZE (&_heap_end - &_heap_start)//( ( size_t ) (64 * 1024) ) + +#define configMAX_TASK_NAME_LEN ( CONFIG_FREERTOS_MAX_TASK_NAME_LEN ) + +#ifdef CONFIG_FREERTOS_USE_TRACE_FACILITY +#define configUSE_TRACE_FACILITY 1 /* Used by uxTaskGetSystemState(), and other trace facility functions */ +#endif + +#ifdef CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS +#define configUSE_STATS_FORMATTING_FUNCTIONS 1 /* Used by vTaskList() */ +#endif + +#ifdef CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID +#define configTASKLIST_INCLUDE_COREID 1 +#endif + +#ifdef CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS +#define configGENERATE_RUN_TIME_STATS 1 /* Used by vTaskGetRunTimeStats() */ +#endif + +#define configBENCHMARK 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configQUEUE_REGISTRY_SIZE CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE + +#define configUSE_MUTEXES 1 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configUSE_COUNTING_SEMAPHORES 1 + +#if CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE +#define configCHECK_FOR_STACK_OVERFLOW 0 +#elif CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL +#define configCHECK_FOR_STACK_OVERFLOW 1 +#elif CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY +#define configCHECK_FOR_STACK_OVERFLOW 2 +#endif + + +/* Co-routine definitions. */ +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Set the following definitions to 1 to include the API function, or zero + to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 +#define INCLUDE_pcTaskGetTaskName 1 +#define INCLUDE_xTaskGetIdleTaskHandle 1 +#define INCLUDE_pxTaskGetStackStart 1 +#define INCLUDE_eTaskGetState 1 +#define INCLUDE_xTaskAbortDelay 1 +#define INCLUDE_xTaskGetHandle 1 +#define INCLUDE_xSemaphoreGetMutexHolder 1 +#define INCLUDE_xTimerPendFunctionCall 1 +#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0 //Currently there is no need for this API + +/* The priority at which the tick interrupt runs. This should probably be + kept at 1. */ +#define configKERNEL_INTERRUPT_PRIORITY 1 + +#if !CONFIG_IDF_TARGET_LINUX +#define configUSE_NEWLIB_REENTRANT 1 +#endif + +#define configSUPPORT_DYNAMIC_ALLOCATION 1 +#define configSUPPORT_STATIC_ALLOCATION 1 + +#ifndef __ASSEMBLER__ +#if CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP +extern void vPortCleanUpTCB ( void *pxTCB ); +#define portCLEAN_UP_TCB( pxTCB ) vPortCleanUpTCB( pxTCB ) +#endif +#endif + +/* Test FreeRTOS timers (with timer task) and more. */ +/* Some files don't compile if this flag is disabled */ +#define configUSE_TIMERS 1 +#define configTIMER_TASK_PRIORITY CONFIG_FREERTOS_TIMER_TASK_PRIORITY +#define configTIMER_QUEUE_LENGTH CONFIG_FREERTOS_TIMER_QUEUE_LENGTH +#define configTIMER_TASK_STACK_DEPTH CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH + +#define configUSE_QUEUE_SETS 1 + +#define configUSE_TICKLESS_IDLE CONFIG_FREERTOS_USE_TICKLESS_IDLE +#if configUSE_TICKLESS_IDLE +#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP CONFIG_FREERTOS_IDLE_TIME_BEFORE_SLEEP +#endif //configUSE_TICKLESS_IDLE + + +#if CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT +#define configENABLE_TASK_SNAPSHOT 1 +#endif +#ifndef configENABLE_TASK_SNAPSHOT +#define configENABLE_TASK_SNAPSHOT 0 +#endif + +#if CONFIG_SYSVIEW_ENABLE +#ifndef __ASSEMBLER__ +#include "SEGGER_SYSVIEW_FreeRTOS.h" +#undef INLINE // to avoid redefinition +#endif /* def __ASSEMBLER__ */ +#endif + +#if CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER +#define configCHECK_MUTEX_GIVEN_BY_OWNER 1 +#else +#define configCHECK_MUTEX_GIVEN_BY_OWNER 0 +#endif + + +#define configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H 1 + +#define configTASK_NOTIFICATION_ARRAY_ENTRIES 1 + +// backward compatibility for 4.4 +#define xTaskRemoveFromUnorderedEventList vTaskRemoveFromUnorderedEventList + +#define configNUM_CORES portNUM_PROCESSORS + +#endif /* FREERTOS_CONFIG_H */ diff --git a/css.h b/css.h index 66a0deb..bc27f85 100644 --- a/css.h +++ b/css.h @@ -2,12 +2,8 @@ * Master CSS file for the camera pages */ -const uint8_t style_css[] = R"=====(/* - * CSS for the esp32 cam webserver - */ - -body { - font-family: Arial,Helvetica,sans-serif; +const uint8_t style_css[] = R"=====(body { + font-family: Arial, Helvetica, sans-serif; background: #181818; color: #EFEFEF; font-size: 16px @@ -26,7 +22,8 @@ section.main { display: flex } -#menu,section.main { +#menu, +section.main { flex-direction: column } @@ -89,7 +86,7 @@ section#buttons { } #quality { - transform: rotateY(180deg); + transform: rotateY(180deg); } .input-group { @@ -105,11 +102,13 @@ section#buttons { min-width: 47% } -.input-group input,.input-group select { +.input-group input, +.input-group select { flex-grow: 1 } -.range-max,.range-min { +.range-max, +.range-min { display: inline-block; padding: 0 5px } @@ -164,7 +163,7 @@ input[type=range]::-webkit-slider-runnable-track { } input[type=range]::-webkit-slider-thumb { - border: 1px solid rgba(0,0,30,0); + border: 1px solid rgba(0, 0, 30, 0); height: 22px; width: 22px; border-radius: 50px; @@ -188,7 +187,7 @@ input[type=range]::-moz-range-track { } input[type=range]::-moz-range-thumb { - border: 1px solid rgba(0,0,30,0); + border: 1px solid rgba(0, 0, 30, 0); height: 22px; width: 22px; border-radius: 50px; @@ -218,7 +217,7 @@ input[type=range]::-ms-fill-upper { } input[type=range]::-ms-thumb { - border: 1px solid rgba(0,0,30,0); + border: 1px solid rgba(0, 0, 30, 0); height: 22px; width: 22px; border-radius: 50px; @@ -267,7 +266,8 @@ input[type=text] { background-color: grey } -.slider,.slider:before { +.slider, +.slider:before { display: inline-block; transition: .4s } @@ -345,23 +345,57 @@ select { } .loader { - border: 0.5em solid #f3f3f3; /* Light grey */ - border-top: 0.5em solid #000000; /* white */ + border: 0.5em solid #f3f3f3; + /* Light grey */ + border-top: 0.5em solid #000000; + /* white */ border-radius: 50%; width: 1em; height: 1em; - -webkit-animation: spin 2s linear infinite; /* Safari */ + -webkit-animation: spin 2s linear infinite; /* Safari */ animation: spin 2s linear infinite; } -@-webkit-keyframes spin { /* Safari */ - 0% { -webkit-transform: rotate(0deg); } - 100% { -webkit-transform: rotate(360deg); } +@-webkit-keyframes spin { /* Safari */ + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); } } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } +} + +#ptz-group { + justify-content: right; +} + +#controls { + display: inline-grid; +} + +#ptzup { + grid-column-start: 2; +} + +#ptzleft { + grid-column-start: 1; +} + +#ptzright { + grid-column-start: 3; +} + +#ptzdown { + grid-column-start: 2; +} + +.halfie, +#ptz_x, +#ptz_y, +#servo1_pin, +#servo2_pin { + width: 5% })====="; size_t style_css_len = sizeof(style_css)-1; diff --git a/esp32-cam-webserver.ino b/esp32-cam-webserver.ino index 62ac9db..a576be4 100644 --- a/esp32-cam-webserver.ino +++ b/esp32-cam-webserver.ino @@ -11,48 +11,58 @@ #include +char *pcwriteBuffer[2048]; + /* This sketch is a extension/expansion/reork of the 'official' ESP32 Camera example - * sketch from Expressif: - * https://github.com/espressif/arduino-esp32/tree/master/libraries/ESP32/examples/Camera/CameraWebServer - * - * It is modified to allow control of Illumination LED Lamps's (present on some modules), - * greater feedback via a status LED, and the HTML contents are present in plain text - * for easy modification. - * - * A camera name can now be configured, and wifi details can be stored in an optional - * header file to allow easier updated of the repo. - * - * The web UI has had changes to add the lamp control, rotation, a standalone viewer, - * more feeedback, new controls and other tweaks and changes, - * note: Make sure that you have either selected ESP32 AI Thinker, - * or another board which has PSRAM enabled to use high resolution camera modes - */ + sketch from Expressif: + https://github.com/espressif/arduino-esp32/tree/master/libraries/ESP32/examples/Camera/CameraWebServer + + It is modified to allow control of Illumination LED Lamps's (present on some modules), + greater feedback via a status LED, and the HTML contents are present in plain text + for easy modification. + + A camera name can now be configured, and wifi details can be stored in an optional + header file to allow easier updated of the repo. + + The web UI has had changes to add the lamp control, rotation, a standalone viewer, + more feeedback, new controls and other tweaks and changes, + note: Make sure that you have either selected ESP32 AI Thinker, + or another board which has PSRAM enabled to use high resolution camera modes +*/ /* - * FOR NETWORK AND HARDWARE SETTINGS COPY OR RENAME 'myconfig.sample.h' TO 'myconfig.h' AND EDIT THAT. - * - * By default this sketch will assume an AI-THINKER ESP-CAM and create - * an accesspoint called "ESP32-CAM-CONNECT" (password: "InsecurePassword") - * - */ + FOR NETWORK AND HARDWARE SETTINGS COPY OR RENAME 'myconfig.sample.h' TO 'myconfig.h' AND EDIT THAT. + + By default this sketch will assume an AI-THINKER ESP-CAM and create + an accesspoint called "ESP32-CAM-CONNECT" (password: "InsecurePassword") + +*/ // Primary config, or defaults. #if __has_include("myconfig.h") - struct station { const char ssid[65]; const char password[65]; const bool dhcp;}; // do no edit - #include "myconfig.h" +struct station { + const char ssid[65]; + const char password[65]; + const bool dhcp; +}; // do no edit +#include "myconfig.h" #else - #warning "Using Defaults: Copy myconfig.sample.h to myconfig.h and edit that to use your own settings" - #define WIFI_AP_ENABLE - #define CAMERA_MODEL_AI_THINKER - struct station { const char ssid[65]; const char password[65]; const bool dhcp;} - stationList[] = {{"ESP32-CAM-CONNECT","InsecurePassword", true}}; +#warning "Using Defaults: Copy myconfig.sample.h to myconfig.h and edit that to use your own settings" +#define WIFI_AP_ENABLE +#define CAMERA_MODEL_AI_THINKER +struct station { + const char ssid[65]; + const char password[65]; + const bool dhcp; +} +stationList[] = {{"ESP32-CAM-CONNECT", "InsecurePassword", true}}; #endif #include // The T-Logging library. #include -WebSerialStream webSerialStream = WebSerialStream(8514); -TaskHandle_t Task1Handle; +WebSerialStream webSerialStream = WebSerialStream(8514); +TaskHandle_t TaskCore0Handle; // Upstream version string #include "src/version.h" @@ -66,14 +76,14 @@ camera_config_t config; // used for non-volatile camera settings #include "storage.h" -#define SERVO_1 14 -#define SERVO_2 15 -#define SERVO_STEP 5 Servo servo1; Servo servo2; +int Servo1Pin = 14; +int Servo2Pin = 15; +int Servo_Step = 5; int ptz_y = 64; int ptz_x = 64; -//ESP32PWM pwm; + // Sketch Info int sketchSize; int sketchSpace; @@ -94,49 +104,49 @@ extern void serialDump(); // Names for the Camera. (set these in myconfig.h) #if defined(CAM_NAME) - char myName[] = CAM_NAME; +char myName[] = CAM_NAME; #else - char myName[] = "ESP32 camera server"; +char myName[] = "ESP32 camera server"; #endif #if defined(MDNS_NAME) - char mdnsName[] = MDNS_NAME; +char mdnsName[] = MDNS_NAME; #else - char mdnsName[] = "esp32-cam"; +char mdnsName[] = "esp32-cam"; #endif // Ports for http and stream (override in myconfig.h) #if defined(HTTP_PORT) - int httpPort = HTTP_PORT; +int httpPort = HTTP_PORT; #else - int httpPort = 80; +int httpPort = 80; #endif #if defined(STREAM_PORT) - int streamPort = STREAM_PORT; +int streamPort = STREAM_PORT; #else - int streamPort = 81; +int streamPort = 81; #endif #if !defined(WIFI_WATCHDOG) - #define WIFI_WATCHDOG 15000 +#define WIFI_WATCHDOG 15000 #endif // Number of known networks in stationList[] -int stationCount = sizeof(stationList)/sizeof(stationList[0]); +int stationCount = sizeof(stationList) / sizeof(stationList[0]); // If we have AP mode enabled, ignore first entry in the stationList[] #if defined(WIFI_AP_ENABLE) - int firstStation = 1; +int firstStation = 1; #else - int firstStation = 0; +int firstStation = 0; #endif // Select between full and simple index as the default. #if defined(DEFAULT_INDEX_FULL) - char default_index[] = "full"; +char default_index[] = "full"; #else - char default_index[] = "simple"; +char default_index[] = "simple"; #endif // DNS server @@ -165,39 +175,39 @@ int sensorPID; // Originally: config.xclk_freq_mhz = 20000000, but this lead to visual artifacts on many modules. // See https://github.com/espressif/esp32-camera/issues/150#issuecomment-726473652 et al. #if !defined (XCLK_FREQ_MHZ) - unsigned long xclk = 8; +unsigned long xclk = 8; #else - unsigned long xclk = XCLK_FREQ_MHZ; +unsigned long xclk = XCLK_FREQ_MHZ; #endif // initial rotation // can be set in myconfig.h #if !defined(CAM_ROTATION) - #define CAM_ROTATION 0 +#define CAM_ROTATION 0 #endif int myRotation = CAM_ROTATION; // minimal frame duration in ms, effectively 1/maxFPS #if !defined(MIN_FRAME_TIME) - #define MIN_FRAME_TIME 0 +#define MIN_FRAME_TIME 0 #endif int minFrameTime = MIN_FRAME_TIME; // Illumination LAMP and status LED #if defined(LAMP_DISABLE) - int lampVal = -1; // lamp is disabled in config +int lampVal = -1; // lamp is disabled in config #elif defined(LAMP_PIN) - #if defined(LAMP_DEFAULT) - int lampVal = constrain(LAMP_DEFAULT,0,100); // initial lamp value, range 0-100 - #else - int lampVal = 0; //default to off - #endif +#if defined(LAMP_DEFAULT) +int lampVal = constrain(LAMP_DEFAULT, 0, 100); // initial lamp value, range 0-100 +#else +int lampVal = 0; //default to off +#endif #else - int lampVal = -1; // no lamp pin assigned +int lampVal = -1; // no lamp pin assigned #endif #if defined(LED_DISABLE) - #undef LED_PIN // undefining this disables the notification LED +#undef LED_PIN // undefining this disables the notification LED #endif bool autoLamp = false; // Automatic lamp (auto on while camera running) @@ -205,36 +215,36 @@ bool autoLamp = false; // Automatic lamp (auto on while camera running) int lampChannel = 7; // a free PWM channel (some channels used by camera) const int pwmfreq = 50000; // 50K pwm frequency const int pwmresolution = 9; // duty cycle bit range -const int pwmMax = pow(2,pwmresolution)-1; +const int pwmMax = pow(2, pwmresolution) - 1; #if defined(NO_FS) - bool filesystem = false; +bool filesystem = false; #else - bool filesystem = true; +bool filesystem = true; #endif #if defined(NO_OTA) - bool otaEnabled = false; +bool otaEnabled = false; #else - bool otaEnabled = true; +bool otaEnabled = true; #endif #if defined(OTA_PASSWORD) - char otaPassword[] = OTA_PASSWORD; +char otaPassword[] = OTA_PASSWORD; #else - char otaPassword[] = ""; +char otaPassword[] = ""; #endif #if defined(NTPSERVER) - bool haveTime = true; - const char* ntpServer = NTPSERVER; - const long gmtOffset_sec = NTP_GMT_OFFSET; - const int daylightOffset_sec = NTP_DST_OFFSET; +bool haveTime = true; +const char* ntpServer = NTPSERVER; +const long gmtOffset_sec = NTP_GMT_OFFSET; +const int daylightOffset_sec = NTP_DST_OFFSET; #else - bool haveTime = false; - const char* ntpServer = ""; - const long gmtOffset_sec = 0; - const int daylightOffset_sec = 0; +bool haveTime = false; +const char* ntpServer = ""; +const long gmtOffset_sec = 0; +const int daylightOffset_sec = 0; #endif // Critical error string; if set during init (camera hardware failure) it @@ -245,31 +255,56 @@ String critERR = ""; bool debugData; void debugOn() { - debugData = true; - Log.println("Camera debug data is enabled (send 'd' for status dump, or any other char to disable debug)"); + debugData = true; + Log.println("Camera debug data is enabled (send 'd' for status dump, or any other char to disable debug)"); } void debugOff() { - debugData = false; - Log.println("Camera debug data is disabled (send 'd' for status dump, or any other char to enable debug)"); + debugData = false; + Log.println("Camera debug data is disabled (send 'd' for status dump, or any other char to enable debug)"); } +TaskHandle_t xHandle; // Serial input (debugging controls) void handleSerial() { - if (Serial.available()) { - char cmd = Serial.read(); - if (cmd == 'd' ) { - serialDump(); - } else { - if (debugData) debugOff(); - else debugOn(); - } + if (Serial.available()) { + char cmd = Serial.read(); + if (cmd == 'd' ) { + serialDump(); + } else if (cmd == 'i' ) { + Log.print("TaskCore0 start CPU "); + Log.println(xPortGetCoreID()); + } +/* else if (cmd == 'a' ) { + Log.println("incPrio()"); + xHandle = xTaskGetCurrentTaskHandle(); + Log.println(uxTaskPriorityGet( xHandle )); + vTaskPrioritySet( xHandle , uxTaskPriorityGet( xHandle) +1); + Log.println(uxTaskPriorityGet( xHandle )); + } + else if (cmd == 'z' ) { + Log.println("decPrio()"); + xHandle = xTaskGetCurrentTaskHandle(); + Log.println(uxTaskPriorityGet( xHandle )); + vTaskPrioritySet( xHandle , uxTaskPriorityGet( xHandle) -1); + Log.println(uxTaskPriorityGet( xHandle )); + } + else if (cmd == 'l' ) { + Log.println("listtasks()"); + Log.println( "Task Name\tStatus\tPrio\tHWM\tTask\tAffinity\n"); + vTaskList(&pcwriteBuffer); + Log.println( pcwriteBuffer); + }*/ + else { + if (debugData) debugOff(); + else debugOn(); + } } while (Serial.available()) Serial.read(); // chomp the buffer -} + } -// Notification LED -void flashLED(int flashtime) { + // Notification LED + void flashLED(int flashtime) { #if defined(LED_PIN) // If we have it; flash it. digitalWrite(LED_PIN, LED_ON); // On at full power. delay(flashtime); // delay @@ -277,89 +312,94 @@ void flashLED(int flashtime) { #else return; // No notifcation LED, do nothing, no delay #endif -} + } -// Lamp Control -void setLamp(int newVal) { + // Lamp Control + void setLamp(int newVal) { #if defined(LAMP_PIN) if (newVal != -1) { - // Apply a logarithmic function to the scale. - int brightness = round((pow(2,(1+(newVal*0.02)))-2)/6*pwmMax); - ledcWrite(lampChannel, brightness); - Log.print("Lamp: "); - Log.print(newVal); - Log.print("%, pwm = "); - Log.println(brightness); + // Apply a logarithmic function to the scale. + int brightness = round((pow(2, (1 + (newVal * 0.02))) - 2) / 6 * pwmMax); + ledcWrite(lampChannel, brightness); + Log.print("Lamp: "); + Log.print(newVal); + Log.print("%, pwm = "); + Log.println(brightness); } #endif -} + } -void printLocalTime(bool extraData=false) { + void printLocalTime(bool extraData = false) { struct tm timeinfo; - if(!getLocalTime(&timeinfo)){ - Log.println("Failed to obtain time"); + if (!getLocalTime(&timeinfo)) { + Log.println("Failed to obtain time"); } else { - Log.println(&timeinfo, "%H:%M:%S, %A, %B %d %Y"); + Log.println(&timeinfo, "%H:%M:%S, %A, %B %d %Y"); } if (extraData) { - Log.printf("NTP Server: %s, GMT Offset: %li(s), DST Offset: %i(s)\r\n", ntpServer, gmtOffset_sec, daylightOffset_sec); + Log.printf("NTP Server: %s, GMT Offset: %li(s), DST Offset: %i(s)\r\n", ntpServer, gmtOffset_sec, daylightOffset_sec); } -} + } -void Task1Core0 (void * pvParameters ){ - Log.print("Task1Core0 start CPU "); - Log.println(xPortGetCoreID()); - // Start the camera server + void TaskCore0 (void * pvParameters ) { + Log.print("TaskCore0 start CPU "); + Log.println(xPortGetCoreID()); + // Start the camera server startCameraServer(httpPort, streamPort); if (critERR.length() == 0) { - Log.printf("\r\nCamera Ready!\r\nUse '%s' to connect\r\n", httpURL); - Log.printf("Stream viewer available at '%sview'\r\n", streamURL); - Log.printf("Raw stream URL is '%s'\r\n", streamURL); - #if defined(DEBUG_DEFAULT_ON) - debugOn(); - #else - debugOff(); - #endif + Log.printf("\r\nCamera Ready!\r\nUse '%s' to connect\r\n", httpURL); + Log.printf("Stream viewer available at '%sview'\r\n", streamURL); + Log.printf("Raw stream URL is '%s'\r\n", streamURL); +#if defined(DEBUG_DEFAULT_ON) + debugOn(); +#else + debugOff(); +#endif } else { - Log.printf("\r\nCamera unavailable due to initialisation errors.\r\n\r\n"); + Log.printf("\r\nCamera unavailable due to initialisation errors.\r\n\r\n"); } // Info line; use for Info messages; eg 'This is a Beta!' warnings, etc. as necesscary Log.print("\r\nThis is the 4.1 beta\r\n"); - // do something every 5 seconds. - static unsigned long last_report = millis(); - for (;;) { - Log.loop(); - if (millis() - last_report < 8 * 1000) - {} - else { - Log.print (millis()); - Log.print(" CPU "); Log.println(xPortGetCoreID()); - last_report = millis(); - } + // do something every 5 seconds. + static unsigned long last_report = millis(); + for (;;) { + Log.loop(); + if (millis() - last_report < 8 * 1000) + { + vApplicationMinimalIdleHook( ); + } + else { + //Log.print (millis()); + //Log.print(" CPU "); Log.println(xPortGetCoreID()); + last_report = millis(); + vTaskGetRunTimeStats( char *pcWriteBuffer ); + + vApplicationMinimalIdleHook( ); + } + } } -} -void calcURLs() { + void calcURLs() { // Set the URL's - #if defined(URL_HOSTNAME) - if (httpPort != 80) { - sprintf(httpURL, "http://%s:%d/", URL_HOSTNAME, httpPort); - } else { - sprintf(httpURL, "http://%s/", URL_HOSTNAME); - } - sprintf(streamURL, "http://%s:%d/", URL_HOSTNAME, streamPort); - #else - Log.println("Setting httpURL"); - if (httpPort != 80) { - sprintf(httpURL, "http://%d.%d.%d.%d:%d/", ip[0], ip[1], ip[2], ip[3], httpPort); - } else { - sprintf(httpURL, "http://%d.%d.%d.%d/", ip[0], ip[1], ip[2], ip[3]); - } - sprintf(streamURL, "http://%d.%d.%d.%d:%d/", ip[0], ip[1], ip[2], ip[3], streamPort); - #endif -} +#if defined(URL_HOSTNAME) + if (httpPort != 80) { + sprintf(httpURL, "http://%s:%d/", URL_HOSTNAME, httpPort); + } else { + sprintf(httpURL, "http://%s/", URL_HOSTNAME); + } + sprintf(streamURL, "http://%s:%d/", URL_HOSTNAME, streamPort); +#else + Log.println("Setting httpURL"); + if (httpPort != 80) { + sprintf(httpURL, "http://%d.%d.%d.%d:%d/", ip[0], ip[1], ip[2], ip[3], httpPort); + } else { + sprintf(httpURL, "http://%d.%d.%d.%d/", ip[0], ip[1], ip[2], ip[3]); + } + sprintf(streamURL, "http://%d.%d.%d.%d:%d/", ip[0], ip[1], ip[2], ip[3], streamPort); +#endif + } -void StartCamera() { + void StartCamera() { Log.print("StartCamera CPU "); Log.println(xPortGetCoreID()); // Populate camera config structure with hardware and other defaults @@ -385,120 +425,120 @@ void StartCamera() { config.pixel_format = PIXFORMAT_JPEG; config.grab_mode = CAMERA_GRAB_LATEST; // Pre-allocate large buffers - if(psramFound()){ - config.frame_size = FRAMESIZE_UXGA; - config.jpeg_quality = 10; - config.fb_count = 2; + if (psramFound()) { + config.frame_size = FRAMESIZE_UXGA; + config.jpeg_quality = 10; + config.fb_count = 2; } else { - config.frame_size = FRAMESIZE_SVGA; - config.jpeg_quality = 12; - config.fb_count = 1; + config.frame_size = FRAMESIZE_SVGA; + config.jpeg_quality = 12; + config.fb_count = 1; } - #if defined(CAMERA_MODEL_ESP_EYE) - pinMode(13, INPUT_PULLUP); - pinMode(14, INPUT_PULLUP); - #endif +#if defined(CAMERA_MODEL_ESP_EYE) + pinMode(13, INPUT_PULLUP); + pinMode(14, INPUT_PULLUP); +#endif // camera init esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { - delay(100); // need a delay here or the next serial o/p gets missed - Log.printf("\r\n\r\nCRITICAL FAILURE: Camera sensor failed to initialise.\r\n\r\n"); - Log.printf("A full (hard, power off/on) reboot will probably be needed to recover from this.\r\n"); - Log.printf("Meanwhile; this unit will reboot in 1 minute since these errors sometime clear automatically\r\n"); - // Reset the I2C bus.. may help when rebooting. - periph_module_disable(PERIPH_I2C0_MODULE); // try to shut I2C down properly in case that is the problem - periph_module_disable(PERIPH_I2C1_MODULE); - periph_module_reset(PERIPH_I2C0_MODULE); - periph_module_reset(PERIPH_I2C1_MODULE); - // And set the error text for the UI - critERR = "

Error!


Camera module failed to initialise!

Please reset (power off/on) the camera.

"; - critERR += "

We will continue to reboot once per minute since this error sometimes clears automatically.

"; - // Start a 60 second watchdog timer - esp_task_wdt_init(60,true); - esp_task_wdt_add(NULL); + delay(100); // need a delay here or the next serial o/p gets missed + Log.printf("\r\n\r\nCRITICAL FAILURE: Camera sensor failed to initialise.\r\n\r\n"); + Log.printf("A full (hard, power off/on) reboot will probably be needed to recover from this.\r\n"); + Log.printf("Meanwhile; this unit will reboot in 1 minute since these errors sometime clear automatically\r\n"); + // Reset the I2C bus.. may help when rebooting. + periph_module_disable(PERIPH_I2C0_MODULE); // try to shut I2C down properly in case that is the problem + periph_module_disable(PERIPH_I2C1_MODULE); + periph_module_reset(PERIPH_I2C0_MODULE); + periph_module_reset(PERIPH_I2C1_MODULE); + // And set the error text for the UI + critERR = "

Error!


Camera module failed to initialise!

Please reset (power off/on) the camera.

"; + critERR += "

We will continue to reboot once per minute since this error sometimes clears automatically.

"; + // Start a 60 second watchdog timer + esp_task_wdt_init(60, true); + esp_task_wdt_add(NULL); } else { - Log.println("Camera init succeeded"); - - // Get a reference to the sensor - sensor_t * s = esp_camera_sensor_get(); - - // Dump camera module, warn for unsupported modules. - sensorPID = s->id.PID; - switch (sensorPID) { - case OV9650_PID: Log.println("WARNING: OV9650 camera module is not properly supported, will fallback to OV2640 operation"); break; - case OV7725_PID: Log.println("WARNING: OV7725 camera module is not properly supported, will fallback to OV2640 operation"); break; - case OV2640_PID: Log.println("OV2640 camera module detected"); break; - case OV3660_PID: Log.println("OV3660 camera module detected"); break; - default: Log.println("WARNING: Camera module is unknown and not properly supported, will fallback to OV2640 operation"); - } + Log.println("Camera init succeeded"); + + // Get a reference to the sensor + sensor_t * s = esp_camera_sensor_get(); + + // Dump camera module, warn for unsupported modules. + sensorPID = s->id.PID; + switch (sensorPID) { + case OV9650_PID: Log.println("WARNING: OV9650 camera module is not properly supported, will fallback to OV2640 operation"); break; + case OV7725_PID: Log.println("WARNING: OV7725 camera module is not properly supported, will fallback to OV2640 operation"); break; + case OV2640_PID: Log.println("OV2640 camera module detected"); break; + case OV3660_PID: Log.println("OV3660 camera module detected"); break; + default: Log.println("WARNING: Camera module is unknown and not properly supported, will fallback to OV2640 operation"); + } + + // OV3660 initial sensors are flipped vertically and colors are a bit saturated + if (sensorPID == OV3660_PID) { + s->set_vflip(s, 1); //flip it back + s->set_brightness(s, 1); //up the blightness just a bit + s->set_saturation(s, -2); //lower the saturation + } + + // M5 Stack Wide has special needs +#if defined(CAMERA_MODEL_M5STACK_WIDE) + s->set_vflip(s, 1); + s->set_hmirror(s, 1); +#endif - // OV3660 initial sensors are flipped vertically and colors are a bit saturated - if (sensorPID == OV3660_PID) { - s->set_vflip(s, 1); //flip it back - s->set_brightness(s, 1); //up the blightness just a bit - s->set_saturation(s, -2); //lower the saturation - } + // Config can override mirror and flip +#if defined(H_MIRROR) + s->set_hmirror(s, H_MIRROR); +#endif +#if defined(V_FLIP) + s->set_vflip(s, V_FLIP); +#endif + + // set initial frame rate +#if defined(DEFAULT_RESOLUTION) + s->set_framesize(s, DEFAULT_RESOLUTION); +#else + s->set_framesize(s, FRAMESIZE_SVGA); +#endif - // M5 Stack Wide has special needs - #if defined(CAMERA_MODEL_M5STACK_WIDE) - s->set_vflip(s, 1); - s->set_hmirror(s, 1); - #endif - - // Config can override mirror and flip - #if defined(H_MIRROR) - s->set_hmirror(s, H_MIRROR); - #endif - #if defined(V_FLIP) - s->set_vflip(s, V_FLIP); - #endif - - // set initial frame rate - #if defined(DEFAULT_RESOLUTION) - s->set_framesize(s, DEFAULT_RESOLUTION); - #else - s->set_framesize(s, FRAMESIZE_SVGA); - #endif - - /* - * Add any other defaults you want to apply at startup here: - * uncomment the line and set the value as desired (see the comments) - * - * these are defined in the esp headers here: - * https://github.com/espressif/esp32-camera/blob/master/driver/include/sensor.h#L149 - */ - - //s->set_framesize(s, FRAMESIZE_SVGA); // FRAMESIZE_[QQVGA|HQVGA|QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA|QXGA(ov3660)]); - //s->set_quality(s, val); // 10 to 63 - //s->set_brightness(s, 0); // -2 to 2 - //s->set_contrast(s, 0); // -2 to 2 - //s->set_saturation(s, 0); // -2 to 2 - //s->set_special_effect(s, 0); // 0 to 6 (0 - No Effect, 1 - Negative, 2 - Grayscale, 3 - Red Tint, 4 - Green Tint, 5 - Blue Tint, 6 - Sepia) - //s->set_whitebal(s, 1); // aka 'awb' in the UI; 0 = disable , 1 = enable - //s->set_awb_gain(s, 1); // 0 = disable , 1 = enable - //s->set_wb_mode(s, 0); // 0 to 4 - if awb_gain enabled (0 - Auto, 1 - Sunny, 2 - Cloudy, 3 - Office, 4 - Home) - //s->set_exposure_ctrl(s, 1); // 0 = disable , 1 = enable - //s->set_aec2(s, 0); // 0 = disable , 1 = enable - //s->set_ae_level(s, 0); // -2 to 2 - //s->set_aec_value(s, 300); // 0 to 1200 - //s->set_gain_ctrl(s, 1); // 0 = disable , 1 = enable - //s->set_agc_gain(s, 0); // 0 to 30 - //s->set_gainceiling(s, (gainceiling_t)0); // 0 to 6 - //s->set_bpc(s, 0); // 0 = disable , 1 = enable - //s->set_wpc(s, 1); // 0 = disable , 1 = enable - //s->set_raw_gma(s, 1); // 0 = disable , 1 = enable - //s->set_lenc(s, 1); // 0 = disable , 1 = enable - //s->set_hmirror(s, 0); // 0 = disable , 1 = enable - //s->set_vflip(s, 0); // 0 = disable , 1 = enable - //s->set_dcw(s, 1); // 0 = disable , 1 = enable - //s->set_colorbar(s, 0); // 0 = disable , 1 = enable + /* + Add any other defaults you want to apply at startup here: + uncomment the line and set the value as desired (see the comments) + + these are defined in the esp headers here: + https://github.com/espressif/esp32-camera/blob/master/driver/include/sensor.h#L149 + */ + + //s->set_framesize(s, FRAMESIZE_SVGA); // FRAMESIZE_[QQVGA|HQVGA|QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA|QXGA(ov3660)]); + //s->set_quality(s, val); // 10 to 63 + //s->set_brightness(s, 0); // -2 to 2 + //s->set_contrast(s, 0); // -2 to 2 + //s->set_saturation(s, 0); // -2 to 2 + //s->set_special_effect(s, 0); // 0 to 6 (0 - No Effect, 1 - Negative, 2 - Grayscale, 3 - Red Tint, 4 - Green Tint, 5 - Blue Tint, 6 - Sepia) + //s->set_whitebal(s, 1); // aka 'awb' in the UI; 0 = disable , 1 = enable + //s->set_awb_gain(s, 1); // 0 = disable , 1 = enable + //s->set_wb_mode(s, 0); // 0 to 4 - if awb_gain enabled (0 - Auto, 1 - Sunny, 2 - Cloudy, 3 - Office, 4 - Home) + //s->set_exposure_ctrl(s, 1); // 0 = disable , 1 = enable + //s->set_aec2(s, 0); // 0 = disable , 1 = enable + //s->set_ae_level(s, 0); // -2 to 2 + //s->set_aec_value(s, 300); // 0 to 1200 + //s->set_gain_ctrl(s, 1); // 0 = disable , 1 = enable + //s->set_agc_gain(s, 0); // 0 to 30 + //s->set_gainceiling(s, (gainceiling_t)0); // 0 to 6 + //s->set_bpc(s, 0); // 0 = disable , 1 = enable + //s->set_wpc(s, 1); // 0 = disable , 1 = enable + //s->set_raw_gma(s, 1); // 0 = disable , 1 = enable + //s->set_lenc(s, 1); // 0 = disable , 1 = enable + //s->set_hmirror(s, 0); // 0 = disable , 1 = enable + //s->set_vflip(s, 0); // 0 = disable , 1 = enable + //s->set_dcw(s, 1); // 0 = disable , 1 = enable + //s->set_colorbar(s, 0); // 0 = disable , 1 = enable } // We now have camera with default init -} + } -void WifiSetup() { + void WifiSetup() { // Feedback that we are now attempting to connect flashLED(300); delay(100); @@ -511,12 +551,12 @@ void WifiSetup() { Log.print("Known external SSIDs: "); if (stationCount > firstStation) { - for (int i=firstStation; i < stationCount; i++) Log.printf(" '%s'", stationList[i].ssid); + for (int i = firstStation; i < stationCount; i++) Log.printf(" '%s'", stationList[i].ssid); } else { - Log.print("None"); + Log.print("None"); } Log.println(); - byte mac[6] = {0,0,0,0,0,0}; + byte mac[6] = {0, 0, 0, 0, 0, 0}; WiFi.macAddress(mac); Log.printf("MAC address: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); @@ -525,180 +565,181 @@ void WifiSetup() { char bestSSID[65] = ""; uint8_t bestBSSID[6]; if (stationCount > firstStation) { - // We have a list to scan - Log.printf("Scanning local Wifi Networks\r\n"); - int stationsFound = WiFi.scanNetworks(); - Log.printf("%i networks found\r\n", stationsFound); - if (stationsFound > 0) { - for (int i = 0; i < stationsFound; ++i) { - // Print SSID and RSSI for each network found - String thisSSID = WiFi.SSID(i); - int thisRSSI = WiFi.RSSI(i); - String thisBSSID = WiFi.BSSIDstr(i); - Log.printf("%3i : [%s] %s (%i)", i + 1, thisBSSID.c_str(), thisSSID.c_str(), thisRSSI); - // Scan our list of known external stations - for (int sta = firstStation; sta < stationCount; sta++) { - if ((strcmp(stationList[sta].ssid, thisSSID.c_str()) == 0) || - (strcmp(stationList[sta].ssid, thisBSSID.c_str()) == 0)) { - Log.print(" - Known!"); - // Chose the strongest RSSI seen - if (thisRSSI > bestRSSI) { - bestStation = sta; - strncpy(bestSSID, thisSSID.c_str(), 64); - // Convert char bssid[] to a byte array - parseBytes(thisBSSID.c_str(), ':', bestBSSID, 6, 16); - bestRSSI = thisRSSI; - } - } - } - Log.println(); + // We have a list to scan + Log.printf("Scanning local Wifi Networks\r\n"); + int stationsFound = WiFi.scanNetworks(); + Log.printf("%i networks found\r\n", stationsFound); + if (stationsFound > 0) { + for (int i = 0; i < stationsFound; ++i) { + // Print SSID and RSSI for each network found + String thisSSID = WiFi.SSID(i); + int thisRSSI = WiFi.RSSI(i); + String thisBSSID = WiFi.BSSIDstr(i); + Log.printf("%3i : [%s] %s (%i)", i + 1, thisBSSID.c_str(), thisSSID.c_str(), thisRSSI); + // Scan our list of known external stations + for (int sta = firstStation; sta < stationCount; sta++) { + if ((strcmp(stationList[sta].ssid, thisSSID.c_str()) == 0) || + (strcmp(stationList[sta].ssid, thisBSSID.c_str()) == 0)) { + Log.print(" - Known!"); + // Chose the strongest RSSI seen + if (thisRSSI > bestRSSI) { + bestStation = sta; + strncpy(bestSSID, thisSSID.c_str(), 64); + // Convert char bssid[] to a byte array + parseBytes(thisBSSID.c_str(), ':', bestBSSID, 6, 16); + bestRSSI = thisRSSI; + } } + } + Log.println(); } + } } else { - // No list to scan, therefore we are an accesspoint - accesspoint = true; + // No list to scan, therefore we are an accesspoint + accesspoint = true; } if (bestStation == -1) { - if (!accesspoint) { - #if defined(WIFI_AP_ENABLE) - Log.println("No known networks found, entering AccessPoint fallback mode"); - accesspoint = true; - #else - Log.println("No known networks found"); - #endif - } else { - Log.println("AccessPoint mode selected in config"); - } + if (!accesspoint) { +#if defined(WIFI_AP_ENABLE) + Log.println("No known networks found, entering AccessPoint fallback mode"); + accesspoint = true; +#else + Log.println("No known networks found"); +#endif + } else { + Log.println("AccessPoint mode selected in config"); + } } else { - Log.printf("Connecting to Wifi Network %d: [%02X:%02X:%02X:%02X:%02X:%02X] %s \r\n", - bestStation, bestBSSID[0], bestBSSID[1], bestBSSID[2], bestBSSID[3], - bestBSSID[4], bestBSSID[5], bestSSID); - // Apply static settings if necesscary - if (stationList[bestStation].dhcp == false) { - #if defined(ST_IP) - Log.println("Applying static IP settings"); - #if !defined (ST_GATEWAY) || !defined (ST_NETMASK) - #error "You must supply both Gateway and NetMask when specifying a static IP address" - #endif - IPAddress staticIP(ST_IP); - IPAddress gateway(ST_GATEWAY); - IPAddress subnet(ST_NETMASK); - #if !defined(ST_DNS1) - WiFi.config(staticIP, gateway, subnet); - #else - IPAddress dns1(ST_DNS1); - #if !defined(ST_DNS2) - WiFi.config(staticIP, gateway, subnet, dns1); - #else - IPAddress dns2(ST_DNS2); - WiFi.config(staticIP, gateway, subnet, dns1, dns2); - #endif - #endif - #else - Log.println("Static IP settings requested but not defined in config, falling back to dhcp"); - #endif - } - - WiFi.setHostname(mdnsName); - - // Initiate network connection request (3rd argument, channel = 0 is 'auto') - WiFi.begin(bestSSID, stationList[bestStation].password, 0, bestBSSID); - - // Wait to connect, or timeout - unsigned long start = millis(); - while ((millis() - start <= WIFI_WATCHDOG) && (WiFi.status() != WL_CONNECTED)) { - delay(500); - Log.print('.'); - } - Log.begin(); - // If we have connected, inform user - if (WiFi.status() == WL_CONNECTED) { - Log.println("Client connection succeeded"); - accesspoint = false; - // Note IP details - ip = WiFi.localIP(); - net = WiFi.subnetMask(); - gw = WiFi.gatewayIP(); - Log.printf("IP address: %d.%d.%d.%d\r\n",ip[0],ip[1],ip[2],ip[3]); - Log.printf("Netmask : %d.%d.%d.%d\r\n",net[0],net[1],net[2],net[3]); - Log.printf("Gateway : %d.%d.%d.%d\r\n",gw[0],gw[1],gw[2],gw[3]); - calcURLs(); - // Flash the LED to show we are connected - for (int i = 0; i < 5; i++) { - flashLED(50); - delay(150); - } - } else { - Log.println("Client connection Failed"); - WiFi.disconnect(); // (resets the WiFi scan) - } - } - - if (accesspoint && (WiFi.status() != WL_CONNECTED)) { - // The accesspoint has been enabled, and we have not connected to any existing networks - #if defined(AP_CHAN) - Log.println("Setting up Fixed Channel AccessPoint"); - Log.print(" SSID : "); - Log.println(stationList[0].ssid); - Log.print(" Password : "); - Log.println(stationList[0].password); - Log.print(" Channel : "); - Log.println(AP_CHAN); - WiFi.softAP(stationList[0].ssid, stationList[0].password, AP_CHAN); - # else - Log.println("Setting up AccessPoint"); - Log.print(" SSID : "); - Log.println(stationList[0].ssid); - Log.print(" Password : "); - Log.println(stationList[0].password); - WiFi.softAP(stationList[0].ssid, stationList[0].password); - #endif - #if defined(AP_ADDRESS) - // User has specified the AP details; apply them after a short delay - // (https://github.com/espressif/arduino-esp32/issues/985#issuecomment-359157428) - delay(100); - IPAddress local_IP(AP_ADDRESS); - IPAddress gateway(AP_ADDRESS); - IPAddress subnet(255,255,255,0); - WiFi.softAPConfig(local_IP, gateway, subnet); - #endif - // Note AP details - ip = WiFi.softAPIP(); + Log.printf("Connecting to Wifi Network %d: [%02X:%02X:%02X:%02X:%02X:%02X] %s \r\n", + bestStation, bestBSSID[0], bestBSSID[1], bestBSSID[2], bestBSSID[3], + bestBSSID[4], bestBSSID[5], bestSSID); + // Apply static settings if necesscary + if (stationList[bestStation].dhcp == false) { +#if defined(ST_IP) + Log.println("Applying static IP settings"); +#if !defined (ST_GATEWAY) || !defined (ST_NETMASK) +#error "You must supply both Gateway and NetMask when specifying a static IP address" +#endif + IPAddress staticIP(ST_IP); + IPAddress gateway(ST_GATEWAY); + IPAddress subnet(ST_NETMASK); +#if !defined(ST_DNS1) + WiFi.config(staticIP, gateway, subnet); +#else + IPAddress dns1(ST_DNS1); +#if !defined(ST_DNS2) + WiFi.config(staticIP, gateway, subnet, dns1); +#else + IPAddress dns2(ST_DNS2); + WiFi.config(staticIP, gateway, subnet, dns1, dns2); +#endif +#endif +#else + Log.println("Static IP settings requested but not defined in config, falling back to dhcp"); +#endif + } + + WiFi.setHostname(mdnsName); + + // Initiate network connection request (3rd argument, channel = 0 is 'auto') + WiFi.begin(bestSSID, stationList[bestStation].password, 0, bestBSSID); + + // Wait to connect, or timeout + unsigned long start = millis(); + while ((millis() - start <= WIFI_WATCHDOG) && (WiFi.status() != WL_CONNECTED)) { + delay(500); + Log.print('.'); + } + Log.println(); + Log.begin(); + // If we have connected, inform user + if (WiFi.status() == WL_CONNECTED) { + Log.println("Client connection succeeded"); + accesspoint = false; + // Note IP details + ip = WiFi.localIP(); net = WiFi.subnetMask(); gw = WiFi.gatewayIP(); - strcpy(apName, stationList[0].ssid); - Log.printf("IP address: %d.%d.%d.%d\r\n",ip[0],ip[1],ip[2],ip[3]); + Log.printf("IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); + Log.printf("Netmask : %d.%d.%d.%d\r\n", net[0], net[1], net[2], net[3]); + Log.printf("Gateway : %d.%d.%d.%d\r\n", gw[0], gw[1], gw[2], gw[3]); calcURLs(); // Flash the LED to show we are connected for (int i = 0; i < 5; i++) { - flashLED(150); - delay(50); - } - // Start the DNS captive portal if requested - if (stationList[0].dhcp == true) { - Log.println("Starting Captive Portal"); - dnsServer.start(DNS_PORT, "*", ip); - captivePortal = true; + flashLED(50); + delay(150); } + } else { + Log.println("Client connection Failed"); + WiFi.disconnect(); // (resets the WiFi scan) + } } -} -void setup() { + if (accesspoint && (WiFi.status() != WL_CONNECTED)) { + // The accesspoint has been enabled, and we have not connected to any existing networks +#if defined(AP_CHAN) + Log.println("Setting up Fixed Channel AccessPoint"); + Log.print(" SSID : "); + Log.println(stationList[0].ssid); + Log.print(" Password : "); + Log.println(stationList[0].password); + Log.print(" Channel : "); + Log.println(AP_CHAN); + WiFi.softAP(stationList[0].ssid, stationList[0].password, AP_CHAN); +# else + Log.println("Setting up AccessPoint"); + Log.print(" SSID : "); + Log.println(stationList[0].ssid); + Log.print(" Password : "); + Log.println(stationList[0].password); + WiFi.softAP(stationList[0].ssid, stationList[0].password); +#endif +#if defined(AP_ADDRESS) + // User has specified the AP details; apply them after a short delay + // (https://github.com/espressif/arduino-esp32/issues/985#issuecomment-359157428) + delay(100); + IPAddress local_IP(AP_ADDRESS); + IPAddress gateway(AP_ADDRESS); + IPAddress subnet(255, 255, 255, 0); + WiFi.softAPConfig(local_IP, gateway, subnet); +#endif + // Note AP details + ip = WiFi.softAPIP(); + net = WiFi.subnetMask(); + gw = WiFi.gatewayIP(); + strcpy(apName, stationList[0].ssid); + Log.printf("IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); + calcURLs(); + // Flash the LED to show we are connected + for (int i = 0; i < 5; i++) { + flashLED(150); + delay(50); + } + // Start the DNS captive portal if requested + if (stationList[0].dhcp == true) { + Log.println("Starting Captive Portal"); + dnsServer.start(DNS_PORT, "*", ip); + captivePortal = true; + } + } + } + + void setup() { Serial.begin(115200); Serial.setDebugOutput(true); - Log.addPrintStream(std::make_shared(webSerialStream)); + Log.addPrintStream(std::make_shared(webSerialStream)); if (stationCount == 0) { - Log.println("\r\nFatal Error; Halting"); - while (true) { - Log.println("No wifi details have been configured; we cannot connect to existing WiFi or start our own AccessPoint, there is no point in proceeding."); - delay(5000); - } + Log.println("\r\nFatal Error; Halting"); + while (true) { + Log.println("No wifi details have been configured; we cannot connect to existing WiFi or start our own AccessPoint, there is no point in proceeding."); + delay(5000); + } } - // Start Wifi and loop until we are connected or have started an AccessPoint + // Start Wifi and loop until we are connected or have started an AccessPoint while ((WiFi.status() != WL_CONNECTED) && !accesspoint) { - WifiSetup(); - } + WifiSetup(); + } Log.begin(); Log.print("setup: Log.begin(), CPU "); Log.println(xPortGetCoreID()); @@ -712,113 +753,116 @@ void setup() { Log.println(baseVersion); Log.println(); // Warn if no PSRAM is detected (typically user error with board selection in the IDE) - if(!psramFound()){ - Log.println("\r\nFatal Error; Halting"); - while (true) { - Log.println("No PSRAM found; camera cannot be initialised: Please check the board config for your module."); - delay(5000); - } + if (!psramFound()) { + Log.println("\r\nFatal Error; Halting"); + while (true) { + Log.println("No PSRAM found; camera cannot be initialised: Please check the board config for your module."); + delay(5000); + } } - servo1.attach(SERVO_1); - servo2.attach(SERVO_2); - servo1.write(ptz_y); - servo2.write(ptz_x); - #if defined(LED_PIN) // If we have a notification LED, set it to output - pinMode(LED_PIN, OUTPUT); - digitalWrite(LED_PIN, LED_ON); - #endif +#if defined(LED_PIN) // If we have a notification LED, set it to output + pinMode(LED_PIN, OUTPUT); + digitalWrite(LED_PIN, LED_ON); +#endif // Start the SPIFFS filesystem before we initialise the camera if (filesystem) { - filesystemStart(); - delay(200); // a short delay to let spi bus settle after SPIFFS init + filesystemStart(); + delay(200); // a short delay to let spi bus settle after SPIFFS init } - // Start (init) the camera + // Start (init) the camera StartCamera(); // Now load and apply any saved preferences if (filesystem) { - delay(200); // a short delay to let spi bus settle after camera init - loadPrefs(SPIFFS); + delay(200); // a short delay to let spi bus settle after camera init + loadPrefs(SPIFFS); } else { - Log.println("No Internal Filesystem, cannot load or save preferences"); + Log.println("No Internal Filesystem, cannot load or save preferences"); } /* - * Camera setup complete; initialise the rest of the hardware. + Camera setup complete; initialise the rest of the hardware. */ + servo1.attach(Servo1Pin); + servo2.attach(Servo2Pin); + servo1.write(ptz_y); + servo2.write(ptz_x); // Set up OTA if (otaEnabled) { - // Start OTA once connected - Log.println("Setting up OTA"); - // Port defaults to 3232 - // ArduinoOTA.setPort(3232); - // Hostname defaults to esp3232-[MAC] - ArduinoOTA.setHostname(mdnsName); - // No authentication by default - if (strlen(otaPassword) != 0) { - ArduinoOTA.setPassword(otaPassword); - Log.printf("OTA Password: %s\n\r", otaPassword); - } else { - Log.printf("\r\nNo OTA password has been set! (insecure)\r\n\r\n"); - } - ArduinoOTA - .onStart([]() { - String type; - if (ArduinoOTA.getCommand() == U_FLASH) - type = "sketch"; - else // U_SPIFFS - // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end() - type = "filesystem"; - Log.println("Start updating " + type); - Log.print("setup ArduinoOTA.onStart CPU "); - Log.println(xPortGetCoreID()); - // Stop the camera since OTA will crash the module if it is running. - // the unit will need rebooting to restart it, either by OTA on success, or manually by the user - Log.println("Stopping Camera"); - esp_err_t err = esp_camera_deinit(); - critERR = "

OTA Has been started


Camera has Halted!

"; - critERR += "

Wait for OTA to finish and reboot, or reboot manually to recover

"; - }) - .onEnd([]() { - Log.println("\r\nEnd"); - }) - .onProgress([](unsigned int progress, unsigned int total) { - Log.printf("Progress: %u%%\r", (progress / (total / 100))); - }) - .onError([](ota_error_t error) { - Log.printf("Error[%u]: ", error); - if (error == OTA_AUTH_ERROR) Log.println("Auth Failed"); - else if (error == OTA_BEGIN_ERROR) Log.println("Begin Failed"); - else if (error == OTA_CONNECT_ERROR) Log.println("Connect Failed"); - else if (error == OTA_RECEIVE_ERROR) Log.println("Receive Failed"); - else if (error == OTA_END_ERROR) Log.println("End Failed"); - }); - ArduinoOTA.begin(); + // Start OTA once connected + Log.println("Setting up OTA"); + // Port defaults to 3232 + // ArduinoOTA.setPort(3232); + // Hostname defaults to esp3232-[MAC] + ArduinoOTA.setHostname(mdnsName); + // No authentication by default + if (strlen(otaPassword) != 0) { + ArduinoOTA.setPassword(otaPassword); + Log.printf("OTA Password: %s\n\r", otaPassword); + } else { + Log.printf("\r\nNo OTA password has been set! (insecure)\r\n\r\n"); + } + ArduinoOTA + .onStart([]() { + String type; + if (ArduinoOTA.getCommand() == U_FLASH) + type = "sketch"; + else // U_SPIFFS + // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end() + type = "filesystem"; + Log.println("Start updating " + type); + Log.print("setup ArduinoOTA.onStart CPU "); + Log.println(xPortGetCoreID()); + // Stop the camera since OTA will crash the module if it is running. + // the unit will need rebooting to restart it, either by OTA on success, or manually by the user + Log.println("Stopping Camera"); + esp_err_t err = esp_camera_deinit(); + critERR = "

OTA Has been started


Camera has Halted!

"; + critERR += "

Wait for OTA to finish and reboot, or reboot manually to recover

"; + }) + .onEnd([]() { + Log.println("\r\nEnd"); + }) + .onProgress([](unsigned int progress, unsigned int total) { + Log.printf("Progress: %u%%\r", (progress / (total / 100))); + }) + .onError([](ota_error_t error) { + Log.printf("Error[%u]: ", error); + if (error == OTA_AUTH_ERROR) Log.println("Auth Failed"); + else if (error == OTA_BEGIN_ERROR) Log.println("Begin Failed"); + else if (error == OTA_CONNECT_ERROR) Log.println("Connect Failed"); + else if (error == OTA_RECEIVE_ERROR) Log.println("Receive Failed"); + else if (error == OTA_END_ERROR) Log.println("End Failed"); + }); + ArduinoOTA.begin(); } else { - Log.println("OTA is disabled"); + Log.println("OTA is disabled"); - if (!MDNS.begin(mdnsName)) { - Log.println("Error setting up MDNS responder!"); - } - Log.println("mDNS responder started"); + if (!MDNS.begin(mdnsName)) { + Log.println("Error setting up MDNS responder!"); + } + Log.println("mDNS responder started"); } //MDNS Config -- note that if OTA is NOT enabled this needs prior steps! MDNS.addService("http", "tcp", 80); Log.println("Added HTTP service to MDNS server"); + MDNS.addService("webserial", "tcp", 8514); + Log.println("Added webserial service to MDNS server"); + // Set time via NTP server when enabled if (haveTime) { - Log.print("Time: "); - configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); - printLocalTime(true); + Log.print("Time: "); + configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); + printLocalTime(true); } else { - Log.println("Time functions disabled"); + Log.println("Time functions disabled"); } // Gather static values used when dumping status; these are slow functions, so just do them once during startup @@ -828,66 +872,68 @@ void setup() { // Initialise and set the lamp if (lampVal != -1) { - #if defined(LAMP_PIN) - ledcSetup(lampChannel, pwmfreq, pwmresolution); // configure LED PWM channel - ledcAttachPin(LAMP_PIN, lampChannel); // attach the GPIO pin to the channel - if (autoLamp) setLamp(0); // set default value - else setLamp(lampVal); - #endif +#if defined(LAMP_PIN) + ledcSetup(lampChannel, pwmfreq, pwmresolution); // configure LED PWM channel + ledcAttachPin(LAMP_PIN, lampChannel); // attach the GPIO pin to the channel + if (autoLamp) setLamp(0); // set default value + else setLamp(lampVal); +#endif } else { - Log.println("No lamp, or lamp disabled in config"); + Log.println("No lamp, or lamp disabled in config"); } // As a final init step chomp out the serial buffer in case we have recieved mis-keys or garbage during startup while (Serial.available()) Serial.read(); - xTaskCreatePinnedToCore(TaskCore0, "TaskCore0", 10000, NULL, 1, &TaskCore0Handle, 0); -} + xTaskCreatePinnedToCore(TaskCore0, "TaskCore0", 10000, NULL, 1, &TaskCore0Handle, 0); + } -void loop() { + const TickType_t xDelay = 10; + void loop() { /* - * Just loop forever, reconnecting Wifi As necesscary in client mode - * The stream and URI handler processes initiated by the startCameraServer() call at the - * end of setup() will handle the camera and UI processing from now on. + Just loop forever, reconnecting Wifi As necesscary in client mode + The stream and URI handler processes initiated by the startCameraServer() call at the + end of setup() will handle the camera and UI processing from now on. */ if (accesspoint) { - // Accespoint is permanently up, so just loop, servicing the captive portal as needed - // Rather than loop forever, follow the watchdog, in case we later add auto re-scan. + // Accespoint is permanently up, so just loop, servicing the captive portal as needed + // Rather than loop forever, follow the watchdog, in case we later add auto re-scan. + unsigned long start = millis(); + while (millis() - start < WIFI_WATCHDOG ) { + //delay(100); + vTaskDelay( xDelay ); + if (otaEnabled) ArduinoOTA.handle(); + handleSerial(); + if (captivePortal) dnsServer.processNextRequest(); + } + } else { + // client mode can fail; so reconnect as appropriate + static bool warned = false; + if (WiFi.status() == WL_CONNECTED) { + // We are connected, wait a bit and re-check + if (warned) { + // Tell the user if we have just reconnected + Log.println("WiFi reconnected"); + warned = false; + } + // loop here for WIFI_WATCHDOG, turning debugData true/false depending on serial input.. unsigned long start = millis(); while (millis() - start < WIFI_WATCHDOG ) { - delay(100); - if (otaEnabled) ArduinoOTA.handle(); - handleSerial(); - if (captivePortal) dnsServer.processNextRequest(); + delay(100); + if (otaEnabled) ArduinoOTA.handle(); + handleSerial(); } - } else { - // client mode can fail; so reconnect as appropriate - static bool warned = false; - if (WiFi.status() == WL_CONNECTED) { - // We are connected, wait a bit and re-check - if (warned) { - // Tell the user if we have just reconnected - Log.println("WiFi reconnected"); - warned = false; - } - // loop here for WIFI_WATCHDOG, turning debugData true/false depending on serial input.. - unsigned long start = millis(); - while (millis() - start < WIFI_WATCHDOG ) { - delay(100); - if (otaEnabled) ArduinoOTA.handle(); - handleSerial(); - } - } else { - // disconnected; attempt to reconnect - if (!warned) { - Log.print("loop CPU "); - Log.println(xPortGetCoreID()); - // Tell the user if we just disconnected - WiFi.disconnect(); // ensures disconnect is complete, wifi scan cleared - Log.println("WiFi disconnected, retrying"); - warned = true; - } - WifiSetup(); + } else { + // disconnected; attempt to reconnect + if (!warned) { + Log.print("loop CPU "); + Log.println(xPortGetCoreID()); + // Tell the user if we just disconnected + WiFi.disconnect(); // ensures disconnect is complete, wifi scan cleared + Log.println("WiFi disconnected, retrying"); + warned = true; } + WifiSetup(); + } } -} + } diff --git a/index_ov2640.h b/index_ov2640.h index 1f56118..f4bb34b 100644 --- a/index_ov2640.h +++ b/index_ov2640.h @@ -3,658 +3,684 @@ */ const uint8_t index_ov2640_html[] = R"=====( - - - - - ESP32 OV2640 - - - - - - - -
- -
- -
- -
-
-
- - - + } +}) + + + + +
+ +
+ +
+ +
+
+
+ )====="; size_t index_ov2640_html_len = sizeof(index_ov2640_html)-1; diff --git a/storage.cpp b/storage.cpp index 8b3d0f2..cf6cfca 100644 --- a/storage.cpp +++ b/storage.cpp @@ -9,6 +9,11 @@ extern int lampVal; // The current Lamp value extern bool autoLamp; // Automatic lamp mode extern int xclk; // Camera module clock speed extern int minFrameTime; // Limits framerate +extern int Servo1Pin; +extern int Servo2Pin; +extern int Servo_Step; +extern int ptz_y; +extern int ptz_x; /* * Useful utility when debugging... @@ -87,6 +92,13 @@ void loadPrefs(fs::FS &fs){ return; } } + + Servo1Pin = jsonExtract(prefs, "servo1_pin").toInt(); + Servo2Pin = jsonExtract(prefs, "servo2_pin").toInt(); + ptz_x = jsonExtract(prefs, "ptz_x").toInt(); + ptz_y = jsonExtract(prefs, "ptz_y").toInt(); + Servo_Step= jsonExtract(prefs, "servo_step").toInt(); + // get sensor reference sensor_t * s = esp_camera_sensor_get(); @@ -174,7 +186,13 @@ void savePrefs(fs::FS &fs){ p+=sprintf(p, "\"hmirror\":%u,", s->status.hmirror); p+=sprintf(p, "\"dcw\":%u,", s->status.dcw); p+=sprintf(p, "\"colorbar\":%u,", s->status.colorbar); - p+=sprintf(p, "\"rotate\":\"%d\"", myRotation); + p+=sprintf(p, "\"rotate\":\"%d\",", myRotation); + p+=sprintf(p, "\"servo1_pin\":%u,", Servo1Pin ); + p+=sprintf(p, "\"servo2_pin\":%u,", Servo2Pin ); + p+=sprintf(p, "\"servo_step\":%u,", Servo_Step ); + p+=sprintf(p, "\"ptz_y\":%u,", ptz_y ); + p+=sprintf(p, "\"ptz_x\":%u",ptz_x); + *p++ = '}'; *p++ = 0; file.print(json_response); From d558695bf1fed63350dc77a86bade3f5644d2a63 Mon Sep 17 00:00:00 2001 From: Zalgo <80800403+ZalgoSoft@users.noreply.github.com> Date: Fri, 1 Apr 2022 22:27:55 +0800 Subject: [PATCH 05/12] Update app_httpd.cpp --- app_httpd.cpp | 1576 +++++++++++++++++++++++++------------------------ 1 file changed, 811 insertions(+), 765 deletions(-) diff --git a/app_httpd.cpp b/app_httpd.cpp index 67fc9a0..6e46c51 100644 --- a/app_httpd.cpp +++ b/app_httpd.cpp @@ -11,10 +11,6 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. - -#define configUSE_TRACE_FACILITY 1 -#define configUSE_STATS_FORMATTING_FUNCTIONS 1 -#define configSUPPORT_DYNAMIC_ALLOCATION 1 #include #include #include @@ -28,7 +24,7 @@ #include #include #include -#include +//#include #include #include "index_ov2640.h" #include "index_ov3660.h" @@ -42,7 +38,7 @@ extern void flashLED(int flashtime); extern void setLamp(int newVal); extern void printLocalTime(bool extraData); - +extern void print_client_ip(httpd_req_t *req); // External variables declared in the main .ino extern char myName[]; extern char myVer[]; @@ -79,9 +75,11 @@ extern int sensorPID; extern Servo servo1; extern Servo servo2; +extern int Servo1Pin; +extern int Servo2Pin; +extern int Servo_Step; extern int ptz_y; extern int ptz_x; -#define SERVO_STEP 5 typedef struct { httpd_req_t *req; size_t len; @@ -107,88 +105,88 @@ uint8_t temprature_sens_read(); #endif void serialDump() { - Log.println(); - // Module - Log.printf("Name: %s\r\n", myName); - if (haveTime) { - Log.print("Time: "); - printLocalTime(true); - } - Log.printf("Firmware: %s (base: %s)\r\n", myVer, baseVersion); - float sketchPct = 100 * sketchSize / sketchSpace; - Log.printf("Sketch Size: %i (total: %i, %.1f%% used)\r\n", sketchSize, sketchSpace, sketchPct); - Log.printf("MD5: %s\r\n", sketchMD5.c_str()); - Log.printf("ESP sdk: %s\r\n", ESP.getSdkVersion()); - if (otaEnabled) { - if (strlen(otaPassword) != 0) { - Log.printf("OTA: Enabled, Password: %s\n\r", otaPassword); - } else { - Log.printf("OTA: Enabled, No Password! (insecure)\n\r"); - } - } else { - Log.printf("OTA: Disabled\n\r"); - } - // Network - if (accesspoint) { - if (captivePortal) { - Log.printf("WiFi Mode: AccessPoint with captive portal\r\n"); - } else { - Log.printf("WiFi Mode: AccessPoint\r\n"); - } - Log.printf("WiFi SSID: %s\r\n", apName); - } else { - Log.printf("WiFi Mode: Client\r\n"); - String ssidName = WiFi.SSID(); - Log.printf("WiFi Ssid: %s\r\n", ssidName.c_str()); - Log.printf("WiFi Rssi: %i\r\n", WiFi.RSSI()); - String bssid = WiFi.BSSIDstr(); - Log.printf("WiFi BSSID: %s\r\n", bssid.c_str()); - } - Log.printf("WiFi IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); - if (!accesspoint) { - Log.printf("WiFi Netmask: %d.%d.%d.%d\r\n", net[0], net[1], net[2], net[3]); - Log.printf("WiFi Gateway: %d.%d.%d.%d\r\n", gw[0], gw[1], gw[2], gw[3]); - } - Log.printf("WiFi Http port: %i, Stream port: %i\r\n", httpPort, streamPort); - byte mac[6]; - WiFi.macAddress(mac); - Log.printf("WiFi MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); - Log.print("serialDump CPU "); - Log.println(xPortGetCoreID()); - // System - int64_t sec = esp_timer_get_time() / 1000000; - int64_t upDays = int64_t(floor(sec/86400)); - int upHours = int64_t(floor(sec/3600)) % 24; - int upMin = int64_t(floor(sec/60)) % 60; - int upSec = sec % 60; - int McuTc = (temprature_sens_read() - 32) / 1.8; // celsius - int McuTf = temprature_sens_read(); // fahrenheit - Log.printf("System up: %" PRId64 ":%02i:%02i:%02i (d:h:m:s)\r\n", upDays, upHours, upMin, upSec); - Log.printf("Active streams: %i, Previous streams: %lu, Images captured: %lu\r\n", streamCount, streamsServed, imagesServed); - Log.printf("CPU Freq: %i MHz, Xclk Freq: %i MHz\r\n", ESP.getCpuFreqMHz(), xclk); - Log.printf("MCU temperature : %i C, %i F (approximate)\r\n", McuTc, McuTf); - Log.printf("Heap: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getHeapSize(), ESP.getFreeHeap(), ESP.getMinFreeHeap(), ESP.getMaxAllocHeap()); - if(psramFound()) { - Log.printf("Psram: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getPsramSize(), ESP.getFreePsram(), ESP.getMinFreePsram(), ESP.getMaxAllocPsram()); + Log.println(); + // Module + Log.printf("Name: %s\r\n", myName); + if (haveTime) { + Log.print("Time: "); + printLocalTime(true); + } + Log.printf("Firmware: %s (base: %s)\r\n", myVer, baseVersion); + float sketchPct = 100 * sketchSize / sketchSpace; + Log.printf("Sketch Size: %i (total: %i, %.1f%% used)\r\n", sketchSize, sketchSpace, sketchPct); + Log.printf("MD5: %s\r\n", sketchMD5.c_str()); + Log.printf("ESP sdk: %s\r\n", ESP.getSdkVersion()); + Log.print("This thread core affinity: "); + Log.println(xPortGetCoreID()); + if (otaEnabled) { + if (strlen(otaPassword) != 0) { + Log.printf("OTA: Enabled, Password: %s\n\r", otaPassword); } else { - Log.printf("Psram: Not found; please check your board configuration.\r\n"); - Log.printf("- High resolution/quality settings will show incomplete frames to low memory.\r\n"); + Log.printf("OTA: Enabled, No Password! (insecure)\n\r"); } - // Filesystems - if (filesystem && (SPIFFS.totalBytes() > 0)) { - Log.printf("Spiffs: %i, used: %i\r\n", SPIFFS.totalBytes(), SPIFFS.usedBytes()); + } else { + Log.printf("OTA: Disabled\n\r"); + } + // Network + if (accesspoint) { + if (captivePortal) { + Log.printf("WiFi Mode: AccessPoint with captive portal\r\n"); } else { - Log.printf("Spiffs: No filesystem found, please check your board configuration.\r\n"); - Log.printf("- Saving and restoring camera settings will not function without this.\r\n"); - } - Log.println("Preferences file: "); - dumpPrefs(SPIFFS); - if (critERR.length() > 0) { - Log.printf("\r\n\r\nAn error or halt has occurred with Camera Hardware, see previous messages.\r\n"); - Log.printf("A reboot is required to recover from this.\r\nError message: (html)\r\n %s\r\n\r\n", critERR.c_str()); - } - Log.println(); - return; + Log.printf("WiFi Mode: AccessPoint\r\n"); + } + Log.printf("WiFi SSID: %s\r\n", apName); + } else { + Log.printf("WiFi Mode: Client\r\n"); + String ssidName = WiFi.SSID(); + Log.printf("WiFi Ssid: %s\r\n", ssidName.c_str()); + Log.printf("WiFi Rssi: %i\r\n", WiFi.RSSI()); + String bssid = WiFi.BSSIDstr(); + Log.printf("WiFi BSSID: %s\r\n", bssid.c_str()); + } + Log.printf("WiFi IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); + if (!accesspoint) { + Log.printf("WiFi Netmask: %d.%d.%d.%d\r\n", net[0], net[1], net[2], net[3]); + Log.printf("WiFi Gateway: %d.%d.%d.%d\r\n", gw[0], gw[1], gw[2], gw[3]); + } + Log.printf("WiFi Http port: %i, Stream port: %i\r\n", httpPort, streamPort); + byte mac[6]; + WiFi.macAddress(mac); + Log.printf("WiFi MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + // System + int64_t sec = esp_timer_get_time() / 1000000; + int64_t upDays = int64_t(floor(sec / 86400)); + int upHours = int64_t(floor(sec / 3600)) % 24; + int upMin = int64_t(floor(sec / 60)) % 60; + int upSec = sec % 60; + int McuTc = (temprature_sens_read() - 32) / 1.8; // celsius + int McuTf = temprature_sens_read(); // fahrenheit + Log.printf("System up: %" PRId64 ":%02i:%02i:%02i (d:h:m:s)\r\n", upDays, upHours, upMin, upSec); + Log.printf("Active streams: %i, Previous streams: %lu, Images captured: %lu\r\n", streamCount, streamsServed, imagesServed); + Log.printf("CPU Freq: %i MHz, Xclk Freq: %i MHz\r\n", ESP.getCpuFreqMHz(), xclk); + Log.printf("MCU temperature : %i C, %i F (approximate)\r\n", McuTc, McuTf); + Log.printf("Heap: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getHeapSize(), ESP.getFreeHeap(), ESP.getMinFreeHeap(), ESP.getMaxAllocHeap()); + if (psramFound()) { + Log.printf("Psram: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getPsramSize(), ESP.getFreePsram(), ESP.getMinFreePsram(), ESP.getMaxAllocPsram()); + } else { + Log.printf("Psram: Not found; please check your board configuration.\r\n"); + Log.printf("- High resolution/quality settings will show incomplete frames to low memory.\r\n"); + } + // Filesystems + if (filesystem && (SPIFFS.totalBytes() > 0)) { + Log.printf("Spiffs: %i, used: %i\r\n", SPIFFS.totalBytes(), SPIFFS.usedBytes()); + } else { + Log.printf("Spiffs: No filesystem found, please check your board configuration.\r\n"); + Log.printf("- Saving and restoring camera settings will not function without this.\r\n"); + } + Log.println("Preferences file: "); + dumpPrefs(SPIFFS); + if (critERR.length() > 0) { + Log.printf("\r\n\r\nAn error or halt has occurred with Camera Hardware, see previous messages.\r\n"); + Log.printf("A reboot is required to recover from this.\r\nError message: (html)\r\n %s\r\n\r\n", critERR.c_str()); + } + Log.println(); + return; } static esp_err_t capture_handler(httpd_req_t *req){ @@ -207,760 +205,808 @@ static esp_err_t capture_handler(httpd_req_t *req){ fb = esp_camera_fb_get(); if (!fb) { - Log.println("CAPTURE: failed to acquire frame"); - httpd_resp_send_500(req); - if (autoLamp && (lampVal != -1)) setLamp(0); - return ESP_FAIL; - } + Log.println("CAPTURE: failed to acquire frame"); + httpd_resp_send_500(req); + if (autoLamp && (lampVal != -1)) setLamp(0); + return ESP_FAIL; + } + + httpd_resp_set_type(req, "image/jpeg"); + httpd_resp_set_hdr(req, "Content-Disposition", "inline; filename=capture.jpg"); + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + + size_t fb_len = 0; + if (fb->format == PIXFORMAT_JPEG) { + fb_len = fb->len; + res = httpd_resp_send(req, (const char *)fb->buf, fb->len); + } else { + res = ESP_FAIL; + Log.println("Capture Error: Non-JPEG image returned by camera module"); + } + esp_camera_fb_return(fb); + fb = NULL; + + int64_t fr_end = esp_timer_get_time(); + if (debugData) { + Log.printf("JPG: %uB %ums\r\n", (uint32_t)(fb_len), (uint32_t)((fr_end - fr_start) / 1000)); + } + imagesServed++; + if (autoLamp && (lampVal != -1)) { + setLamp(0); + } + return res; +} + +static esp_err_t stream_handler(httpd_req_t *req) { + camera_fb_t * fb = NULL; + esp_err_t res = ESP_OK; + size_t _jpg_buf_len = 0; + uint8_t * _jpg_buf = NULL; + char * part_buf[64]; + + streamKill = false; + + print_client_ip(req); Log.print("Stream requested"); + Log.print(" stream_handler CPU "); + Log.println(xPortGetCoreID()); + if (autoLamp && (lampVal != -1)) setLamp(lampVal); + streamCount = 1; // at present we only have one stream handler, so values are 0 or 1.. + flashLED(75); // double flash of status LED + delay(75); + flashLED(75); + + static int64_t last_frame = 0; + if (!last_frame) { + last_frame = esp_timer_get_time(); + } - httpd_resp_set_type(req, "image/jpeg"); - httpd_resp_set_hdr(req, "Content-Disposition", "inline; filename=capture.jpg"); - httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE); + if (res != ESP_OK) { + streamCount = 0; + if (autoLamp && (lampVal != -1)) setLamp(0); + Log.println("STREAM: failed to set HTTP response type"); + return res; + } - size_t fb_len = 0; - if(fb->format == PIXFORMAT_JPEG){ - fb_len = fb->len; - res = httpd_resp_send(req, (const char *)fb->buf, fb->len); + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + + if (res == ESP_OK) { + res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY)); + } + + while (true) { + fb = esp_camera_fb_get(); + if (!fb) { + Log.println("STREAM: failed to acquire frame"); + res = ESP_FAIL; } else { + if (fb->format != PIXFORMAT_JPEG) { + Log.println("STREAM: Non-JPEG frame returned by camera module"); res = ESP_FAIL; - Log.println("Capture Error: Non-JPEG image returned by camera module"); + } else { + _jpg_buf_len = fb->len; + _jpg_buf = fb->buf; + } } - esp_camera_fb_return(fb); - fb = NULL; - - int64_t fr_end = esp_timer_get_time(); - if (debugData) { - Log.printf("JPG: %uB %ums\r\n", (uint32_t)(fb_len), (uint32_t)((fr_end - fr_start)/1000)); + if (res == ESP_OK) { + size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len); + res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen); } - imagesServed++; - if (autoLamp && (lampVal != -1)) { - setLamp(0); + if (res == ESP_OK) { + res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len); } - return res; -} - -static esp_err_t stream_handler(httpd_req_t *req){ - camera_fb_t * fb = NULL; - esp_err_t res = ESP_OK; - size_t _jpg_buf_len = 0; - uint8_t * _jpg_buf = NULL; - char * part_buf[64]; + if (res == ESP_OK) { + res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY)); + } + if (fb) { + esp_camera_fb_return(fb); + fb = NULL; + _jpg_buf = NULL; + } else if (_jpg_buf) { + free(_jpg_buf); + _jpg_buf = NULL; + } + if (res != ESP_OK) { + // This is the error exit point from the stream loop. + // We end the stream here only if a Hard failure has been encountered or the connection has been interrupted. + Log.printf("Stream failed, code = %i : %s\r\n", res, esp_err_to_name(res)); + break; + } + if ((res != ESP_OK) || streamKill) { + // We end the stream here when a kill is signalled. + Log.printf("Stream killed\r\n"); + break; + } + int64_t frame_time = esp_timer_get_time() - last_frame; + frame_time /= 1000; + int32_t frame_delay = (minFrameTime > frame_time) ? minFrameTime - frame_time : 0; + delay(frame_delay); - streamKill = false; + if (debugData) { + Log.printf("MJPG: %uB %ums, delay: %ums, framerate (%.1ffps)\r\n", + (uint32_t)(_jpg_buf_len), + (uint32_t)frame_time, frame_delay, 1000.0 / (uint32_t)(frame_time + frame_delay)); + } + last_frame = esp_timer_get_time(); + } - print_client_ip(req); Log.print("Stream requested"); - Log.print(" stream_handler CPU "); - Log.println(xPortGetCoreID()); - if (autoLamp && (lampVal != -1)) setLamp(lampVal); - streamCount = 1; // at present we only have one stream handler, so values are 0 or 1.. - flashLED(75); // double flash of status LED - delay(75); - flashLED(75); - - static int64_t last_frame = 0; - if(!last_frame) { - last_frame = esp_timer_get_time(); - } - - res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE); - if(res != ESP_OK){ - streamCount = 0; - if (autoLamp && (lampVal != -1)) setLamp(0); - Log.println("STREAM: failed to set HTTP response type"); - return res; - } - - httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); - - if(res == ESP_OK){ - res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY)); - } - - while(true){ - fb = esp_camera_fb_get(); - if (!fb) { - Log.println("STREAM: failed to acquire frame"); - res = ESP_FAIL; - } else { - if(fb->format != PIXFORMAT_JPEG){ - Log.println("STREAM: Non-JPEG frame returned by camera module"); - res = ESP_FAIL; - } else { - _jpg_buf_len = fb->len; - _jpg_buf = fb->buf; - } - } - if(res == ESP_OK){ - size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len); - res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen); - } - if(res == ESP_OK){ - res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len); - } - if(res == ESP_OK){ - res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY)); - } - if(fb){ - esp_camera_fb_return(fb); - fb = NULL; - _jpg_buf = NULL; - } else if(_jpg_buf){ - free(_jpg_buf); - _jpg_buf = NULL; - } - if(res != ESP_OK){ - // This is the error exit point from the stream loop. - // We end the stream here only if a Hard failure has been encountered or the connection has been interrupted. - Log.printf("Stream failed, code = %i : %s\r\n", res, esp_err_to_name(res)); - break; - } - if((res != ESP_OK) || streamKill){ - // We end the stream here when a kill is signalled. - Log.printf("Stream killed\r\n"); - break; - } - int64_t frame_time = esp_timer_get_time() - last_frame; - frame_time /= 1000; - int32_t frame_delay = (minFrameTime > frame_time) ? minFrameTime - frame_time : 0; - delay(frame_delay); - - if (debugData) { - Log.printf("MJPG: %uB %ums, delay: %ums, framerate (%.1ffps)\r\n", - (uint32_t)(_jpg_buf_len), - (uint32_t)frame_time, frame_delay, 1000.0 / (uint32_t)(frame_time + frame_delay)); - } - last_frame = esp_timer_get_time(); - } - - streamsServed++; - streamCount = 0; - if (autoLamp && (lampVal != -1)) setLamp(0); - Log.println("Stream ended"); - last_frame = 0; - return res; + streamsServed++; + streamCount = 0; + if (autoLamp && (lampVal != -1)) setLamp(0); + Log.println("Stream ended"); + last_frame = 0; + return res; } -static esp_err_t cmd_handler(httpd_req_t *req){ - char* buf; - size_t buf_len; - char variable[32] = {0,}; - char value[32] = {0,}; - - flashLED(75); - - buf_len = httpd_req_get_url_query_len(req) + 1; - if (buf_len > 1) { - buf = (char*)malloc(buf_len); - if(!buf){ - httpd_resp_send_500(req); - return ESP_FAIL; - } - if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) { - if (httpd_query_key_value(buf, "var", variable, sizeof(variable)) == ESP_OK && - httpd_query_key_value(buf, "val", value, sizeof(value)) == ESP_OK) { - } else { - free(buf); - httpd_resp_send_404(req); - return ESP_FAIL; - } - } else { - free(buf); - httpd_resp_send_404(req); - return ESP_FAIL; - } +static esp_err_t cmd_handler(httpd_req_t *req) { + char* buf; + size_t buf_len; + char variable[32] = {0,}; + char value[32] = {0,}; + + flashLED(75); + + buf_len = httpd_req_get_url_query_len(req) + 1; + if (buf_len > 1) { + buf = (char*)malloc(buf_len); + if (!buf) { + httpd_resp_send_500(req); + return ESP_FAIL; + } + if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) { + if (httpd_query_key_value(buf, "var", variable, sizeof(variable)) == ESP_OK && + httpd_query_key_value(buf, "val", value, sizeof(value)) == ESP_OK) { + } else { free(buf); - } else { httpd_resp_send_404(req); return ESP_FAIL; - } + } + } else { + free(buf); + httpd_resp_send_404(req); + return ESP_FAIL; + } + free(buf); + } else { + httpd_resp_send_404(req); + return ESP_FAIL; + } - if (critERR.length() > 0) return httpd_resp_send_500(req); + if (critERR.length() > 0) return httpd_resp_send_500(req); - int val = atoi(value); - sensor_t * s = esp_camera_sensor_get(); - int res = 0; - if(!strcmp(variable, "framesize")) { - if(s->pixformat == PIXFORMAT_JPEG) res = s->set_framesize(s, (framesize_t)val); - } - else if(!strcmp(variable, "quality")) res = s->set_quality(s, val); - else if(!strcmp(variable, "xclk")) { xclk = val; res = s->set_xclk(s, LEDC_TIMER_0, val); } - else if(!strcmp(variable, "contrast")) res = s->set_contrast(s, val); - else if(!strcmp(variable, "brightness")) res = s->set_brightness(s, val); - else if(!strcmp(variable, "saturation")) res = s->set_saturation(s, val); - else if(!strcmp(variable, "gainceiling")) res = s->set_gainceiling(s, (gainceiling_t)val); - else if(!strcmp(variable, "colorbar")) res = s->set_colorbar(s, val); - else if(!strcmp(variable, "awb")) res = s->set_whitebal(s, val); - else if(!strcmp(variable, "agc")) res = s->set_gain_ctrl(s, val); - else if(!strcmp(variable, "aec")) res = s->set_exposure_ctrl(s, val); - else if(!strcmp(variable, "hmirror")) res = s->set_hmirror(s, val); - else if(!strcmp(variable, "vflip")) res = s->set_vflip(s, val); - else if(!strcmp(variable, "awb_gain")) res = s->set_awb_gain(s, val); - else if(!strcmp(variable, "agc_gain")) res = s->set_agc_gain(s, val); - else if(!strcmp(variable, "aec_value")) res = s->set_aec_value(s, val); - else if(!strcmp(variable, "aec2")) res = s->set_aec2(s, val); - else if(!strcmp(variable, "dcw")) res = s->set_dcw(s, val); - else if(!strcmp(variable, "bpc")) res = s->set_bpc(s, val); - else if(!strcmp(variable, "wpc")) res = s->set_wpc(s, val); - else if(!strcmp(variable, "raw_gma")) res = s->set_raw_gma(s, val); - else if(!strcmp(variable, "lenc")) res = s->set_lenc(s, val); - else if(!strcmp(variable, "special_effect")) res = s->set_special_effect(s, val); - else if(!strcmp(variable, "wb_mode")) res = s->set_wb_mode(s, val); - else if(!strcmp(variable, "ae_level")) res = s->set_ae_level(s, val); - else if(!strcmp(variable, "rotate")) myRotation = val; - else if(!strcmp(variable, "min_frame_time")) minFrameTime = val; - else if(!strcmp(variable, "autolamp") && (lampVal != -1)) { - autoLamp = val; - if (autoLamp) { - if (streamCount > 0) setLamp(lampVal); - else setLamp(0); - } else { - setLamp(lampVal); - } - } - else if(!strcmp(variable, "lamp") && (lampVal != -1)) { - lampVal = constrain(val,0,100); - if (autoLamp) { - if (streamCount > 0) setLamp(lampVal); - else setLamp(0); - } else { - setLamp(lampVal); - } - } - else if(!strcmp(variable, "save_prefs")) { - if (filesystem) savePrefs(SPIFFS); - } - else if(!strcmp(variable, "clear_prefs")) { - if (filesystem) removePrefs(SPIFFS); - } - else if(!strcmp(variable, "reboot")) { - if (lampVal != -1) setLamp(0); // kill the lamp; otherwise it can remain on during the soft-reboot - esp_task_wdt_init(3,true); // schedule a a watchdog panic event for 3 seconds in the future - esp_task_wdt_add(NULL); - periph_module_disable(PERIPH_I2C0_MODULE); // try to shut I2C down properly - periph_module_disable(PERIPH_I2C1_MODULE); - periph_module_reset(PERIPH_I2C0_MODULE); - periph_module_reset(PERIPH_I2C1_MODULE); - Log.print("REBOOT requested"); - while(true) { - flashLED(50); - delay(150); - Log.print('.'); - - } + int val = atoi(value); + sensor_t * s = esp_camera_sensor_get(); + int res = 0; + if (!strcmp(variable, "framesize")) { + if (s->pixformat == PIXFORMAT_JPEG) res = s->set_framesize(s, (framesize_t)val); + } + else if (!strcmp(variable, "quality")) res = s->set_quality(s, val); + else if (!strcmp(variable, "xclk")) { xclk = val; res = s->set_xclk(s, LEDC_TIMER_0, val); } + else if (!strcmp(variable, "contrast")) res = s->set_contrast(s, val); + else if (!strcmp(variable, "brightness")) res = s->set_brightness(s, val); + else if (!strcmp(variable, "saturation")) res = s->set_saturation(s, val); + else if (!strcmp(variable, "gainceiling")) res = s->set_gainceiling(s, (gainceiling_t)val); + else if (!strcmp(variable, "colorbar")) res = s->set_colorbar(s, val); + else if (!strcmp(variable, "awb")) res = s->set_whitebal(s, val); + else if (!strcmp(variable, "agc")) res = s->set_gain_ctrl(s, val); + else if (!strcmp(variable, "aec")) res = s->set_exposure_ctrl(s, val); + else if (!strcmp(variable, "hmirror")) res = s->set_hmirror(s, val); + else if (!strcmp(variable, "vflip")) res = s->set_vflip(s, val); + else if (!strcmp(variable, "awb_gain")) res = s->set_awb_gain(s, val); + else if (!strcmp(variable, "agc_gain")) res = s->set_agc_gain(s, val); + else if (!strcmp(variable, "aec_value")) res = s->set_aec_value(s, val); + else if (!strcmp(variable, "aec2")) res = s->set_aec2(s, val); + else if (!strcmp(variable, "dcw")) res = s->set_dcw(s, val); + else if (!strcmp(variable, "bpc")) res = s->set_bpc(s, val); + else if (!strcmp(variable, "wpc")) res = s->set_wpc(s, val); + else if (!strcmp(variable, "raw_gma")) res = s->set_raw_gma(s, val); + else if (!strcmp(variable, "lenc")) res = s->set_lenc(s, val); + else if (!strcmp(variable, "special_effect")) res = s->set_special_effect(s, val); + else if (!strcmp(variable, "wb_mode")) res = s->set_wb_mode(s, val); + else if (!strcmp(variable, "ae_level")) res = s->set_ae_level(s, val); + else if (!strcmp(variable, "rotate")) myRotation = val; + else if (!strcmp(variable, "min_frame_time")) minFrameTime = val; + else if (!strcmp(variable, "autolamp") && (lampVal != -1)) { + autoLamp = val; + if (autoLamp) { + if (streamCount > 0) setLamp(lampVal); + else setLamp(0); + } else { + setLamp(lampVal); + } + } + else if (!strcmp(variable, "lamp") && (lampVal != -1)) { + lampVal = constrain(val, 0, 100); + if (autoLamp) { + if (streamCount > 0) setLamp(lampVal); + else setLamp(0); + } else { + setLamp(lampVal); + } } + else if (!strcmp(variable, "save_prefs")) { + if (filesystem) savePrefs(SPIFFS); + } + else if (!strcmp(variable, "clear_prefs")) { + if (filesystem) removePrefs(SPIFFS); + } + else if (!strcmp(variable, "reboot")) { + if (lampVal != -1) setLamp(0); // kill the lamp; otherwise it can remain on during the soft-reboot + esp_task_wdt_init(3, true); // schedule a a watchdog panic event for 3 seconds in the future + esp_task_wdt_add(NULL); + periph_module_disable(PERIPH_I2C0_MODULE); // try to shut I2C down properly + periph_module_disable(PERIPH_I2C1_MODULE); + periph_module_reset(PERIPH_I2C0_MODULE); + periph_module_reset(PERIPH_I2C1_MODULE); + Log.print("REBOOT requested"); + while (true) { + flashLED(50); + delay(150); + Log.print('.'); + + } + } + else if (!strcmp(variable, "ptz")) { - if (val == 1 ) { + if (!strcmp(value, "up" )) { if (ptz_y <= 180) { - ptz_y += SERVO_STEP; + ptz_y += Servo_Step; servo1.write(ptz_y); } - Log.printf("PTZ: %i\t%i\t",ptz_x,ptz_y); + Log.printf("PTZ: %i\t%i\t", ptz_x, ptz_y); Log.println("Up"); } - else if (val == 3 ) { + else if (!strcmp(value, "left" )) { if (ptz_x <= 180) { - ptz_x += SERVO_STEP; + ptz_x += Servo_Step; servo2.write(ptz_x); } - Log.printf("PTZ: %i\t%i\t",ptz_x,ptz_y); + Log.printf("PTZ: %i\t%i\t", ptz_x, ptz_y); Log.println("Left"); } - else if (val == 2 ) { + else if (!strcmp(value, "right" )) { if (ptz_x >= 0) { - ptz_x -= SERVO_STEP; + ptz_x -= Servo_Step; servo2.write(ptz_x); } - Log.printf("PTZ: %i\t%i\t",ptz_x,ptz_y); + Log.printf("PTZ: %i\t%i\t", ptz_x, ptz_y); Log.println("Right"); } - else if (val == 4 ) { + else if (!strcmp(value, "down" )) { if (ptz_y >= 0) { - ptz_y -= SERVO_STEP; + ptz_y -= Servo_Step; servo1.write(ptz_y); } Log.printf("PTZ: %i\t%i\t" , ptz_x , ptz_y); Log.println("Down"); - } - } - else { - res = -1; } - if(res){ - return httpd_resp_send_500(req); + else if (!strcmp(value, "center" )) { + ptz_x = 90; + ptz_y = 90; + servo1.write(ptz_y); + servo2.write(ptz_x); + Log.printf("PTZ: %i\t%i\t", ptz_x, ptz_y); + Log.println("Center"); + } + } else if (!strcmp(variable, "ptz_x")) { + if (val >= 0 && val <= 180 ) { + ptz_x = val; + servo2.write(ptz_x); + Log.printf("PTZ: %i\t", ptz_x); + Log.println("PTZ pos x"); + } + } else if (!strcmp(variable, "ptz_y")) { + if (val >= 0 && val <= 180 ) { + ptz_y = val; + servo1.write(ptz_y); + Log.printf("PTZ: %i\t", ptz_y); + Log.println("PTZ pos y"); + } + } else if (!strcmp(variable, "servo_step")) { + if (val >= 0 && val <= 90 ) { + Servo_Step = val; + Log.printf("PTZ: %i\t", Servo_Step ); + Log.println("PTZ Step Size"); + } + } else if (!strcmp(variable, "servo1_pin")) { + if (val >= 0 && val <= 31 ) { + Servo1Pin = val; + Log.printf("PTZ: %i\t", Servo1Pin ); + Log.println("PTZ Servo1Pin"); + } + } else if (!strcmp(variable, "servo2_pin")) { + if (val >= 0 && val <= 31 ) { + Servo2Pin = val; + Log.printf("PTZ: %i\t", Servo2Pin ); + Log.println("PTZ Servo2Pin"); } - httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); - return httpd_resp_send(req, NULL, 0); + } + else { + res = -1; + } + if (res) { + return httpd_resp_send_500(req); + } + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + return httpd_resp_send(req, NULL, 0); } -static esp_err_t status_handler(httpd_req_t *req){ - static char json_response[1024]; - char * p = json_response; - *p++ = '{'; - // Do not get attempt to get sensor when in error; causes a panic.. - if (critERR.length() == 0) { - sensor_t * s = esp_camera_sensor_get(); - p+=sprintf(p, "\"lamp\":%d,", lampVal); - p+=sprintf(p, "\"autolamp\":%d,", autoLamp); - p+=sprintf(p, "\"min_frame_time\":%d,", minFrameTime); - p+=sprintf(p, "\"framesize\":%u,", s->status.framesize); - p+=sprintf(p, "\"quality\":%u,", s->status.quality); - p+=sprintf(p, "\"xclk\":%u,", xclk); - p+=sprintf(p, "\"brightness\":%d,", s->status.brightness); - p+=sprintf(p, "\"contrast\":%d,", s->status.contrast); - p+=sprintf(p, "\"saturation\":%d,", s->status.saturation); - p+=sprintf(p, "\"sharpness\":%d,", s->status.sharpness); - p+=sprintf(p, "\"special_effect\":%u,", s->status.special_effect); - p+=sprintf(p, "\"wb_mode\":%u,", s->status.wb_mode); - p+=sprintf(p, "\"awb\":%u,", s->status.awb); - p+=sprintf(p, "\"awb_gain\":%u,", s->status.awb_gain); - p+=sprintf(p, "\"aec\":%u,", s->status.aec); - p+=sprintf(p, "\"aec2\":%u,", s->status.aec2); - p+=sprintf(p, "\"ae_level\":%d,", s->status.ae_level); - p+=sprintf(p, "\"aec_value\":%u,", s->status.aec_value); - p+=sprintf(p, "\"agc\":%u,", s->status.agc); - p+=sprintf(p, "\"agc_gain\":%u,", s->status.agc_gain); - p+=sprintf(p, "\"gainceiling\":%u,", s->status.gainceiling); - p+=sprintf(p, "\"bpc\":%u,", s->status.bpc); - p+=sprintf(p, "\"wpc\":%u,", s->status.wpc); - p+=sprintf(p, "\"raw_gma\":%u,", s->status.raw_gma); - p+=sprintf(p, "\"lenc\":%u,", s->status.lenc); - p+=sprintf(p, "\"vflip\":%u,", s->status.vflip); - p+=sprintf(p, "\"hmirror\":%u,", s->status.hmirror); - p+=sprintf(p, "\"dcw\":%u,", s->status.dcw); - p+=sprintf(p, "\"colorbar\":%u,", s->status.colorbar); - p+=sprintf(p, "\"cam_name\":\"%s\",", myName); - p+=sprintf(p, "\"code_ver\":\"%s\",", myVer); - p+=sprintf(p, "\"rotate\":\"%d\",", myRotation); - p+=sprintf(p, "\"stream_url\":\"%s\"", streamURL); - } - *p++ = '}'; - *p++ = 0; - httpd_resp_set_type(req, "application/json"); - httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); - return httpd_resp_send(req, json_response, strlen(json_response)); +static esp_err_t status_handler(httpd_req_t *req) { + static char json_response[1024]; + char * p = json_response; + *p++ = '{'; + // Do not get attempt to get sensor when in error; causes a panic.. + if (critERR.length() == 0) { + sensor_t * s = esp_camera_sensor_get(); + p += sprintf(p, "\"lamp\":%d,", lampVal); + p += sprintf(p, "\"autolamp\":%d,", autoLamp); + p += sprintf(p, "\"min_frame_time\":%d,", minFrameTime); + p += sprintf(p, "\"framesize\":%u,", s->status.framesize); + p += sprintf(p, "\"quality\":%u,", s->status.quality); + p += sprintf(p, "\"xclk\":%u,", xclk); + p += sprintf(p, "\"brightness\":%d,", s->status.brightness); + p += sprintf(p, "\"contrast\":%d,", s->status.contrast); + p += sprintf(p, "\"saturation\":%d,", s->status.saturation); + p += sprintf(p, "\"sharpness\":%d,", s->status.sharpness); + p += sprintf(p, "\"special_effect\":%u,", s->status.special_effect); + p += sprintf(p, "\"wb_mode\":%u,", s->status.wb_mode); + p += sprintf(p, "\"awb\":%u,", s->status.awb); + p += sprintf(p, "\"awb_gain\":%u,", s->status.awb_gain); + p += sprintf(p, "\"aec\":%u,", s->status.aec); + p += sprintf(p, "\"aec2\":%u,", s->status.aec2); + p += sprintf(p, "\"ae_level\":%d,", s->status.ae_level); + p += sprintf(p, "\"aec_value\":%u,", s->status.aec_value); + p += sprintf(p, "\"agc\":%u,", s->status.agc); + p += sprintf(p, "\"agc_gain\":%u,", s->status.agc_gain); + p += sprintf(p, "\"gainceiling\":%u,", s->status.gainceiling); + p += sprintf(p, "\"bpc\":%u,", s->status.bpc); + p += sprintf(p, "\"wpc\":%u,", s->status.wpc); + p += sprintf(p, "\"raw_gma\":%u,", s->status.raw_gma); + p += sprintf(p, "\"lenc\":%u,", s->status.lenc); + p += sprintf(p, "\"vflip\":%u,", s->status.vflip); + p += sprintf(p, "\"hmirror\":%u,", s->status.hmirror); + p += sprintf(p, "\"dcw\":%u,", s->status.dcw); + p += sprintf(p, "\"colorbar\":%u,", s->status.colorbar); + p += sprintf(p, "\"cam_name\":\"%s\",", myName); + p += sprintf(p, "\"code_ver\":\"%s\",", myVer); + p += sprintf(p, "\"rotate\":\"%d\",", myRotation); + p += sprintf(p, "\"servo1_pin\":%u,", Servo1Pin ); + p += sprintf(p, "\"servo2_pin\":%u,", Servo2Pin ); + p += sprintf(p, "\"servo_step\":%u,", Servo_Step ); + p += sprintf(p, "\"ptz_y\":%u,", ptz_y ); + p += sprintf(p, "\"ptz_x\":%u,", ptz_x ); + p += sprintf(p, "\"stream_url\":\"%s\"", streamURL); + } + *p++ = '}'; + *p++ = 0; + httpd_resp_set_type(req, "application/json"); + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + return httpd_resp_send(req, json_response, strlen(json_response)); } -static esp_err_t info_handler(httpd_req_t *req){ - static char json_response[256]; - char * p = json_response; - *p++ = '{'; - p+=sprintf(p, "\"cam_name\":\"%s\",", myName); - p+=sprintf(p, "\"rotate\":\"%d\",", myRotation); - p+=sprintf(p, "\"stream_url\":\"%s\"", streamURL); - *p++ = '}'; - *p++ = 0; - httpd_resp_set_type(req, "application/json"); - httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); - return httpd_resp_send(req, json_response, strlen(json_response)); +static esp_err_t info_handler(httpd_req_t *req) { + static char json_response[256]; + char * p = json_response; + *p++ = '{'; + p += sprintf(p, "\"cam_name\":\"%s\",", myName); + p += sprintf(p, "\"rotate\":\"%d\",", myRotation); + p += sprintf(p, "\"stream_url\":\"%s\"", streamURL); + *p++ = '}'; + *p++ = 0; + httpd_resp_set_type(req, "application/json"); + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + return httpd_resp_send(req, json_response, strlen(json_response)); } -static esp_err_t favicon_16x16_handler(httpd_req_t *req){ - httpd_resp_set_type(req, "image/png"); - httpd_resp_set_hdr(req, "Content-Encoding", "identity"); - return httpd_resp_send(req, (const char *)favicon_16x16_png, favicon_16x16_png_len); +static esp_err_t favicon_16x16_handler(httpd_req_t *req) { + httpd_resp_set_type(req, "image/png"); + httpd_resp_set_hdr(req, "Content-Encoding", "identity"); + return httpd_resp_send(req, (const char *)favicon_16x16_png, favicon_16x16_png_len); } -static esp_err_t favicon_32x32_handler(httpd_req_t *req){ - httpd_resp_set_type(req, "image/png"); - httpd_resp_set_hdr(req, "Content-Encoding", "identity"); - return httpd_resp_send(req, (const char *)favicon_32x32_png, favicon_32x32_png_len); +static esp_err_t favicon_32x32_handler(httpd_req_t *req) { + httpd_resp_set_type(req, "image/png"); + httpd_resp_set_hdr(req, "Content-Encoding", "identity"); + return httpd_resp_send(req, (const char *)favicon_32x32_png, favicon_32x32_png_len); } -static esp_err_t favicon_ico_handler(httpd_req_t *req){ - httpd_resp_set_type(req, "image/x-icon"); - httpd_resp_set_hdr(req, "Content-Encoding", "identity"); - return httpd_resp_send(req, (const char *)favicon_ico, favicon_ico_len); +static esp_err_t favicon_ico_handler(httpd_req_t *req) { + httpd_resp_set_type(req, "image/x-icon"); + httpd_resp_set_hdr(req, "Content-Encoding", "identity"); + return httpd_resp_send(req, (const char *)favicon_ico, favicon_ico_len); } -static esp_err_t logo_svg_handler(httpd_req_t *req){ - httpd_resp_set_type(req, "image/svg+xml"); - httpd_resp_set_hdr(req, "Content-Encoding", "identity"); - return httpd_resp_send(req, (const char *)logo_svg, logo_svg_len); +static esp_err_t logo_svg_handler(httpd_req_t *req) { + httpd_resp_set_type(req, "image/svg+xml"); + httpd_resp_set_hdr(req, "Content-Encoding", "identity"); + return httpd_resp_send(req, (const char *)logo_svg, logo_svg_len); } -static esp_err_t dump_handler(httpd_req_t *req){ - flashLED(75); - print_client_ip(req); Log.println("\r\nDump requested via Web"); - serialDump(); - Log.print("dump_handler CPU "); - Log.println(xPortGetCoreID()); - - static char dumpOut[2000] = ""; - char * d = dumpOut; - // Header - d+= sprintf(d,"\n"); - d+= sprintf(d,"\n"); - d+= sprintf(d,"%s - Status\n", myName); - d+= sprintf(d,"\n"); - d+= sprintf(d,"\n"); - d+= sprintf(d,"\n"); - d+= sprintf(d,"\n"); - d+= sprintf(d,"\n"); - d+= sprintf(d,"\n"); - if (critERR.length() > 0) { - d+= sprintf(d,"%s
\n", critERR.c_str()); - } - d+= sprintf(d,"

ESP32 Cam Webserver

\n"); - // Module - d+= sprintf(d,"Name: %s
\n", myName); - d+= sprintf(d,"Firmware: %s (base: %s)
\n", myVer, baseVersion); - float sketchPct = 100 * sketchSize / sketchSpace; - d+= sprintf(d,"Sketch Size: %i (total: %i, %.1f%% used)
\n", sketchSize, sketchSpace, sketchPct); - d+= sprintf(d,"MD5: %s
\n", sketchMD5.c_str()); - d+= sprintf(d,"ESP sdk: %s
\n", ESP.getSdkVersion()); - // Network - d+= sprintf(d,"

WiFi

\n"); - if (accesspoint) { - if (captivePortal) { - d+= sprintf(d,"Mode: AccessPoint with captive portal
\n"); - } else { - d+= sprintf(d,"Mode: AccessPoint
\n"); - } - d+= sprintf(d,"SSID: %s
\n", apName); - } else { - d+= sprintf(d,"Mode: Client
\n"); - String ssidName = WiFi.SSID(); - d+= sprintf(d,"SSID: %s
\n", ssidName.c_str()); - d+= sprintf(d,"Rssi: %i
\n", WiFi.RSSI()); - String bssid = WiFi.BSSIDstr(); - d+= sprintf(d,"BSSID: %s
\n", bssid.c_str()); - } - d+= sprintf(d,"IP address: %d.%d.%d.%d
\n", ip[0], ip[1], ip[2], ip[3]); - if (!accesspoint) { - d+= sprintf(d,"Netmask: %d.%d.%d.%d
\n", net[0], net[1], net[2], net[3]); - d+= sprintf(d,"Gateway: %d.%d.%d.%d
\n", gw[0], gw[1], gw[2], gw[3]); - } - d+= sprintf(d,"Http port: %i, Stream port: %i
\n", httpPort, streamPort); - byte mac[6]; - WiFi.macAddress(mac); - d+= sprintf(d,"MAC: %02X:%02X:%02X:%02X:%02X:%02X
\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); - - // System - d+= sprintf(d,"

System

\n"); - if (haveTime) { - struct tm timeinfo; - if(getLocalTime(&timeinfo)){ - char timeStringBuff[50]; //50 chars should be enough - strftime(timeStringBuff, sizeof(timeStringBuff), "%H:%M:%S, %A, %B %d %Y", &timeinfo); - //print like "const char*" - d+= sprintf(d,"Time: %s
\n", timeStringBuff); - } - } - int64_t sec = esp_timer_get_time() / 1000000; - int64_t upDays = int64_t(floor(sec/86400)); - int upHours = int64_t(floor(sec/3600)) % 24; - int upMin = int64_t(floor(sec/60)) % 60; - int upSec = sec % 60; - int McuTc = (temprature_sens_read() - 32) / 1.8; // celsius - int McuTf = temprature_sens_read(); // fahrenheit - - d+= sprintf(d,"Up: %" PRId64 ":%02i:%02i:%02i (d:h:m:s)
\n", upDays, upHours, upMin, upSec); - d+= sprintf(d,"Active streams: %i, Previous streams: %lu, Images captured: %lu
\n", streamCount, streamsServed, imagesServed); - d+= sprintf(d,"CPU Freq: %i MHz, Xclk Freq: %i MHz
\n", ESP.getCpuFreqMHz(), xclk); - d+= sprintf(d,""); - d+= sprintf(d,"MCU temperature : %i °C, %i °F\n
", McuTc, McuTf); - d+= sprintf(d,"Heap: %i, free: %i, min free: %i, max block: %i
\n", ESP.getHeapSize(), ESP.getFreeHeap(), ESP.getMinFreeHeap(), ESP.getMaxAllocHeap()); - if (psramFound()) { - d+= sprintf(d,"Psram: %i, free: %i, min free: %i, max block: %i
\n", ESP.getPsramSize(), ESP.getFreePsram(), ESP.getMinFreePsram(), ESP.getMaxAllocPsram()); +static esp_err_t dump_handler(httpd_req_t *req) { + flashLED(75); + print_client_ip(req); Log.println("\r\nDump requested via Web"); + serialDump(); + Log.print("dump_handler CPU "); + Log.println(xPortGetCoreID()); + + static char dumpOut[2000] = ""; + char * d = dumpOut; + // Header + d += sprintf(d, "\n"); + d += sprintf(d, "\n"); + d += sprintf(d, "%s - Status\n", myName); + // A javascript timer to refresh the page every minute. + d += sprintf(d, "\n"); + d += sprintf(d, "\n"); + d += sprintf(d, "\n"); + d += sprintf(d, "\n"); + d += sprintf(d, "\n"); + d += sprintf(d, "\n"); + d+= sprintf(d,"\"\"\n"); + if (critERR.length() > 0) { + d += sprintf(d, "%s
\n", critERR.c_str()); + } + d += sprintf(d, "

ESP32 Cam Webserver

\n"); + // Module + d += sprintf(d, "Name: %s
\n", myName); + d += sprintf(d, "Firmware: %s (base: %s)
\n", myVer, baseVersion); + float sketchPct = 100 * sketchSize / sketchSpace; + d += sprintf(d, "Sketch Size: %i (total: %i, %.1f%% used)
\n", sketchSize, sketchSpace, sketchPct); + d += sprintf(d, "MD5: %s
\n", sketchMD5.c_str()); + d += sprintf(d, "ESP sdk: %s
\n", ESP.getSdkVersion()); + // Network + d += sprintf(d, "

WiFi

\n"); + if (accesspoint) { + if (captivePortal) { + d += sprintf(d, "Mode: AccessPoint with captive portal
\n"); } else { - d+= sprintf(d,"Psram: Not found, please check your board configuration.
\n"); - d+= sprintf(d,"- High resolution/quality images & streams will show incomplete frames due to low memory.
\n"); + d += sprintf(d, "Mode: AccessPoint
\n"); + } + d += sprintf(d, "SSID: %s
\n", apName); + } else { + d += sprintf(d, "Mode: Client
\n"); + String ssidName = WiFi.SSID(); + d += sprintf(d, "SSID: %s
\n", ssidName.c_str()); + d += sprintf(d, "Rssi: %i
\n", WiFi.RSSI()); + String bssid = WiFi.BSSIDstr(); + d += sprintf(d, "BSSID: %s
\n", bssid.c_str()); + } + d += sprintf(d, "IP address: %d.%d.%d.%d
\n", ip[0], ip[1], ip[2], ip[3]); + if (!accesspoint) { + d += sprintf(d, "Netmask: %d.%d.%d.%d
\n", net[0], net[1], net[2], net[3]); + d += sprintf(d, "Gateway: %d.%d.%d.%d
\n", gw[0], gw[1], gw[2], gw[3]); + } + d += sprintf(d, "Http port: %i, Stream port: %i
\n", httpPort, streamPort); + byte mac[6]; + WiFi.macAddress(mac); + d += sprintf(d, "MAC: %02X:%02X:%02X:%02X:%02X:%02X
\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + + // System + d += sprintf(d, "

System

\n"); + if (haveTime) { + struct tm timeinfo; + if (getLocalTime(&timeinfo)) { + char timeStringBuff[50]; //50 chars should be enough + strftime(timeStringBuff, sizeof(timeStringBuff), "%H:%M:%S, %A, %B %d %Y", &timeinfo); + //print like "const char*" + d += sprintf(d, "Time: %s
\n", timeStringBuff); } - if (filesystem && (SPIFFS.totalBytes() > 0)) { - d+= sprintf(d,"Spiffs: %i, used: %i
\n", SPIFFS.totalBytes(), SPIFFS.usedBytes()); - } else { - d+= sprintf(d,"Spiffs: No filesystem found, please check your board configuration.
\n"); - d+= sprintf(d,"- saving and restoring camera settings will not function without this.
\n"); - } - - // Footer - d+= sprintf(d,"
\n"); - d+= sprintf(d,"\n"); - d+= sprintf(d,"\n"); - d+= sprintf(d,"\n"); - d+= sprintf(d,"
\n\n"); - // A javascript timer to refresh the page every minute. - d+= sprintf(d,"\n\n"); - *d++ = 0; - httpd_resp_set_type(req, "text/html"); - httpd_resp_set_hdr(req, "Content-Encoding", "identity"); - return httpd_resp_send(req, dumpOut, strlen(dumpOut)); + } + int64_t sec = esp_timer_get_time() / 1000000; + int64_t upDays = int64_t(floor(sec / 86400)); + int upHours = int64_t(floor(sec / 3600)) % 24; + int upMin = int64_t(floor(sec / 60)) % 60; + int upSec = sec % 60; + int McuTc = (temprature_sens_read() - 32) / 1.8; // celsius + int McuTf = temprature_sens_read(); // fahrenheit + + d += sprintf(d, "Up: %" PRId64 ":%02i:%02i:%02i (d:h:m:s)
\n", upDays, upHours, upMin, upSec); + d += sprintf(d, "Active streams: %i, Previous streams: %lu, Images captured: %lu
\n", streamCount, streamsServed, imagesServed); + d += sprintf(d, "CPU Freq: %i MHz, Xclk Freq: %i MHz
\n", ESP.getCpuFreqMHz(), xclk); + d += sprintf(d, ""); + d += sprintf(d, "MCU temperature : %i °C, %i °F\n
", McuTc, McuTf); + d += sprintf(d, "Heap: %i, free: %i, min free: %i, max block: %i
\n", ESP.getHeapSize(), ESP.getFreeHeap(), ESP.getMinFreeHeap(), ESP.getMaxAllocHeap()); + d += sprintf(d, "PTZ: X: %i, Y: %i, step degree value: %i
\n", ptz_x, ptz_y , Servo_Step); + d += sprintf(d, "PTZ: Pin control for Servo1: %i, pin control for Servo2: %i
\n", Servo1Pin, Servo2Pin); + if (psramFound()) { + d += sprintf(d, "Psram: %i, free: %i, min free: %i, max block: %i
\n", ESP.getPsramSize(), ESP.getFreePsram(), ESP.getMinFreePsram(), ESP.getMaxAllocPsram()); + } else { + d += sprintf(d, "Psram: Not found, please check your board configuration.
\n"); + d += sprintf(d, "- High resolution/quality images & streams will show incomplete frames due to low memory.
\n"); + } + if (filesystem && (SPIFFS.totalBytes() > 0)) { + d += sprintf(d, "Spiffs: %i, used: %i
\n", SPIFFS.totalBytes(), SPIFFS.usedBytes()); + } else { + d += sprintf(d, "Spiffs: No filesystem found, please check your board configuration.
\n"); + d += sprintf(d, "- saving and restoring camera settings will not function without this.
\n"); + } + + // Footer + d += sprintf(d, "
\n"); + d += sprintf(d, "\n"); + d += sprintf(d, "\n"); + d += sprintf(d, "\n"); + d += sprintf(d, "
\n\n"); + d += sprintf(d, "\n"); + *d++ = 0; + httpd_resp_set_type(req, "text/html"); + httpd_resp_set_hdr(req, "Content-Encoding", "identity"); + return httpd_resp_send(req, dumpOut, strlen(dumpOut)); } -static esp_err_t stop_handler(httpd_req_t *req){ - flashLED(75); - print_client_ip(req); Log.println("\r\nStream stop requested via Web"); - streamKill = true; - httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); - return httpd_resp_send(req, NULL, 0); +static esp_err_t stop_handler(httpd_req_t *req) { + flashLED(75); + print_client_ip(req); Log.println("\r\nStream stop requested via Web"); + streamKill = true; + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + return httpd_resp_send(req, NULL, 0); } -static esp_err_t style_handler(httpd_req_t *req){ - httpd_resp_set_type(req, "text/css"); - httpd_resp_set_hdr(req, "Content-Encoding", "identity"); - return httpd_resp_send(req, (const char *)style_css, style_css_len); +static esp_err_t style_handler(httpd_req_t *req) { + httpd_resp_set_type(req, "text/css"); + httpd_resp_set_hdr(req, "Content-Encoding", "identity"); + return httpd_resp_send(req, (const char *)style_css, style_css_len); } -static esp_err_t streamviewer_handler(httpd_req_t *req){ - flashLED(75); - print_client_ip(req); Log.println("Stream viewer requested"); - httpd_resp_set_type(req, "text/html"); - httpd_resp_set_hdr(req, "Content-Encoding", "identity"); - return httpd_resp_send(req, (const char *)streamviewer_html, streamviewer_html_len); +static esp_err_t streamviewer_handler(httpd_req_t *req) { + flashLED(75); + print_client_ip(req); Log.println("Stream viewer requested"); + httpd_resp_set_type(req, "text/html"); + httpd_resp_set_hdr(req, "Content-Encoding", "identity"); + return httpd_resp_send(req, (const char *)streamviewer_html, streamviewer_html_len); } -static esp_err_t error_handler(httpd_req_t *req){ - flashLED(75); - Log.println("Sending error page"); - std::string s(error_html); - size_t index; - while ((index = s.find("")) != std::string::npos) - s.replace(index, strlen(""), httpURL); - while ((index = s.find("")) != std::string::npos) - s.replace(index, strlen(""), myName); - while ((index = s.find("")) != std::string::npos) - s.replace(index, strlen(""), critERR.c_str()); - httpd_resp_set_type(req, "text/html"); - httpd_resp_set_hdr(req, "Content-Encoding", "identity"); - return httpd_resp_send(req, (const char *)s.c_str(), s.length()); +static esp_err_t error_handler(httpd_req_t *req) { + flashLED(75); + Log.println("Sending error page"); + std::string s(error_html); + size_t index; + while ((index = s.find("")) != std::string::npos) + s.replace(index, strlen(""), httpURL); + while ((index = s.find("")) != std::string::npos) + s.replace(index, strlen(""), myName); + while ((index = s.find("")) != std::string::npos) + s.replace(index, strlen(""), critERR.c_str()); + httpd_resp_set_type(req, "text/html"); + httpd_resp_set_hdr(req, "Content-Encoding", "identity"); + return httpd_resp_send(req, (const char *)s.c_str(), s.length()); } void print_client_ip(httpd_req_t *req) { - int sockfd = httpd_req_to_sockfd(req); - char ipstr[INET6_ADDRSTRLEN]; - struct sockaddr_in6 addr; // esp_http_server uses IPv6 addressing - socklen_t addr_size = sizeof(addr); - if (getpeername(sockfd, (struct sockaddr *)&addr, &addr_size) < 0) { - Log.println( "Error getting client IP"); - return; - } -// inet_ntop(AF_INET, &addr.sin6_addr, ipstr, sizeof(ipstr)); - inet_ntop(AF_INET, &addr.sin6_addr.un.u32_addr[3], ipstr, sizeof(ipstr)); - Log.print ("Client IP => "); - Log.println(ipstr); + int sockfd = httpd_req_to_sockfd(req); + char ipstr[INET6_ADDRSTRLEN]; + struct sockaddr_in6 addr; // esp_http_server uses IPv6 addressing + socklen_t addr_size = sizeof(addr); + if (getpeername(sockfd, (struct sockaddr *)&addr, &addr_size) < 0) { + Log.println( "Error getting client IP"); + return; + } + // inet_ntop(AF_INET, &addr.sin6_addr, ipstr, sizeof(ipstr)); + inet_ntop(AF_INET, &addr.sin6_addr.un.u32_addr[3], ipstr, sizeof(ipstr)); + Log.print ("Client IP => "); + Log.println(ipstr); } -static esp_err_t index_handler(httpd_req_t *req){ - char* buf; - size_t buf_len; - char view[32] = {0,}; - - flashLED(75); - // See if we have a specific target (full/simple/portal) and serve as appropriate - buf_len = httpd_req_get_url_query_len(req) + 1; - if (buf_len > 1) { - buf = (char*)malloc(buf_len); - if(!buf){ - httpd_resp_send_500(req); - return ESP_FAIL; - } - if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) { - if (httpd_query_key_value(buf, "view", view, sizeof(view)) == ESP_OK) { - } else { - free(buf); - httpd_resp_send_404(req); - return ESP_FAIL; - } - } else { - free(buf); - httpd_resp_send_404(req); - return ESP_FAIL; - } +static esp_err_t index_handler(httpd_req_t *req) { + char* buf; + size_t buf_len; + char view[32] = {0,}; + + flashLED(75); + // See if we have a specific target (full/simple/portal) and serve as appropriate + buf_len = httpd_req_get_url_query_len(req) + 1; + if (buf_len > 1) { + buf = (char*)malloc(buf_len); + if (!buf) { + httpd_resp_send_500(req); + return ESP_FAIL; + } + if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) { + if (httpd_query_key_value(buf, "view", view, sizeof(view)) == ESP_OK) { + } else { free(buf); - } else { - // no target specified; default. - strcpy(view,default_index); - // If captive portal is active send that instead - if (captivePortal) { - strcpy(view,"portal"); - } - } - - if (strncmp(view,"simple", sizeof(view)) == 0) { - print_client_ip(req) ; - Log.print(" Simple index page requested"); - Log.print("CPU "); - Log.println(xPortGetCoreID()); - if (critERR.length() > 0) return error_handler(req); - httpd_resp_set_type(req, "text/html"); - httpd_resp_set_hdr(req, "Content-Encoding", "identity"); - return httpd_resp_send(req, (const char *)index_simple_html, index_simple_html_len); - } else if(strncmp(view,"full", sizeof(view)) == 0) { - print_client_ip(req) ; - Log.print (" Full index page requested "); - Log.print("CPU "); Log.println(xPortGetCoreID()); - if (critERR.length() > 0) return error_handler(req); - httpd_resp_set_type(req, "text/html"); - httpd_resp_set_hdr(req, "Content-Encoding", "identity"); - if (sensorPID == OV3660_PID) { - return httpd_resp_send(req, (const char *)index_ov3660_html, index_ov3660_html_len); - } - return httpd_resp_send(req, (const char *)index_ov2640_html, index_ov2640_html_len); - } else if(strncmp(view,"portal", sizeof(view)) == 0) { - //Prototype captive portal landing page. - print_client_ip(req); Log.print("Portal page requested"); - Log.print("CPU "); Log.println(xPortGetCoreID()); - std::string s(portal_html); - size_t index; - while ((index = s.find("")) != std::string::npos) - s.replace(index, strlen(""), httpURL); - while ((index = s.find("")) != std::string::npos) - s.replace(index, strlen(""), streamURL); - while ((index = s.find("")) != std::string::npos) - s.replace(index, strlen(""), myName); - httpd_resp_set_type(req, "text/html"); - httpd_resp_set_hdr(req, "Content-Encoding", "identity"); - return httpd_resp_send(req, (const char *)s.c_str(), s.length()); - } else { - print_client_ip(req); Log.print("Unknown page requested: "); - Log.println(view); httpd_resp_send_404(req); return ESP_FAIL; + } + } else { + free(buf); + httpd_resp_send_404(req); + return ESP_FAIL; + } + free(buf); + } else { + // no target specified; default. + strcpy(view, default_index); + // If captive portal is active send that instead + if (captivePortal) { + strcpy(view, "portal"); } + } + + if (strncmp(view, "simple", sizeof(view)) == 0) { + print_client_ip(req) ; + Log.print(" Simple index page requested"); + Log.print("CPU "); + Log.println(xPortGetCoreID()); + if (critERR.length() > 0) return error_handler(req); + httpd_resp_set_type(req, "text/html"); + httpd_resp_set_hdr(req, "Content-Encoding", "identity"); + return httpd_resp_send(req, (const char *)index_simple_html, index_simple_html_len); + } else if (strncmp(view, "full", sizeof(view)) == 0) { + print_client_ip(req) ; + Log.print (" Full index page requested "); + Log.print("CPU "); Log.println(xPortGetCoreID()); + if (critERR.length() > 0) return error_handler(req); + httpd_resp_set_type(req, "text/html"); + httpd_resp_set_hdr(req, "Content-Encoding", "identity"); + if (sensorPID == OV3660_PID) { + return httpd_resp_send(req, (const char *)index_ov3660_html, index_ov3660_html_len); + } + return httpd_resp_send(req, (const char *)index_ov2640_html, index_ov2640_html_len); + } else if (strncmp(view, "portal", sizeof(view)) == 0) { + //Prototype captive portal landing page. + print_client_ip(req); Log.print("Portal page requested"); + Log.print("CPU "); Log.println(xPortGetCoreID()); + std::string s(portal_html); + size_t index; + while ((index = s.find("")) != std::string::npos) + s.replace(index, strlen(""), httpURL); + while ((index = s.find("")) != std::string::npos) + s.replace(index, strlen(""), streamURL); + while ((index = s.find("")) != std::string::npos) + s.replace(index, strlen(""), myName); + httpd_resp_set_type(req, "text/html"); + httpd_resp_set_hdr(req, "Content-Encoding", "identity"); + return httpd_resp_send(req, (const char *)s.c_str(), s.length()); + } else { + print_client_ip(req); Log.print("Unknown page requested: "); + Log.println(view); + httpd_resp_send_404(req); + return ESP_FAIL; + } } -void startCameraServer(int hPort, int sPort){ - httpd_config_t config = HTTPD_DEFAULT_CONFIG(); - config.max_uri_handlers = 16; // we use more than the default 8 (on port 80) - - httpd_uri_t index_uri = { - .uri = "/", - .method = HTTP_GET, - .handler = index_handler, - .user_ctx = NULL - }; - httpd_uri_t status_uri = { - .uri = "/status", - .method = HTTP_GET, - .handler = status_handler, - .user_ctx = NULL - }; - httpd_uri_t cmd_uri = { - .uri = "/control", - .method = HTTP_GET, - .handler = cmd_handler, - .user_ctx = NULL - }; - httpd_uri_t capture_uri = { - .uri = "/capture", - .method = HTTP_GET, - .handler = capture_handler, - .user_ctx = NULL - }; - httpd_uri_t style_uri = { - .uri = "/style.css", - .method = HTTP_GET, - .handler = style_handler, - .user_ctx = NULL - }; - httpd_uri_t favicon_16x16_uri = { - .uri = "/favicon-16x16.png", - .method = HTTP_GET, - .handler = favicon_16x16_handler, - .user_ctx = NULL - }; - httpd_uri_t favicon_32x32_uri = { - .uri = "/favicon-32x32.png", - .method = HTTP_GET, - .handler = favicon_32x32_handler, - .user_ctx = NULL - }; - httpd_uri_t favicon_ico_uri = { - .uri = "/favicon.ico", - .method = HTTP_GET, - .handler = favicon_ico_handler, - .user_ctx = NULL - }; - httpd_uri_t logo_svg_uri = { - .uri = "/logo.svg", - .method = HTTP_GET, - .handler = logo_svg_handler, - .user_ctx = NULL - }; - httpd_uri_t dump_uri = { - .uri = "/dump", - .method = HTTP_GET, - .handler = dump_handler, - .user_ctx = NULL - }; - httpd_uri_t stop_uri = { - .uri = "/stop", - .method = HTTP_GET, - .handler = stop_handler, - .user_ctx = NULL - }; - httpd_uri_t stream_uri = { - .uri = "/", - .method = HTTP_GET, - .handler = stream_handler, - .user_ctx = NULL - }; - httpd_uri_t streamviewer_uri = { - .uri = "/view", - .method = HTTP_GET, - .handler = streamviewer_handler, - .user_ctx = NULL - }; - httpd_uri_t info_uri = { - .uri = "/info", - .method = HTTP_GET, - .handler = info_handler, - .user_ctx = NULL - }; - httpd_uri_t error_uri = { - .uri = "/", - .method = HTTP_GET, - .handler = error_handler, - .user_ctx = NULL - }; - httpd_uri_t viewerror_uri = { - .uri = "/view", - .method = HTTP_GET, - .handler = error_handler, - .user_ctx = NULL - }; - - // Request Handlers; config.max_uri_handlers (above) must be >= the number of handlers - config.server_port = hPort; - config.ctrl_port = hPort; -// config.core_id = 1; - Log.printf("Starting web server on port: '%d'\r\n", config.server_port); - if (httpd_start(&camera_httpd, &config) == ESP_OK) { - if (critERR.length() > 0) { - httpd_register_uri_handler(camera_httpd, &error_uri); - } else { - httpd_register_uri_handler(camera_httpd, &index_uri); - httpd_register_uri_handler(camera_httpd, &cmd_uri); - httpd_register_uri_handler(camera_httpd, &status_uri); - httpd_register_uri_handler(camera_httpd, &capture_uri); - } - httpd_register_uri_handler(camera_httpd, &style_uri); - httpd_register_uri_handler(camera_httpd, &favicon_16x16_uri); - httpd_register_uri_handler(camera_httpd, &favicon_32x32_uri); - httpd_register_uri_handler(camera_httpd, &favicon_ico_uri); - httpd_register_uri_handler(camera_httpd, &logo_svg_uri); - httpd_register_uri_handler(camera_httpd, &dump_uri); - httpd_register_uri_handler(camera_httpd, &stop_uri); - } - - config.server_port = sPort; - config.ctrl_port = sPort; -// config.core_id = 0; - Log.printf("Starting stream server on port: '%d'\r\n", config.server_port); - if (httpd_start(&stream_httpd, &config) == ESP_OK) { - if (critERR.length() > 0) { - httpd_register_uri_handler(camera_httpd, &error_uri); - httpd_register_uri_handler(camera_httpd, &viewerror_uri); - } else { - httpd_register_uri_handler(stream_httpd, &stream_uri); - httpd_register_uri_handler(stream_httpd, &info_uri); - httpd_register_uri_handler(stream_httpd, &streamviewer_uri); - } - httpd_register_uri_handler(stream_httpd, &favicon_16x16_uri); - httpd_register_uri_handler(stream_httpd, &favicon_32x32_uri); - httpd_register_uri_handler(stream_httpd, &favicon_ico_uri); +void startCameraServer(int hPort, int sPort) { + httpd_config_t config = HTTPD_DEFAULT_CONFIG(); + config.max_uri_handlers = 16; // we use more than the default 8 (on port 80) + + httpd_uri_t index_uri = { + .uri = "/", + .method = HTTP_GET, + .handler = index_handler, + .user_ctx = NULL + }; + httpd_uri_t status_uri = { + .uri = "/status", + .method = HTTP_GET, + .handler = status_handler, + .user_ctx = NULL + }; + httpd_uri_t cmd_uri = { + .uri = "/control", + .method = HTTP_GET, + .handler = cmd_handler, + .user_ctx = NULL + }; + httpd_uri_t capture_uri = { + .uri = "/capture", + .method = HTTP_GET, + .handler = capture_handler, + .user_ctx = NULL + }; + httpd_uri_t style_uri = { + .uri = "/style.css", + .method = HTTP_GET, + .handler = style_handler, + .user_ctx = NULL + }; + httpd_uri_t favicon_16x16_uri = { + .uri = "/favicon-16x16.png", + .method = HTTP_GET, + .handler = favicon_16x16_handler, + .user_ctx = NULL + }; + httpd_uri_t favicon_32x32_uri = { + .uri = "/favicon-32x32.png", + .method = HTTP_GET, + .handler = favicon_32x32_handler, + .user_ctx = NULL + }; + httpd_uri_t favicon_ico_uri = { + .uri = "/favicon.ico", + .method = HTTP_GET, + .handler = favicon_ico_handler, + .user_ctx = NULL + }; + httpd_uri_t logo_svg_uri = { + .uri = "/logo.svg", + .method = HTTP_GET, + .handler = logo_svg_handler, + .user_ctx = NULL + }; + httpd_uri_t dump_uri = { + .uri = "/dump", + .method = HTTP_GET, + .handler = dump_handler, + .user_ctx = NULL + }; + httpd_uri_t stop_uri = { + .uri = "/stop", + .method = HTTP_GET, + .handler = stop_handler, + .user_ctx = NULL + }; + httpd_uri_t stream_uri = { + .uri = "/", + .method = HTTP_GET, + .handler = stream_handler, + .user_ctx = NULL + }; + httpd_uri_t streamviewer_uri = { + .uri = "/view", + .method = HTTP_GET, + .handler = streamviewer_handler, + .user_ctx = NULL + }; + httpd_uri_t info_uri = { + .uri = "/info", + .method = HTTP_GET, + .handler = info_handler, + .user_ctx = NULL + }; + httpd_uri_t error_uri = { + .uri = "/", + .method = HTTP_GET, + .handler = error_handler, + .user_ctx = NULL + }; + httpd_uri_t viewerror_uri = { + .uri = "/view", + .method = HTTP_GET, + .handler = error_handler, + .user_ctx = NULL + }; + + // Request Handlers; config.max_uri_handlers (above) must be >= the number of handlers + config.server_port = hPort; + config.ctrl_port = hPort; + // config.core_id = 1; + Log.printf("Starting web server on port: '%d'\r\n", config.server_port); + if (httpd_start(&camera_httpd, &config) == ESP_OK) { + if (critERR.length() > 0) { + httpd_register_uri_handler(camera_httpd, &error_uri); + } else { + httpd_register_uri_handler(camera_httpd, &index_uri); + httpd_register_uri_handler(camera_httpd, &cmd_uri); + httpd_register_uri_handler(camera_httpd, &status_uri); + httpd_register_uri_handler(camera_httpd, &capture_uri); + } + httpd_register_uri_handler(camera_httpd, &style_uri); + httpd_register_uri_handler(camera_httpd, &favicon_16x16_uri); + httpd_register_uri_handler(camera_httpd, &favicon_32x32_uri); + httpd_register_uri_handler(camera_httpd, &favicon_ico_uri); + httpd_register_uri_handler(camera_httpd, &logo_svg_uri); + httpd_register_uri_handler(camera_httpd, &dump_uri); + httpd_register_uri_handler(camera_httpd, &stop_uri); + } + + config.server_port = sPort; + config.ctrl_port = sPort; + config.core_id = 0; + Log.printf("Starting stream server on port: '%d'\r\n", config.server_port); + if (httpd_start(&stream_httpd, &config) == ESP_OK) { + if (critERR.length() > 0) { + httpd_register_uri_handler(camera_httpd, &error_uri); + httpd_register_uri_handler(camera_httpd, &viewerror_uri); + } else { + httpd_register_uri_handler(stream_httpd, &stream_uri); + httpd_register_uri_handler(stream_httpd, &info_uri); + httpd_register_uri_handler(stream_httpd, &streamviewer_uri); } + httpd_register_uri_handler(stream_httpd, &favicon_16x16_uri); + httpd_register_uri_handler(stream_httpd, &favicon_32x32_uri); + httpd_register_uri_handler(stream_httpd, &favicon_ico_uri); + } } From 1f22a5800b0a5c60dd5d92c57bc401ba352c9408 Mon Sep 17 00:00:00 2001 From: Zalgo <80800403+ZalgoSoft@users.noreply.github.com> Date: Sun, 19 Jun 2022 16:08:08 +0800 Subject: [PATCH 06/12] smooth ptz and remember last position to avoid jumping --- app_httpd.cpp | 16 +- esp32-cam-webserver.ino | 1164 ++++++++++++++++++++------------------- storage.cpp | 78 ++- storage.h | 4 + 4 files changed, 696 insertions(+), 566 deletions(-) diff --git a/app_httpd.cpp b/app_httpd.cpp index 6e46c51..03cf9df 100644 --- a/app_httpd.cpp +++ b/app_httpd.cpp @@ -451,7 +451,7 @@ static esp_err_t cmd_handler(httpd_req_t *req) { if (!strcmp(value, "up" )) { if (ptz_y <= 180) { ptz_y += Servo_Step; - servo1.write(ptz_y); +// servo1.write(ptz_y); } Log.printf("PTZ: %i\t%i\t", ptz_x, ptz_y); Log.println("Up"); @@ -459,7 +459,7 @@ static esp_err_t cmd_handler(httpd_req_t *req) { else if (!strcmp(value, "left" )) { if (ptz_x <= 180) { ptz_x += Servo_Step; - servo2.write(ptz_x); +// servo2.write(ptz_x); } Log.printf("PTZ: %i\t%i\t", ptz_x, ptz_y); Log.println("Left"); @@ -467,7 +467,7 @@ static esp_err_t cmd_handler(httpd_req_t *req) { else if (!strcmp(value, "right" )) { if (ptz_x >= 0) { ptz_x -= Servo_Step; - servo2.write(ptz_x); +// servo2.write(ptz_x); } Log.printf("PTZ: %i\t%i\t", ptz_x, ptz_y); Log.println("Right"); @@ -475,7 +475,7 @@ static esp_err_t cmd_handler(httpd_req_t *req) { else if (!strcmp(value, "down" )) { if (ptz_y >= 0) { ptz_y -= Servo_Step; - servo1.write(ptz_y); +// servo1.write(ptz_y); } Log.printf("PTZ: %i\t%i\t" , ptz_x , ptz_y); Log.println("Down"); @@ -483,22 +483,22 @@ static esp_err_t cmd_handler(httpd_req_t *req) { else if (!strcmp(value, "center" )) { ptz_x = 90; ptz_y = 90; - servo1.write(ptz_y); - servo2.write(ptz_x); +// servo1.write(ptz_y); +// servo2.write(ptz_x); Log.printf("PTZ: %i\t%i\t", ptz_x, ptz_y); Log.println("Center"); } } else if (!strcmp(variable, "ptz_x")) { if (val >= 0 && val <= 180 ) { ptz_x = val; - servo2.write(ptz_x); +// servo2.write(ptz_x); Log.printf("PTZ: %i\t", ptz_x); Log.println("PTZ pos x"); } } else if (!strcmp(variable, "ptz_y")) { if (val >= 0 && val <= 180 ) { ptz_y = val; - servo1.write(ptz_y); +// servo1.write(ptz_y); Log.printf("PTZ: %i\t", ptz_y); Log.println("PTZ pos y"); } diff --git a/esp32-cam-webserver.ino b/esp32-cam-webserver.ino index a576be4..28de137 100644 --- a/esp32-cam-webserver.ino +++ b/esp32-cam-webserver.ino @@ -11,7 +11,6 @@ #include -char *pcwriteBuffer[2048]; /* This sketch is a extension/expansion/reork of the 'official' ESP32 Camera example sketch from Expressif: @@ -63,6 +62,9 @@ stationList[] = {{"ESP32-CAM-CONNECT", "InsecurePassword", true}}; #include WebSerialStream webSerialStream = WebSerialStream(8514); TaskHandle_t TaskCore0Handle; +TaskHandle_t asyncPos1Handle; +TaskHandle_t xHandle; +const TickType_t xDelay = 10; // Upstream version string #include "src/version.h" @@ -81,8 +83,10 @@ Servo servo2; int Servo1Pin = 14; int Servo2Pin = 15; int Servo_Step = 5; -int ptz_y = 64; +int ptz_y = 120; int ptz_x = 64; +int ptz_y_now = 120; +int ptz_x_now = 64; // Sketch Info int sketchSize; @@ -264,7 +268,6 @@ void debugOff() { Log.println("Camera debug data is disabled (send 'd' for status dump, or any other char to enable debug)"); } -TaskHandle_t xHandle; // Serial input (debugging controls) void handleSerial() { if (Serial.available()) { @@ -275,665 +278,714 @@ void handleSerial() { Log.print("TaskCore0 start CPU "); Log.println(xPortGetCoreID()); } -/* else if (cmd == 'a' ) { - Log.println("incPrio()"); - xHandle = xTaskGetCurrentTaskHandle(); - Log.println(uxTaskPriorityGet( xHandle )); - vTaskPrioritySet( xHandle , uxTaskPriorityGet( xHandle) +1); - Log.println(uxTaskPriorityGet( xHandle )); - } - else if (cmd == 'z' ) { - Log.println("decPrio()"); - xHandle = xTaskGetCurrentTaskHandle(); - Log.println(uxTaskPriorityGet( xHandle )); - vTaskPrioritySet( xHandle , uxTaskPriorityGet( xHandle) -1); - Log.println(uxTaskPriorityGet( xHandle )); - } - else if (cmd == 'l' ) { - Log.println("listtasks()"); - Log.println( "Task Name\tStatus\tPrio\tHWM\tTask\tAffinity\n"); - vTaskList(&pcwriteBuffer); - Log.println( pcwriteBuffer); - }*/ - else { - if (debugData) debugOff(); - else debugOn(); - } + /* else if (cmd == 'a' ) { + Log.println("incPrio()"); + xHandle = xTaskGetCurrentTaskHandle(); + Log.println(uxTaskPriorityGet( xHandle )); + vTaskPrioritySet( xHandle , uxTaskPriorityGet( xHandle) +1); + Log.println(uxTaskPriorityGet( xHandle )); + } + else if (cmd == 'z' ) { + Log.println("decPrio()"); + xHandle = xTaskGetCurrentTaskHandle(); + Log.println(uxTaskPriorityGet( xHandle )); + vTaskPrioritySet( xHandle , uxTaskPriorityGet( xHandle) -1); + Log.println(uxTaskPriorityGet( xHandle )); + } + else if (cmd == 'l' ) { + Log.println("listtasks()"); + Log.println( "Task Name\tStatus\tPrio\tHWM\tTask\tAffinity\n"); + vTaskList(&pcwriteBuffer); + Log.println( pcwriteBuffer); + }*/ + else { + if (debugData) debugOff(); + else debugOn(); } - while (Serial.available()) Serial.read(); // chomp the buffer } + while (Serial.available()) Serial.read(); // chomp the buffer +} - // Notification LED - void flashLED(int flashtime) { +// Notification LED +void flashLED(int flashtime) { #if defined(LED_PIN) // If we have it; flash it. - digitalWrite(LED_PIN, LED_ON); // On at full power. - delay(flashtime); // delay - digitalWrite(LED_PIN, LED_OFF); // turn Off + digitalWrite(LED_PIN, LED_ON); // On at full power. + delay(flashtime); // delay + digitalWrite(LED_PIN, LED_OFF); // turn Off #else - return; // No notifcation LED, do nothing, no delay + return; // No notifcation LED, do nothing, no delay #endif - } +} - // Lamp Control - void setLamp(int newVal) { +// Lamp Control +void setLamp(int newVal) { #if defined(LAMP_PIN) - if (newVal != -1) { - // Apply a logarithmic function to the scale. - int brightness = round((pow(2, (1 + (newVal * 0.02))) - 2) / 6 * pwmMax); - ledcWrite(lampChannel, brightness); - Log.print("Lamp: "); - Log.print(newVal); - Log.print("%, pwm = "); - Log.println(brightness); - } -#endif + if (newVal != -1) { + // Apply a logarithmic function to the scale. + int brightness = round((pow(2, (1 + (newVal * 0.02))) - 2) / 6 * pwmMax); + ledcWrite(lampChannel, brightness); + Log.print("Lamp: "); + Log.print(newVal); + Log.print("%, pwm = "); + Log.println(brightness); } +#endif +} - void printLocalTime(bool extraData = false) { - struct tm timeinfo; - if (!getLocalTime(&timeinfo)) { - Log.println("Failed to obtain time"); - } else { - Log.println(&timeinfo, "%H:%M:%S, %A, %B %d %Y"); - } - if (extraData) { - Log.printf("NTP Server: %s, GMT Offset: %li(s), DST Offset: %i(s)\r\n", ntpServer, gmtOffset_sec, daylightOffset_sec); - } +void printLocalTime(bool extraData = false) { + struct tm timeinfo; + if (!getLocalTime(&timeinfo)) { + Log.println("Failed to obtain time"); + } else { + Log.println(&timeinfo, "%H:%M:%S, %A, %B %d %Y"); } + if (extraData) { + Log.printf("NTP Server: %s, GMT Offset: %li(s), DST Offset: %i(s)\r\n", ntpServer, gmtOffset_sec, daylightOffset_sec); + } +} - void TaskCore0 (void * pvParameters ) { - Log.print("TaskCore0 start CPU "); - Log.println(xPortGetCoreID()); - // Start the camera server - startCameraServer(httpPort, streamPort); - if (critERR.length() == 0) { - Log.printf("\r\nCamera Ready!\r\nUse '%s' to connect\r\n", httpURL); - Log.printf("Stream viewer available at '%sview'\r\n", streamURL); - Log.printf("Raw stream URL is '%s'\r\n", streamURL); +void TaskCore0 (void * pvParameters ) { + Log.print("TaskCore0 start CPU "); + Log.println(xPortGetCoreID()); + // Start the camera server + startCameraServer(httpPort, streamPort); + if (critERR.length() == 0) { + Log.printf("\r\nCamera Ready!\r\nUse '%s' to connect\r\n", httpURL); + Log.printf("Stream viewer available at '%sview'\r\n", streamURL); + Log.printf("Raw stream URL is '%s'\r\n", streamURL); #if defined(DEBUG_DEFAULT_ON) - debugOn(); + debugOn(); #else - debugOff(); + debugOff(); #endif - } else { - Log.printf("\r\nCamera unavailable due to initialisation errors.\r\n\r\n"); + } else { + Log.printf("\r\nCamera unavailable due to initialisation errors.\r\n\r\n"); + } + // Info line; use for Info messages; eg 'This is a Beta!' warnings, etc. as necesscary + Log.print("\r\nThis is the 4.1 beta\r\n"); + // do something every 5 seconds. + static unsigned long last_report = millis(); + for (;;) { + Log.loop(); + if (millis() - last_report < 7 * 1000) + { + vApplicationMinimalIdleHook( ); } - // Info line; use for Info messages; eg 'This is a Beta!' warnings, etc. as necesscary - Log.print("\r\nThis is the 4.1 beta\r\n"); - // do something every 5 seconds. - static unsigned long last_report = millis(); - for (;;) { - Log.loop(); - if (millis() - last_report < 8 * 1000) - { - vApplicationMinimalIdleHook( ); + else { + //Log.print (millis()); + //Log.print(" CPU "); Log.println(xPortGetCoreID()); + last_report = millis(); + //vTaskGetRunTimeStats( char *pcWriteBuffer ); + vApplicationMinimalIdleHook( ); + } + } +} +void asyncPos (void * pvParameters ) { + Log.print("asyncPos start CPU "); + Log.println(xPortGetCoreID()); + // Start the camera server + // Info line; use for Info messages; eg 'This is a Beta!' warnings, etc. as necesscary + Log.print("\r\nasyncPos thread.\r\n"); + // do something every 5 seconds. + bool isYreached = false; + bool isXreached = false; + bool isPrefPosChanged = true; + int periodtimer = 10; + if ((int)pvParameters != 0 || (int)pvParameters != NULL) + periodtimer = (int)&pvParameters; + static unsigned long lastTime = millis(); + for (;;) { + Log.loop(); + if (millis() - lastTime < periodtimer) + { + vApplicationMinimalIdleHook( ); + } + else { + if (ptz_y_now != ptz_y) { + isYreached = false; + isPrefPosChanged = true; + if (ptz_y < ptz_y_now) ptz_y_now--; + else ptz_y_now ++; + servo1.write(ptz_y_now); } - else { - //Log.print (millis()); - //Log.print(" CPU "); Log.println(xPortGetCoreID()); - last_report = millis(); - vTaskGetRunTimeStats( char *pcWriteBuffer ); - - vApplicationMinimalIdleHook( ); + else + isYreached = true; + if (ptz_x_now != ptz_x) { + isXreached = false; + isPrefPosChanged = true; + if (ptz_x < ptz_x_now) ptz_x_now--; + else ptz_x_now++; + servo2.write(ptz_x_now); + } + else + isXreached = true; + if ( isYreached && isXreached && isPrefPosChanged ) + { + saveprefpos(); + isPrefPosChanged = false; } + lastTime = millis(); + vApplicationMinimalIdleHook( ); } } +} - void calcURLs() { - // Set the URL's +void calcURLs() { + // Set the URL's #if defined(URL_HOSTNAME) - if (httpPort != 80) { - sprintf(httpURL, "http://%s:%d/", URL_HOSTNAME, httpPort); - } else { - sprintf(httpURL, "http://%s/", URL_HOSTNAME); - } - sprintf(streamURL, "http://%s:%d/", URL_HOSTNAME, streamPort); + if (httpPort != 80) { + sprintf(httpURL, "http://%s:%d/", URL_HOSTNAME, httpPort); + } else { + sprintf(httpURL, "http://%s/", URL_HOSTNAME); + } + sprintf(streamURL, "http://%s:%d/", URL_HOSTNAME, streamPort); #else - Log.println("Setting httpURL"); - if (httpPort != 80) { - sprintf(httpURL, "http://%d.%d.%d.%d:%d/", ip[0], ip[1], ip[2], ip[3], httpPort); - } else { - sprintf(httpURL, "http://%d.%d.%d.%d/", ip[0], ip[1], ip[2], ip[3]); - } - sprintf(streamURL, "http://%d.%d.%d.%d:%d/", ip[0], ip[1], ip[2], ip[3], streamPort); -#endif + Log.println("Setting httpURL"); + if (httpPort != 80) { + sprintf(httpURL, "http://%d.%d.%d.%d:%d/", ip[0], ip[1], ip[2], ip[3], httpPort); + } else { + sprintf(httpURL, "http://%d.%d.%d.%d/", ip[0], ip[1], ip[2], ip[3]); } + sprintf(streamURL, "http://%d.%d.%d.%d:%d/", ip[0], ip[1], ip[2], ip[3], streamPort); +#endif +} - void StartCamera() { - Log.print("StartCamera CPU "); - Log.println(xPortGetCoreID()); - // Populate camera config structure with hardware and other defaults - config.ledc_channel = LEDC_CHANNEL_0; - config.ledc_timer = LEDC_TIMER_0; - config.pin_d0 = Y2_GPIO_NUM; - config.pin_d1 = Y3_GPIO_NUM; - config.pin_d2 = Y4_GPIO_NUM; - config.pin_d3 = Y5_GPIO_NUM; - config.pin_d4 = Y6_GPIO_NUM; - config.pin_d5 = Y7_GPIO_NUM; - config.pin_d6 = Y8_GPIO_NUM; - config.pin_d7 = Y9_GPIO_NUM; - config.pin_xclk = XCLK_GPIO_NUM; - config.pin_pclk = PCLK_GPIO_NUM; - config.pin_vsync = VSYNC_GPIO_NUM; - config.pin_href = HREF_GPIO_NUM; - config.pin_sscb_sda = SIOD_GPIO_NUM; - config.pin_sscb_scl = SIOC_GPIO_NUM; - config.pin_pwdn = PWDN_GPIO_NUM; - config.pin_reset = RESET_GPIO_NUM; - config.xclk_freq_hz = xclk * 1000000; - config.pixel_format = PIXFORMAT_JPEG; - config.grab_mode = CAMERA_GRAB_LATEST; - // Pre-allocate large buffers - if (psramFound()) { - config.frame_size = FRAMESIZE_UXGA; - config.jpeg_quality = 10; - config.fb_count = 2; - } else { - config.frame_size = FRAMESIZE_SVGA; - config.jpeg_quality = 12; - config.fb_count = 1; - } +void StartCamera() { + Log.print("StartCamera CPU "); + Log.println(xPortGetCoreID()); + // Populate camera config structure with hardware and other defaults + config.ledc_channel = LEDC_CHANNEL_0; + config.ledc_timer = LEDC_TIMER_0; + config.pin_d0 = Y2_GPIO_NUM; + config.pin_d1 = Y3_GPIO_NUM; + config.pin_d2 = Y4_GPIO_NUM; + config.pin_d3 = Y5_GPIO_NUM; + config.pin_d4 = Y6_GPIO_NUM; + config.pin_d5 = Y7_GPIO_NUM; + config.pin_d6 = Y8_GPIO_NUM; + config.pin_d7 = Y9_GPIO_NUM; + config.pin_xclk = XCLK_GPIO_NUM; + config.pin_pclk = PCLK_GPIO_NUM; + config.pin_vsync = VSYNC_GPIO_NUM; + config.pin_href = HREF_GPIO_NUM; + config.pin_sscb_sda = SIOD_GPIO_NUM; + config.pin_sscb_scl = SIOC_GPIO_NUM; + config.pin_pwdn = PWDN_GPIO_NUM; + config.pin_reset = RESET_GPIO_NUM; + config.xclk_freq_hz = xclk * 1000000; + config.pixel_format = PIXFORMAT_JPEG; + config.grab_mode = CAMERA_GRAB_LATEST; + // Pre-allocate large buffers + if (psramFound()) { + config.frame_size = FRAMESIZE_UXGA; + config.jpeg_quality = 10; + config.fb_count = 2; + } else { + config.frame_size = FRAMESIZE_SVGA; + config.jpeg_quality = 12; + config.fb_count = 1; + } #if defined(CAMERA_MODEL_ESP_EYE) - pinMode(13, INPUT_PULLUP); - pinMode(14, INPUT_PULLUP); -#endif - - // camera init - esp_err_t err = esp_camera_init(&config); - if (err != ESP_OK) { - delay(100); // need a delay here or the next serial o/p gets missed - Log.printf("\r\n\r\nCRITICAL FAILURE: Camera sensor failed to initialise.\r\n\r\n"); - Log.printf("A full (hard, power off/on) reboot will probably be needed to recover from this.\r\n"); - Log.printf("Meanwhile; this unit will reboot in 1 minute since these errors sometime clear automatically\r\n"); - // Reset the I2C bus.. may help when rebooting. - periph_module_disable(PERIPH_I2C0_MODULE); // try to shut I2C down properly in case that is the problem - periph_module_disable(PERIPH_I2C1_MODULE); - periph_module_reset(PERIPH_I2C0_MODULE); - periph_module_reset(PERIPH_I2C1_MODULE); - // And set the error text for the UI - critERR = "

Error!


Camera module failed to initialise!

Please reset (power off/on) the camera.

"; - critERR += "

We will continue to reboot once per minute since this error sometimes clears automatically.

"; - // Start a 60 second watchdog timer - esp_task_wdt_init(60, true); - esp_task_wdt_add(NULL); - } else { - Log.println("Camera init succeeded"); - - // Get a reference to the sensor - sensor_t * s = esp_camera_sensor_get(); - - // Dump camera module, warn for unsupported modules. - sensorPID = s->id.PID; - switch (sensorPID) { - case OV9650_PID: Log.println("WARNING: OV9650 camera module is not properly supported, will fallback to OV2640 operation"); break; - case OV7725_PID: Log.println("WARNING: OV7725 camera module is not properly supported, will fallback to OV2640 operation"); break; - case OV2640_PID: Log.println("OV2640 camera module detected"); break; - case OV3660_PID: Log.println("OV3660 camera module detected"); break; - default: Log.println("WARNING: Camera module is unknown and not properly supported, will fallback to OV2640 operation"); - } + pinMode(13, INPUT_PULLUP); + pinMode(14, INPUT_PULLUP); +#endif + + // camera init + esp_err_t err = esp_camera_init(&config); + if (err != ESP_OK) { + delay(100); // need a delay here or the next serial o/p gets missed + Log.printf("\r\n\r\nCRITICAL FAILURE: Camera sensor failed to initialise.\r\n\r\n"); + Log.printf("A full (hard, power off/on) reboot will probably be needed to recover from this.\r\n"); + Log.printf("Meanwhile; this unit will reboot in 1 minute since these errors sometime clear automatically\r\n"); + // Reset the I2C bus.. may help when rebooting. + periph_module_disable(PERIPH_I2C0_MODULE); // try to shut I2C down properly in case that is the problem + periph_module_disable(PERIPH_I2C1_MODULE); + periph_module_reset(PERIPH_I2C0_MODULE); + periph_module_reset(PERIPH_I2C1_MODULE); + // And set the error text for the UI + critERR = "

Error!


Camera module failed to initialise!

Please reset (power off/on) the camera.

"; + critERR += "

We will continue to reboot once per minute since this error sometimes clears automatically.

"; + // Start a 60 second watchdog timer + esp_task_wdt_init(60, true); + esp_task_wdt_add(NULL); + } else { + Log.println("Camera init succeeded"); + + // Get a reference to the sensor + sensor_t * s = esp_camera_sensor_get(); + + // Dump camera module, warn for unsupported modules. + sensorPID = s->id.PID; + switch (sensorPID) { + case OV9650_PID: Log.println("WARNING: OV9650 camera module is not properly supported, will fallback to OV2640 operation"); break; + case OV7725_PID: Log.println("WARNING: OV7725 camera module is not properly supported, will fallback to OV2640 operation"); break; + case OV2640_PID: Log.println("OV2640 camera module detected"); break; + case OV3660_PID: Log.println("OV3660 camera module detected"); break; + default: Log.println("WARNING: Camera module is unknown and not properly supported, will fallback to OV2640 operation"); + } - // OV3660 initial sensors are flipped vertically and colors are a bit saturated - if (sensorPID == OV3660_PID) { - s->set_vflip(s, 1); //flip it back - s->set_brightness(s, 1); //up the blightness just a bit - s->set_saturation(s, -2); //lower the saturation - } + // OV3660 initial sensors are flipped vertically and colors are a bit saturated + if (sensorPID == OV3660_PID) { + s->set_vflip(s, 1); //flip it back + s->set_brightness(s, 1); //up the blightness just a bit + s->set_saturation(s, -2); //lower the saturation + } - // M5 Stack Wide has special needs + // M5 Stack Wide has special needs #if defined(CAMERA_MODEL_M5STACK_WIDE) - s->set_vflip(s, 1); - s->set_hmirror(s, 1); + s->set_vflip(s, 1); + s->set_hmirror(s, 1); #endif - // Config can override mirror and flip + // Config can override mirror and flip #if defined(H_MIRROR) - s->set_hmirror(s, H_MIRROR); + s->set_hmirror(s, H_MIRROR); #endif #if defined(V_FLIP) - s->set_vflip(s, V_FLIP); + s->set_vflip(s, V_FLIP); #endif - // set initial frame rate + // set initial frame rate #if defined(DEFAULT_RESOLUTION) - s->set_framesize(s, DEFAULT_RESOLUTION); + s->set_framesize(s, DEFAULT_RESOLUTION); #else - s->set_framesize(s, FRAMESIZE_SVGA); -#endif - - /* - Add any other defaults you want to apply at startup here: - uncomment the line and set the value as desired (see the comments) - - these are defined in the esp headers here: - https://github.com/espressif/esp32-camera/blob/master/driver/include/sensor.h#L149 - */ - - //s->set_framesize(s, FRAMESIZE_SVGA); // FRAMESIZE_[QQVGA|HQVGA|QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA|QXGA(ov3660)]); - //s->set_quality(s, val); // 10 to 63 - //s->set_brightness(s, 0); // -2 to 2 - //s->set_contrast(s, 0); // -2 to 2 - //s->set_saturation(s, 0); // -2 to 2 - //s->set_special_effect(s, 0); // 0 to 6 (0 - No Effect, 1 - Negative, 2 - Grayscale, 3 - Red Tint, 4 - Green Tint, 5 - Blue Tint, 6 - Sepia) - //s->set_whitebal(s, 1); // aka 'awb' in the UI; 0 = disable , 1 = enable - //s->set_awb_gain(s, 1); // 0 = disable , 1 = enable - //s->set_wb_mode(s, 0); // 0 to 4 - if awb_gain enabled (0 - Auto, 1 - Sunny, 2 - Cloudy, 3 - Office, 4 - Home) - //s->set_exposure_ctrl(s, 1); // 0 = disable , 1 = enable - //s->set_aec2(s, 0); // 0 = disable , 1 = enable - //s->set_ae_level(s, 0); // -2 to 2 - //s->set_aec_value(s, 300); // 0 to 1200 - //s->set_gain_ctrl(s, 1); // 0 = disable , 1 = enable - //s->set_agc_gain(s, 0); // 0 to 30 - //s->set_gainceiling(s, (gainceiling_t)0); // 0 to 6 - //s->set_bpc(s, 0); // 0 = disable , 1 = enable - //s->set_wpc(s, 1); // 0 = disable , 1 = enable - //s->set_raw_gma(s, 1); // 0 = disable , 1 = enable - //s->set_lenc(s, 1); // 0 = disable , 1 = enable - //s->set_hmirror(s, 0); // 0 = disable , 1 = enable - //s->set_vflip(s, 0); // 0 = disable , 1 = enable - //s->set_dcw(s, 1); // 0 = disable , 1 = enable - //s->set_colorbar(s, 0); // 0 = disable , 1 = enable - } - // We now have camera with default init - } + s->set_framesize(s, FRAMESIZE_SVGA); +#endif - void WifiSetup() { - // Feedback that we are now attempting to connect - flashLED(300); - delay(100); - flashLED(300); - Log.println("Starting WiFi"); + /* + Add any other defaults you want to apply at startup here: + uncomment the line and set the value as desired (see the comments) - // Disable power saving on WiFi to improve responsiveness - // (https://github.com/espressif/arduino-esp32/issues/1484) - WiFi.setSleep(false); + these are defined in the esp headers here: + https://github.com/espressif/esp32-camera/blob/master/driver/include/sensor.h#L149 + */ - Log.print("Known external SSIDs: "); - if (stationCount > firstStation) { - for (int i = firstStation; i < stationCount; i++) Log.printf(" '%s'", stationList[i].ssid); - } else { - Log.print("None"); - } - Log.println(); - byte mac[6] = {0, 0, 0, 0, 0, 0}; - WiFi.macAddress(mac); - Log.printf("MAC address: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); - - int bestStation = -1; - long bestRSSI = -1024; - char bestSSID[65] = ""; - uint8_t bestBSSID[6]; - if (stationCount > firstStation) { - // We have a list to scan - Log.printf("Scanning local Wifi Networks\r\n"); - int stationsFound = WiFi.scanNetworks(); - Log.printf("%i networks found\r\n", stationsFound); - if (stationsFound > 0) { - for (int i = 0; i < stationsFound; ++i) { - // Print SSID and RSSI for each network found - String thisSSID = WiFi.SSID(i); - int thisRSSI = WiFi.RSSI(i); - String thisBSSID = WiFi.BSSIDstr(i); - Log.printf("%3i : [%s] %s (%i)", i + 1, thisBSSID.c_str(), thisSSID.c_str(), thisRSSI); - // Scan our list of known external stations - for (int sta = firstStation; sta < stationCount; sta++) { - if ((strcmp(stationList[sta].ssid, thisSSID.c_str()) == 0) || - (strcmp(stationList[sta].ssid, thisBSSID.c_str()) == 0)) { - Log.print(" - Known!"); - // Chose the strongest RSSI seen - if (thisRSSI > bestRSSI) { - bestStation = sta; - strncpy(bestSSID, thisSSID.c_str(), 64); - // Convert char bssid[] to a byte array - parseBytes(thisBSSID.c_str(), ':', bestBSSID, 6, 16); - bestRSSI = thisRSSI; - } + //s->set_framesize(s, FRAMESIZE_SVGA); // FRAMESIZE_[QQVGA|HQVGA|QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA|QXGA(ov3660)]); + //s->set_quality(s, val); // 10 to 63 + //s->set_brightness(s, 0); // -2 to 2 + //s->set_contrast(s, 0); // -2 to 2 + //s->set_saturation(s, 0); // -2 to 2 + //s->set_special_effect(s, 0); // 0 to 6 (0 - No Effect, 1 - Negative, 2 - Grayscale, 3 - Red Tint, 4 - Green Tint, 5 - Blue Tint, 6 - Sepia) + //s->set_whitebal(s, 1); // aka 'awb' in the UI; 0 = disable , 1 = enable + //s->set_awb_gain(s, 1); // 0 = disable , 1 = enable + //s->set_wb_mode(s, 0); // 0 to 4 - if awb_gain enabled (0 - Auto, 1 - Sunny, 2 - Cloudy, 3 - Office, 4 - Home) + //s->set_exposure_ctrl(s, 1); // 0 = disable , 1 = enable + //s->set_aec2(s, 0); // 0 = disable , 1 = enable + //s->set_ae_level(s, 0); // -2 to 2 + //s->set_aec_value(s, 300); // 0 to 1200 + //s->set_gain_ctrl(s, 1); // 0 = disable , 1 = enable + //s->set_agc_gain(s, 0); // 0 to 30 + //s->set_gainceiling(s, (gainceiling_t)0); // 0 to 6 + //s->set_bpc(s, 0); // 0 = disable , 1 = enable + //s->set_wpc(s, 1); // 0 = disable , 1 = enable + //s->set_raw_gma(s, 1); // 0 = disable , 1 = enable + //s->set_lenc(s, 1); // 0 = disable , 1 = enable + //s->set_hmirror(s, 0); // 0 = disable , 1 = enable + //s->set_vflip(s, 0); // 0 = disable , 1 = enable + //s->set_dcw(s, 1); // 0 = disable , 1 = enable + //s->set_colorbar(s, 0); // 0 = disable , 1 = enable + } + // We now have camera with default init +} + +void WifiSetup() { + // Feedback that we are now attempting to connect + flashLED(300); + delay(100); + flashLED(300); + Log.println("Starting WiFi"); + + // Disable power saving on WiFi to improve responsiveness + // (https://github.com/espressif/arduino-esp32/issues/1484) + WiFi.setSleep(false); + + Log.print("Known external SSIDs: "); + if (stationCount > firstStation) { + for (int i = firstStation; i < stationCount; i++) Log.printf(" '%s'", stationList[i].ssid); + } else { + Log.print("None"); + } + Log.println(); + byte mac[6] = {0, 0, 0, 0, 0, 0}; + WiFi.macAddress(mac); + Log.printf("MAC address: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + + int bestStation = -1; + long bestRSSI = -1024; + char bestSSID[65] = ""; + uint8_t bestBSSID[6]; + if (stationCount > firstStation) { + // We have a list to scan + Log.printf("Scanning local Wifi Networks\r\n"); + int stationsFound = WiFi.scanNetworks(); + Log.printf("%i networks found\r\n", stationsFound); + if (stationsFound > 0) { + for (int i = 0; i < stationsFound; ++i) { + // Print SSID and RSSI for each network found + String thisSSID = WiFi.SSID(i); + int thisRSSI = WiFi.RSSI(i); + String thisBSSID = WiFi.BSSIDstr(i); + Log.printf("%3i : [%s] %s (%i)", i + 1, thisBSSID.c_str(), thisSSID.c_str(), thisRSSI); + // Scan our list of known external stations + for (int sta = firstStation; sta < stationCount; sta++) { + if ((strcmp(stationList[sta].ssid, thisSSID.c_str()) == 0) || + (strcmp(stationList[sta].ssid, thisBSSID.c_str()) == 0)) { + Log.print(" - Known!"); + // Chose the strongest RSSI seen + if (thisRSSI > bestRSSI) { + bestStation = sta; + strncpy(bestSSID, thisSSID.c_str(), 64); + // Convert char bssid[] to a byte array + parseBytes(thisBSSID.c_str(), ':', bestBSSID, 6, 16); + bestRSSI = thisRSSI; } } - Log.println(); } + Log.println(); } - } else { - // No list to scan, therefore we are an accesspoint - accesspoint = true; } + } else { + // No list to scan, therefore we are an accesspoint + accesspoint = true; + } - if (bestStation == -1) { - if (!accesspoint) { + if (bestStation == -1) { + if (!accesspoint) { #if defined(WIFI_AP_ENABLE) - Log.println("No known networks found, entering AccessPoint fallback mode"); - accesspoint = true; + Log.println("No known networks found, entering AccessPoint fallback mode"); + accesspoint = true; #else - Log.println("No known networks found"); + Log.println("No known networks found"); #endif - } else { - Log.println("AccessPoint mode selected in config"); - } } else { - Log.printf("Connecting to Wifi Network %d: [%02X:%02X:%02X:%02X:%02X:%02X] %s \r\n", - bestStation, bestBSSID[0], bestBSSID[1], bestBSSID[2], bestBSSID[3], - bestBSSID[4], bestBSSID[5], bestSSID); - // Apply static settings if necesscary - if (stationList[bestStation].dhcp == false) { + Log.println("AccessPoint mode selected in config"); + } + } else { + Log.printf("Connecting to Wifi Network %d: [%02X:%02X:%02X:%02X:%02X:%02X] %s \r\n", + bestStation, bestBSSID[0], bestBSSID[1], bestBSSID[2], bestBSSID[3], + bestBSSID[4], bestBSSID[5], bestSSID); + // Apply static settings if necesscary + if (stationList[bestStation].dhcp == false) { #if defined(ST_IP) - Log.println("Applying static IP settings"); + Log.println("Applying static IP settings"); #if !defined (ST_GATEWAY) || !defined (ST_NETMASK) #error "You must supply both Gateway and NetMask when specifying a static IP address" #endif - IPAddress staticIP(ST_IP); - IPAddress gateway(ST_GATEWAY); - IPAddress subnet(ST_NETMASK); + IPAddress staticIP(ST_IP); + IPAddress gateway(ST_GATEWAY); + IPAddress subnet(ST_NETMASK); #if !defined(ST_DNS1) - WiFi.config(staticIP, gateway, subnet); + WiFi.config(staticIP, gateway, subnet); #else - IPAddress dns1(ST_DNS1); + IPAddress dns1(ST_DNS1); #if !defined(ST_DNS2) - WiFi.config(staticIP, gateway, subnet, dns1); + WiFi.config(staticIP, gateway, subnet, dns1); #else - IPAddress dns2(ST_DNS2); - WiFi.config(staticIP, gateway, subnet, dns1, dns2); + IPAddress dns2(ST_DNS2); + WiFi.config(staticIP, gateway, subnet, dns1, dns2); #endif #endif #else - Log.println("Static IP settings requested but not defined in config, falling back to dhcp"); + Log.println("Static IP settings requested but not defined in config, falling back to dhcp"); #endif - } + } - WiFi.setHostname(mdnsName); + WiFi.setHostname(mdnsName); - // Initiate network connection request (3rd argument, channel = 0 is 'auto') - WiFi.begin(bestSSID, stationList[bestStation].password, 0, bestBSSID); + // Initiate network connection request (3rd argument, channel = 0 is 'auto') + WiFi.begin(bestSSID, stationList[bestStation].password, 0, bestBSSID); - // Wait to connect, or timeout - unsigned long start = millis(); - while ((millis() - start <= WIFI_WATCHDOG) && (WiFi.status() != WL_CONNECTED)) { - delay(500); - Log.print('.'); - } - Log.println(); - Log.begin(); - // If we have connected, inform user - if (WiFi.status() == WL_CONNECTED) { - Log.println("Client connection succeeded"); - accesspoint = false; - // Note IP details - ip = WiFi.localIP(); - net = WiFi.subnetMask(); - gw = WiFi.gatewayIP(); - Log.printf("IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); - Log.printf("Netmask : %d.%d.%d.%d\r\n", net[0], net[1], net[2], net[3]); - Log.printf("Gateway : %d.%d.%d.%d\r\n", gw[0], gw[1], gw[2], gw[3]); - calcURLs(); - // Flash the LED to show we are connected - for (int i = 0; i < 5; i++) { - flashLED(50); - delay(150); - } - } else { - Log.println("Client connection Failed"); - WiFi.disconnect(); // (resets the WiFi scan) - } + // Wait to connect, or timeout + unsigned long start = millis(); + while ((millis() - start <= WIFI_WATCHDOG) && (WiFi.status() != WL_CONNECTED)) { + delay(500); + Log.print('.'); } - - if (accesspoint && (WiFi.status() != WL_CONNECTED)) { - // The accesspoint has been enabled, and we have not connected to any existing networks -#if defined(AP_CHAN) - Log.println("Setting up Fixed Channel AccessPoint"); - Log.print(" SSID : "); - Log.println(stationList[0].ssid); - Log.print(" Password : "); - Log.println(stationList[0].password); - Log.print(" Channel : "); - Log.println(AP_CHAN); - WiFi.softAP(stationList[0].ssid, stationList[0].password, AP_CHAN); -# else - Log.println("Setting up AccessPoint"); - Log.print(" SSID : "); - Log.println(stationList[0].ssid); - Log.print(" Password : "); - Log.println(stationList[0].password); - WiFi.softAP(stationList[0].ssid, stationList[0].password); -#endif -#if defined(AP_ADDRESS) - // User has specified the AP details; apply them after a short delay - // (https://github.com/espressif/arduino-esp32/issues/985#issuecomment-359157428) - delay(100); - IPAddress local_IP(AP_ADDRESS); - IPAddress gateway(AP_ADDRESS); - IPAddress subnet(255, 255, 255, 0); - WiFi.softAPConfig(local_IP, gateway, subnet); -#endif - // Note AP details - ip = WiFi.softAPIP(); + Log.println(); + Log.begin(); + // If we have connected, inform user + if (WiFi.status() == WL_CONNECTED) { + Log.println("Client connection succeeded"); + accesspoint = false; + // Note IP details + ip = WiFi.localIP(); net = WiFi.subnetMask(); gw = WiFi.gatewayIP(); - strcpy(apName, stationList[0].ssid); Log.printf("IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); + Log.printf("Netmask : %d.%d.%d.%d\r\n", net[0], net[1], net[2], net[3]); + Log.printf("Gateway : %d.%d.%d.%d\r\n", gw[0], gw[1], gw[2], gw[3]); calcURLs(); // Flash the LED to show we are connected for (int i = 0; i < 5; i++) { - flashLED(150); - delay(50); - } - // Start the DNS captive portal if requested - if (stationList[0].dhcp == true) { - Log.println("Starting Captive Portal"); - dnsServer.start(DNS_PORT, "*", ip); - captivePortal = true; + flashLED(50); + delay(150); } + } else { + Log.println("Client connection Failed"); + WiFi.disconnect(); // (resets the WiFi scan) } } - void setup() { - Serial.begin(115200); - Serial.setDebugOutput(true); - Log.addPrintStream(std::make_shared(webSerialStream)); - if (stationCount == 0) { - Log.println("\r\nFatal Error; Halting"); - while (true) { - Log.println("No wifi details have been configured; we cannot connect to existing WiFi or start our own AccessPoint, there is no point in proceeding."); - delay(5000); - } + if (accesspoint && (WiFi.status() != WL_CONNECTED)) { + // The accesspoint has been enabled, and we have not connected to any existing networks +#if defined(AP_CHAN) + Log.println("Setting up Fixed Channel AccessPoint"); + Log.print(" SSID : "); + Log.println(stationList[0].ssid); + Log.print(" Password : "); + Log.println(stationList[0].password); + Log.print(" Channel : "); + Log.println(AP_CHAN); + WiFi.softAP(stationList[0].ssid, stationList[0].password, AP_CHAN); +# else + Log.println("Setting up AccessPoint"); + Log.print(" SSID : "); + Log.println(stationList[0].ssid); + Log.print(" Password : "); + Log.println(stationList[0].password); + WiFi.softAP(stationList[0].ssid, stationList[0].password); +#endif +#if defined(AP_ADDRESS) + // User has specified the AP details; apply them after a short delay + // (https://github.com/espressif/arduino-esp32/issues/985#issuecomment-359157428) + delay(100); + IPAddress local_IP(AP_ADDRESS); + IPAddress gateway(AP_ADDRESS); + IPAddress subnet(255, 255, 255, 0); + WiFi.softAPConfig(local_IP, gateway, subnet); +#endif + // Note AP details + ip = WiFi.softAPIP(); + net = WiFi.subnetMask(); + gw = WiFi.gatewayIP(); + strcpy(apName, stationList[0].ssid); + Log.printf("IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); + calcURLs(); + // Flash the LED to show we are connected + for (int i = 0; i < 5; i++) { + flashLED(150); + delay(50); } - // Start Wifi and loop until we are connected or have started an AccessPoint - while ((WiFi.status() != WL_CONNECTED) && !accesspoint) { - WifiSetup(); + // Start the DNS captive portal if requested + if (stationList[0].dhcp == true) { + Log.println("Starting Captive Portal"); + dnsServer.start(DNS_PORT, "*", ip); + captivePortal = true; } - Log.begin(); - Log.print("setup: Log.begin(), CPU "); - Log.println(xPortGetCoreID()); - Log.println(); - Log.println("===="); - Log.print("esp32-cam-webserver: "); - Log.println(myName); - Log.print("Code Built: "); - Log.println(myVer); - Log.print("Base Release: "); - Log.println(baseVersion); - Log.println(); - // Warn if no PSRAM is detected (typically user error with board selection in the IDE) - if (!psramFound()) { - Log.println("\r\nFatal Error; Halting"); - while (true) { - Log.println("No PSRAM found; camera cannot be initialised: Please check the board config for your module."); - delay(5000); - } + } +} + +void setup() { + Serial.begin(115200); + Serial.setDebugOutput(true); + Log.addPrintStream(std::make_shared(webSerialStream)); + if (stationCount == 0) { + Log.println("\r\nFatal Error; Halting"); + while (true) { + Log.println("No wifi details have been configured; we cannot connect to existing WiFi or start our own AccessPoint, there is no point in proceeding."); + delay(5000); + } + } + // Start Wifi and loop until we are connected or have started an AccessPoint + while ((WiFi.status() != WL_CONNECTED) && !accesspoint) { + WifiSetup(); + } + Log.begin(); + Log.print("setup: Log.begin(), CPU "); + Log.println(xPortGetCoreID()); + Log.println(); + Log.println("===="); + Log.print("esp32-cam-webserver: "); + Log.println(myName); + Log.print("Code Built: "); + Log.println(myVer); + Log.print("Base Release: "); + Log.println(baseVersion); + Log.println(); + // Warn if no PSRAM is detected (typically user error with board selection in the IDE) + if (!psramFound()) { + Log.println("\r\nFatal Error; Halting"); + while (true) { + Log.println("No PSRAM found; camera cannot be initialised: Please check the board config for your module."); + delay(5000); } + } #if defined(LED_PIN) // If we have a notification LED, set it to output - pinMode(LED_PIN, OUTPUT); - digitalWrite(LED_PIN, LED_ON); + pinMode(LED_PIN, OUTPUT); + digitalWrite(LED_PIN, LED_ON); #endif - // Start the SPIFFS filesystem before we initialise the camera - if (filesystem) { - filesystemStart(); - delay(200); // a short delay to let spi bus settle after SPIFFS init - } - - // Start (init) the camera - StartCamera(); + // Start the SPIFFS filesystem before we initialise the camera + if (filesystem) { + filesystemStart(); + delay(200); // a short delay to let spi bus settle after SPIFFS init + } - // Now load and apply any saved preferences - if (filesystem) { - delay(200); // a short delay to let spi bus settle after camera init - loadPrefs(SPIFFS); - } else { - Log.println("No Internal Filesystem, cannot load or save preferences"); - } + // Start (init) the camera + StartCamera(); - /* - Camera setup complete; initialise the rest of the hardware. - */ + // Now load and apply any saved preferences + if (filesystem) { + delay(200); // a short delay to let spi bus settle after camera init + loadPrefs(SPIFFS); + loadposPrefs(SPIFFS); + } else { + Log.println("No Internal Filesystem, cannot load or save preferences"); + } - servo1.attach(Servo1Pin); - servo2.attach(Servo2Pin); - servo1.write(ptz_y); - servo2.write(ptz_x); - - // Set up OTA - if (otaEnabled) { - // Start OTA once connected - Log.println("Setting up OTA"); - // Port defaults to 3232 - // ArduinoOTA.setPort(3232); - // Hostname defaults to esp3232-[MAC] - ArduinoOTA.setHostname(mdnsName); - // No authentication by default - if (strlen(otaPassword) != 0) { - ArduinoOTA.setPassword(otaPassword); - Log.printf("OTA Password: %s\n\r", otaPassword); - } else { - Log.printf("\r\nNo OTA password has been set! (insecure)\r\n\r\n"); - } - ArduinoOTA - .onStart([]() { - String type; - if (ArduinoOTA.getCommand() == U_FLASH) - type = "sketch"; - else // U_SPIFFS - // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end() - type = "filesystem"; - Log.println("Start updating " + type); - Log.print("setup ArduinoOTA.onStart CPU "); - Log.println(xPortGetCoreID()); - // Stop the camera since OTA will crash the module if it is running. - // the unit will need rebooting to restart it, either by OTA on success, or manually by the user - Log.println("Stopping Camera"); - esp_err_t err = esp_camera_deinit(); - critERR = "

OTA Has been started


Camera has Halted!

"; - critERR += "

Wait for OTA to finish and reboot, or reboot manually to recover

"; - }) - .onEnd([]() { - Log.println("\r\nEnd"); - }) - .onProgress([](unsigned int progress, unsigned int total) { - Log.printf("Progress: %u%%\r", (progress / (total / 100))); - }) - .onError([](ota_error_t error) { - Log.printf("Error[%u]: ", error); - if (error == OTA_AUTH_ERROR) Log.println("Auth Failed"); - else if (error == OTA_BEGIN_ERROR) Log.println("Begin Failed"); - else if (error == OTA_CONNECT_ERROR) Log.println("Connect Failed"); - else if (error == OTA_RECEIVE_ERROR) Log.println("Receive Failed"); - else if (error == OTA_END_ERROR) Log.println("End Failed"); - }); - ArduinoOTA.begin(); + /* + Camera setup complete; initialise the rest of the hardware. + */ + + servo1.attach(Servo1Pin); + servo2.attach(Servo2Pin); + + // Set up OTA + if (otaEnabled) { + // Start OTA once connected + Log.println("Setting up OTA"); + // Port defaults to 3232 + // ArduinoOTA.setPort(3232); + // Hostname defaults to esp3232-[MAC] + ArduinoOTA.setHostname(mdnsName); + // No authentication by default + if (strlen(otaPassword) != 0) { + ArduinoOTA.setPassword(otaPassword); + Log.printf("OTA Password: %s\n\r", otaPassword); } else { - Log.println("OTA is disabled"); - - if (!MDNS.begin(mdnsName)) { - Log.println("Error setting up MDNS responder!"); - } - Log.println("mDNS responder started"); + Log.printf("\r\nNo OTA password has been set! (insecure)\r\n\r\n"); + } + ArduinoOTA + .onStart([]() { + String type; + if (ArduinoOTA.getCommand() == U_FLASH) + type = "sketch"; + else // U_SPIFFS + // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end() + type = "filesystem"; + Log.println("Start updating " + type); + Log.print("setup ArduinoOTA.onStart CPU "); + Log.println(xPortGetCoreID()); + // Stop the camera since OTA will crash the module if it is running. + // the unit will need rebooting to restart it, either by OTA on success, or manually by the user + Log.println("Stopping Camera"); + esp_err_t err = esp_camera_deinit(); + critERR = "

OTA Has been started


Camera has Halted!

"; + critERR += "

Wait for OTA to finish and reboot, or reboot manually to recover

"; + }) + .onEnd([]() { + Log.println("\r\nEnd"); + }) + .onProgress([](unsigned int progress, unsigned int total) { + Log.printf("Progress: %u%%\r", (progress / (total / 100))); + }) + .onError([](ota_error_t error) { + Log.printf("Error[%u]: ", error); + if (error == OTA_AUTH_ERROR) Log.println("Auth Failed"); + else if (error == OTA_BEGIN_ERROR) Log.println("Begin Failed"); + else if (error == OTA_CONNECT_ERROR) Log.println("Connect Failed"); + else if (error == OTA_RECEIVE_ERROR) Log.println("Receive Failed"); + else if (error == OTA_END_ERROR) Log.println("End Failed"); + }); + ArduinoOTA.begin(); + } else { + Log.println("OTA is disabled"); + + if (!MDNS.begin(mdnsName)) { + Log.println("Error setting up MDNS responder!"); } + Log.println("mDNS responder started"); + } - //MDNS Config -- note that if OTA is NOT enabled this needs prior steps! - MDNS.addService("http", "tcp", 80); - Log.println("Added HTTP service to MDNS server"); + //MDNS Config -- note that if OTA is NOT enabled this needs prior steps! + MDNS.addService("http", "tcp", 80); + Log.println("Added HTTP service to MDNS server"); - MDNS.addService("webserial", "tcp", 8514); - Log.println("Added webserial service to MDNS server"); + MDNS.addService("webserial", "tcp", 8514); + Log.println("Added webserial service to MDNS server"); - // Set time via NTP server when enabled - if (haveTime) { - Log.print("Time: "); - configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); - printLocalTime(true); - } else { - Log.println("Time functions disabled"); - } + // Set time via NTP server when enabled + if (haveTime) { + Log.print("Time: "); + configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); + printLocalTime(true); + } else { + Log.println("Time functions disabled"); + } - // Gather static values used when dumping status; these are slow functions, so just do them once during startup - sketchSize = ESP.getSketchSize(); - sketchSpace = ESP.getFreeSketchSpace(); - sketchMD5 = ESP.getSketchMD5(); + // Gather static values used when dumping status; these are slow functions, so just do them once during startup + sketchSize = ESP.getSketchSize(); + sketchSpace = ESP.getFreeSketchSpace(); + sketchMD5 = ESP.getSketchMD5(); - // Initialise and set the lamp - if (lampVal != -1) { + // Initialise and set the lamp + if (lampVal != -1) { #if defined(LAMP_PIN) - ledcSetup(lampChannel, pwmfreq, pwmresolution); // configure LED PWM channel - ledcAttachPin(LAMP_PIN, lampChannel); // attach the GPIO pin to the channel - if (autoLamp) setLamp(0); // set default value - else setLamp(lampVal); + ledcSetup(lampChannel, pwmfreq, pwmresolution); // configure LED PWM channel + ledcAttachPin(LAMP_PIN, lampChannel); // attach the GPIO pin to the channel + if (autoLamp) setLamp(0); // set default value + else setLamp(lampVal); #endif - } else { - Log.println("No lamp, or lamp disabled in config"); - } + } else { + Log.println("No lamp, or lamp disabled in config"); + } - // As a final init step chomp out the serial buffer in case we have recieved mis-keys or garbage during startup - while (Serial.available()) Serial.read(); - xTaskCreatePinnedToCore(TaskCore0, "TaskCore0", 10000, NULL, 1, &TaskCore0Handle, 0); - } + // As a final init step chomp out the serial buffer in case we have recieved mis-keys or garbage during startup + while (Serial.available()) Serial.read(); + xTaskCreatePinnedToCore(TaskCore0, "TaskCore0", 1000, NULL, 1, &TaskCore0Handle, 0); + int pvPeriodtimer = 10; + xTaskCreatePinnedToCore(asyncPos, "asyncPos", 1000, pvPeriodtimer, 0, &asyncPos1Handle, 1); +} - const TickType_t xDelay = 10; - void loop() { - /* - Just loop forever, reconnecting Wifi As necesscary in client mode - The stream and URI handler processes initiated by the startCameraServer() call at the - end of setup() will handle the camera and UI processing from now on. - */ - if (accesspoint) { - // Accespoint is permanently up, so just loop, servicing the captive portal as needed - // Rather than loop forever, follow the watchdog, in case we later add auto re-scan. + +void loop() { + /* + Just loop forever, reconnecting Wifi As necesscary in client mode + The stream and URI handler processes initiated by the startCameraServer() call at the + end of setup() will handle the camera and UI processing from now on. + */ + if (accesspoint) { + // Accespoint is permanently up, so just loop, servicing the captive portal as needed + // Rather than loop forever, follow the watchdog, in case we later add auto re-scan. + unsigned long start = millis(); + while (millis() - start < WIFI_WATCHDOG ) { + //delay(100); + vTaskDelay( xDelay ); + if (otaEnabled) ArduinoOTA.handle(); + handleSerial(); + if (captivePortal) dnsServer.processNextRequest(); + } + } else { + // client mode can fail; so reconnect as appropriate + static bool warned = false; + if (WiFi.status() == WL_CONNECTED) { + // We are connected, wait a bit and re-check + if (warned) { + // Tell the user if we have just reconnected + Log.println("WiFi reconnected"); + warned = false; + } + // loop here for WIFI_WATCHDOG, turning debugData true/false depending on serial input.. unsigned long start = millis(); while (millis() - start < WIFI_WATCHDOG ) { - //delay(100); - vTaskDelay( xDelay ); + delay(100); if (otaEnabled) ArduinoOTA.handle(); handleSerial(); - if (captivePortal) dnsServer.processNextRequest(); } } else { - // client mode can fail; so reconnect as appropriate - static bool warned = false; - if (WiFi.status() == WL_CONNECTED) { - // We are connected, wait a bit and re-check - if (warned) { - // Tell the user if we have just reconnected - Log.println("WiFi reconnected"); - warned = false; - } - // loop here for WIFI_WATCHDOG, turning debugData true/false depending on serial input.. - unsigned long start = millis(); - while (millis() - start < WIFI_WATCHDOG ) { - delay(100); - if (otaEnabled) ArduinoOTA.handle(); - handleSerial(); - } - } else { - // disconnected; attempt to reconnect - if (!warned) { - Log.print("loop CPU "); - Log.println(xPortGetCoreID()); - // Tell the user if we just disconnected - WiFi.disconnect(); // ensures disconnect is complete, wifi scan cleared - Log.println("WiFi disconnected, retrying"); - warned = true; - } - WifiSetup(); + // disconnected; attempt to reconnect + if (!warned) { + Log.print("loop CPU "); + Log.println(xPortGetCoreID()); + // Tell the user if we just disconnected + WiFi.disconnect(); // ensures disconnect is complete, wifi scan cleared + Log.println("WiFi disconnected, retrying"); + warned = true; } + WifiSetup(); } } +} diff --git a/storage.cpp b/storage.cpp index cf6cfca..3d81fc6 100644 --- a/storage.cpp +++ b/storage.cpp @@ -14,6 +14,8 @@ extern int Servo2Pin; extern int Servo_Step; extern int ptz_y; extern int ptz_x; +extern int ptz_y_now; +extern int ptz_x_now; /* * Useful utility when debugging... @@ -147,6 +149,48 @@ void loadPrefs(fs::FS &fs){ } } +void loadposPrefs(fs::FS &fs){ + if (fs.exists(PREFERENCES_POS_FILE)) { + // read file into a string + String prefs; + Serial.printf("Loading preferences pos from file %s\r\n", PREFERENCES_POS_FILE); + File file = fs.open(PREFERENCES_POS_FILE, FILE_READ); + if (!file) { + Serial.println("Failed to open preferences pos file for reading, maybe corrupt, removing"); + removeposPrefs(SPIFFS); + return; + } + size_t size = file.size(); + if (size > PREFERENCES_MAX_SIZE) { + Serial.println("Preferences pos file size is too large, maybe corrupt, removing"); + removeposPrefs(SPIFFS); + return; + } + while (file.available()) { + prefs += char(file.read()); + if (prefs.length() > size) { + // corrupted SPIFFS files can return data beyond their declared size. + Serial.println("Preferences pos file failed to load properly, appears to be corrupt, removing"); + removeposPrefs(SPIFFS); + return; + } + } + ptz_x_now = jsonExtract(prefs, "ptz_x_now").toInt(); + ptz_y_now = jsonExtract(prefs, "ptz_y_now").toInt(); + // close the file + file.close(); +// dumpPrefs(SPIFFS); + } else { + ptz_y_now = ptz_y; + ptz_x_now = ptz_x; + servo1.write(ptz_y); + servo2.write(ptz_x); + saveposPrefs(SPIFFS); + Serial.printf("Preference pos file %s not found; using system defaults.\r\n", PREFERENCES_POS_FILE); + } +} + + void savePrefs(fs::FS &fs){ if (fs.exists(PREFERENCES_FILE)) { Serial.printf("Updating %s\r\n", PREFERENCES_FILE); @@ -189,9 +233,9 @@ void savePrefs(fs::FS &fs){ p+=sprintf(p, "\"rotate\":\"%d\",", myRotation); p+=sprintf(p, "\"servo1_pin\":%u,", Servo1Pin ); p+=sprintf(p, "\"servo2_pin\":%u,", Servo2Pin ); - p+=sprintf(p, "\"servo_step\":%u,", Servo_Step ); + p+=sprintf(p, "\"servo_step\":%u,", Servo_Step ); p+=sprintf(p, "\"ptz_y\":%u,", ptz_y ); - p+=sprintf(p, "\"ptz_x\":%u",ptz_x); + p+=sprintf(p, "\"ptz_x\":%u", ptz_x ); *p++ = '}'; *p++ = 0; @@ -200,6 +244,36 @@ void savePrefs(fs::FS &fs){ dumpPrefs(SPIFFS); } +void saveposPrefs(fs::FS &fs){ + if (fs.exists(PREFERENCES_POS_FILE)) { + Serial.printf("Updating %s\r\n", PREFERENCES_POS_FILE); + } else { + Serial.printf("Creating %s\r\n", PREFERENCES_POS_FILE); + } + File file = fs.open(PREFERENCES_POS_FILE, FILE_WRITE); + static char json_response[64]; + char * p = json_response; + *p++ = '{'; + p+=sprintf(p, "\"ptz_y_now\":%u,", ptz_y_now); + p+=sprintf(p, "\"ptz_x_now\":%u",ptz_x_now); + *p++ = '}'; + *p++ = 0; + file.print(json_response); + file.close(); +// dumpPrefs(SPIFFS); +} + +void removeposPrefs(fs::FS &fs) { + if (fs.exists(PREFERENCES_POS_FILE)) { + Serial.printf("Removing %s\r\n", PREFERENCES_POS_FILE); + if (!fs.remove(PREFERENCES_POS_FILE)) { + Serial.println("Error removing preferences pos"); + } + } else { + Serial.println("No saved preferences pos file to remove"); + } +} + void removePrefs(fs::FS &fs) { if (fs.exists(PREFERENCES_FILE)) { Serial.printf("Removing %s\r\n", PREFERENCES_FILE); diff --git a/storage.h b/storage.h index a67b075..e2dcc06 100644 --- a/storage.h +++ b/storage.h @@ -5,10 +5,14 @@ #define PREFERENCES_MAX_SIZE 500 #define PREFERENCES_FILE "/esp32cam-preferences.json" +#define PREFERENCES_FILE "/ptz-last-pos.json" extern void dumpPrefs(fs::FS &fs); extern void loadPrefs(fs::FS &fs); extern void removePrefs(fs::FS &fs); extern void savePrefs(fs::FS &fs); +extern void loadposPrefs(fs::FS &fs); +extern void saveposPrefs(fs::FS &fs); +extern void removeposPrefs(fs::FS &fs); extern void filesystemStart(); From 3e5b73764d7a7c709205718d924db91903f6a6d2 Mon Sep 17 00:00:00 2001 From: Zalgo <80800403+ZalgoSoft@users.noreply.github.com> Date: Sun, 19 Jun 2022 17:21:09 +0800 Subject: [PATCH 07/12] ptz smooth minor fixes --- app_httpd.cpp | 4 ++-- esp32-cam-webserver.ino | 6 +++--- platformio.ini | 6 +++--- storage.h | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app_httpd.cpp b/app_httpd.cpp index 03cf9df..1f31872 100644 --- a/app_httpd.cpp +++ b/app_httpd.cpp @@ -19,8 +19,8 @@ #include #include -#include // The T-Logging library. -#include +//#include // The T-Logging library. +//#include #include #include #include diff --git a/esp32-cam-webserver.ino b/esp32-cam-webserver.ino index 28de137..c1c7b6b 100644 --- a/esp32-cam-webserver.ino +++ b/esp32-cam-webserver.ino @@ -58,9 +58,9 @@ struct station { stationList[] = {{"ESP32-CAM-CONNECT", "InsecurePassword", true}}; #endif -#include // The T-Logging library. -#include -WebSerialStream webSerialStream = WebSerialStream(8514); +//#include // The T-Logging library. +//#include +//WebSerialStream webSerialStream = WebSerialStream(8514); TaskHandle_t TaskCore0Handle; TaskHandle_t asyncPos1Handle; TaskHandle_t xHandle; diff --git a/platformio.ini b/platformio.ini index 8317bf4..c44e52e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -35,7 +35,7 @@ src_dir = ./ [env:esp32dev] platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-upstream -platform_packages = framework-arduinoespressif32@https://github.com/espressif/arduino-esp32.git#2.0.2 +platform_packages = framework-arduinoespressif32@https://github.com/espressif/arduino-esp32.git#2.0.3 board = esp32dev board_build.partitions = min_spiffs.csv framework = arduino @@ -43,7 +43,7 @@ build_flags = -DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue ; For OTA uploading uncomment the next lines and add the IP address or mDNS name of the camera module, and the OTA password -;upload_protocol = espota -;upload_port = +upload_protocol = espota +upload_port = 192.168.1.157 ;upload_flags = ; --auth= diff --git a/storage.h b/storage.h index e2dcc06..ac38a39 100644 --- a/storage.h +++ b/storage.h @@ -5,7 +5,7 @@ #define PREFERENCES_MAX_SIZE 500 #define PREFERENCES_FILE "/esp32cam-preferences.json" -#define PREFERENCES_FILE "/ptz-last-pos.json" +#define PREFERENCES_POS_FILE "/ptz-last-pos.json" extern void dumpPrefs(fs::FS &fs); extern void loadPrefs(fs::FS &fs); From b999bd3a6cc5212756f0aebbe34e25c5804edef0 Mon Sep 17 00:00:00 2001 From: Zalgo <80800403+ZalgoSoft@users.noreply.github.com> Date: Sun, 19 Jun 2022 18:36:59 +0800 Subject: [PATCH 08/12] more awkward fixes, messing with LOG lib --- app_httpd.cpp | 261 ++++++++++++++++++------------------ esp32-cam-webserver.ino | 284 ++++++++++++++++++++-------------------- storage.cpp | 3 + 3 files changed, 280 insertions(+), 268 deletions(-) diff --git a/app_httpd.cpp b/app_httpd.cpp index 1f31872..bc5b23f 100644 --- a/app_httpd.cpp +++ b/app_httpd.cpp @@ -24,8 +24,9 @@ #include #include #include -//#include +#include #include +#include #include "index_ov2640.h" #include "index_ov3660.h" #include "index_other.h" @@ -72,6 +73,7 @@ extern bool otaEnabled; extern char otaPassword[]; extern unsigned long xclk; extern int sensorPID; +static const char* TAG = "httpd"; extern Servo servo1; extern Servo servo2; @@ -81,8 +83,8 @@ extern int Servo_Step; extern int ptz_y; extern int ptz_x; typedef struct { - httpd_req_t *req; - size_t len; + httpd_req_t *req; + size_t len; } jpg_chunking_t; #define PART_BOUNDARY "123456789000000000000987654321" @@ -105,54 +107,54 @@ uint8_t temprature_sens_read(); #endif void serialDump() { - Log.println(); + //ESP_LOGI(TAG, ); // Module - Log.printf("Name: %s\r\n", myName); + ESP_LOGI(TAG, "Name: %s\r\n", myName); if (haveTime) { - Log.print("Time: "); + ESP_LOGI(TAG, "Time: "); printLocalTime(true); } - Log.printf("Firmware: %s (base: %s)\r\n", myVer, baseVersion); + ESP_LOGI(TAG, "Firmware: %s (base: %s)\r\n", myVer, baseVersion); float sketchPct = 100 * sketchSize / sketchSpace; - Log.printf("Sketch Size: %i (total: %i, %.1f%% used)\r\n", sketchSize, sketchSpace, sketchPct); - Log.printf("MD5: %s\r\n", sketchMD5.c_str()); - Log.printf("ESP sdk: %s\r\n", ESP.getSdkVersion()); - Log.print("This thread core affinity: "); - Log.println(xPortGetCoreID()); + ESP_LOGI(TAG, "Sketch Size: %i (total: %i, %.1f%% used)\r\n", sketchSize, sketchSpace, sketchPct); + ESP_LOGI(TAG, "MD5: %s\r\n", sketchMD5.c_str()); + ESP_LOGI(TAG, "ESP sdk: %s\r\n", ESP.getSdkVersion()); + ESP_LOGI(TAG, "This thread core affinity: "); + ESP_LOGI(TAG, xPortGetCoreID()); if (otaEnabled) { if (strlen(otaPassword) != 0) { - Log.printf("OTA: Enabled, Password: %s\n\r", otaPassword); + ESP_LOGI(TAG, "OTA: Enabled, Password: %s\n\r", otaPassword); } else { - Log.printf("OTA: Enabled, No Password! (insecure)\n\r"); + ESP_LOGI(TAG, "OTA: Enabled, No Password! (insecure)\n\r"); } } else { - Log.printf("OTA: Disabled\n\r"); + ESP_LOGI(TAG, "OTA: Disabled\n\r"); } // Network if (accesspoint) { if (captivePortal) { - Log.printf("WiFi Mode: AccessPoint with captive portal\r\n"); + ESP_LOGI(TAG, "WiFi Mode: AccessPoint with captive portal\r\n"); } else { - Log.printf("WiFi Mode: AccessPoint\r\n"); + ESP_LOGI(TAG, "WiFi Mode: AccessPoint\r\n"); } - Log.printf("WiFi SSID: %s\r\n", apName); + ESP_LOGI(TAG, "WiFi SSID: %s\r\n", apName); } else { - Log.printf("WiFi Mode: Client\r\n"); + ESP_LOGI(TAG, "WiFi Mode: Client\r\n"); String ssidName = WiFi.SSID(); - Log.printf("WiFi Ssid: %s\r\n", ssidName.c_str()); - Log.printf("WiFi Rssi: %i\r\n", WiFi.RSSI()); + ESP_LOGI(TAG, "WiFi Ssid: %s\r\n", ssidName.c_str()); + ESP_LOGI(TAG, "WiFi Rssi: %i\r\n", WiFi.RSSI()); String bssid = WiFi.BSSIDstr(); - Log.printf("WiFi BSSID: %s\r\n", bssid.c_str()); + ESP_LOGI(TAG, "WiFi BSSID: %s\r\n", bssid.c_str()); } - Log.printf("WiFi IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); + ESP_LOGI(TAG, "WiFi IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); if (!accesspoint) { - Log.printf("WiFi Netmask: %d.%d.%d.%d\r\n", net[0], net[1], net[2], net[3]); - Log.printf("WiFi Gateway: %d.%d.%d.%d\r\n", gw[0], gw[1], gw[2], gw[3]); + ESP_LOGI(TAG, "WiFi Netmask: %d.%d.%d.%d\r\n", net[0], net[1], net[2], net[3]); + ESP_LOGI(TAG, "WiFi Gateway: %d.%d.%d.%d\r\n", gw[0], gw[1], gw[2], gw[3]); } - Log.printf("WiFi Http port: %i, Stream port: %i\r\n", httpPort, streamPort); + ESP_LOGI(TAG, "WiFi Http port: %i, Stream port: %i\r\n", httpPort, streamPort); byte mac[6]; WiFi.macAddress(mac); - Log.printf("WiFi MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + ESP_LOGI(TAG, "WiFi MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); // System int64_t sec = esp_timer_get_time() / 1000000; int64_t upDays = int64_t(floor(sec / 86400)); @@ -161,55 +163,55 @@ void serialDump() { int upSec = sec % 60; int McuTc = (temprature_sens_read() - 32) / 1.8; // celsius int McuTf = temprature_sens_read(); // fahrenheit - Log.printf("System up: %" PRId64 ":%02i:%02i:%02i (d:h:m:s)\r\n", upDays, upHours, upMin, upSec); - Log.printf("Active streams: %i, Previous streams: %lu, Images captured: %lu\r\n", streamCount, streamsServed, imagesServed); - Log.printf("CPU Freq: %i MHz, Xclk Freq: %i MHz\r\n", ESP.getCpuFreqMHz(), xclk); - Log.printf("MCU temperature : %i C, %i F (approximate)\r\n", McuTc, McuTf); - Log.printf("Heap: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getHeapSize(), ESP.getFreeHeap(), ESP.getMinFreeHeap(), ESP.getMaxAllocHeap()); + ESP_LOGI(TAG, "System up: %" PRId64 ":%02i:%02i:%02i (d:h:m:s)\r\n", upDays, upHours, upMin, upSec); + ESP_LOGI(TAG, "Active streams: %i, Previous streams: %lu, Images captured: %lu\r\n", streamCount, streamsServed, imagesServed); + ESP_LOGI(TAG, "CPU Freq: %i MHz, Xclk Freq: %i MHz\r\n", ESP.getCpuFreqMHz(), xclk); + ESP_LOGI(TAG, "MCU temperature : %i C, %i F (approximate)\r\n", McuTc, McuTf); + ESP_LOGI(TAG, "Heap: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getHeapSize(), ESP.getFreeHeap(), ESP.getMinFreeHeap(), ESP.getMaxAllocHeap()); if (psramFound()) { - Log.printf("Psram: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getPsramSize(), ESP.getFreePsram(), ESP.getMinFreePsram(), ESP.getMaxAllocPsram()); + ESP_LOGI(TAG, "Psram: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getPsramSize(), ESP.getFreePsram(), ESP.getMinFreePsram(), ESP.getMaxAllocPsram()); } else { - Log.printf("Psram: Not found; please check your board configuration.\r\n"); - Log.printf("- High resolution/quality settings will show incomplete frames to low memory.\r\n"); + ESP_LOGI(TAG, "Psram: Not found; please check your board configuration.\r\n"); + ESP_LOGI(TAG, "- High resolution/quality settings will show incomplete frames to low memory.\r\n"); } // Filesystems if (filesystem && (SPIFFS.totalBytes() > 0)) { - Log.printf("Spiffs: %i, used: %i\r\n", SPIFFS.totalBytes(), SPIFFS.usedBytes()); + ESP_LOGI(TAG, "Spiffs: %i, used: %i\r\n", SPIFFS.totalBytes(), SPIFFS.usedBytes()); } else { - Log.printf("Spiffs: No filesystem found, please check your board configuration.\r\n"); - Log.printf("- Saving and restoring camera settings will not function without this.\r\n"); + ESP_LOGI(TAG, "Spiffs: No filesystem found, please check your board configuration.\r\n"); + ESP_LOGI(TAG, "- Saving and restoring camera settings will not function without this.\r\n"); } - Log.println("Preferences file: "); + ESP_LOGI(TAG, "Preferences file: "); dumpPrefs(SPIFFS); if (critERR.length() > 0) { - Log.printf("\r\n\r\nAn error or halt has occurred with Camera Hardware, see previous messages.\r\n"); - Log.printf("A reboot is required to recover from this.\r\nError message: (html)\r\n %s\r\n\r\n", critERR.c_str()); + ESP_LOGI(TAG, "\r\n\r\nAn error or halt has occurred with Camera Hardware, see previous messages.\r\n"); + ESP_LOGI(TAG, "A reboot is required to recover from this.\r\nError message: (html)\r\n %s\r\n\r\n", critERR.c_str()); } - Log.println(); + //ESP_LOGI(TAG, ); return; } -static esp_err_t capture_handler(httpd_req_t *req){ - camera_fb_t * fb = NULL; - esp_err_t res = ESP_OK; +static esp_err_t capture_handler(httpd_req_t *req) { + camera_fb_t * fb = NULL; + esp_err_t res = ESP_OK; - Log.print("capture_handler CPU "); - Log.println(xPortGetCoreID()); - if (autoLamp && (lampVal != -1)) { - setLamp(lampVal); - delay(75); // coupled with the status led flash this gives ~150ms for lamp to settle. - } - flashLED(75); // little flash of status LED + ESP_LOGI(TAG, "capture_handler CPU "); + ESP_LOGI(TAG, xPortGetCoreID()); + if (autoLamp && (lampVal != -1)) { + setLamp(lampVal); + delay(75); // coupled with the status led flash this gives ~150ms for lamp to settle. + } + flashLED(75); // little flash of status LED - int64_t fr_start = esp_timer_get_time(); + int64_t fr_start = esp_timer_get_time(); - fb = esp_camera_fb_get(); - if (!fb) { - Log.println("CAPTURE: failed to acquire frame"); - httpd_resp_send_500(req); - if (autoLamp && (lampVal != -1)) setLamp(0); - return ESP_FAIL; - } + fb = esp_camera_fb_get(); + if (!fb) { + ESP_LOGI(TAG, "CAPTURE: failed to acquire frame"); + httpd_resp_send_500(req); + if (autoLamp && (lampVal != -1)) setLamp(0); + return ESP_FAIL; + } httpd_resp_set_type(req, "image/jpeg"); httpd_resp_set_hdr(req, "Content-Disposition", "inline; filename=capture.jpg"); @@ -221,14 +223,14 @@ static esp_err_t capture_handler(httpd_req_t *req){ res = httpd_resp_send(req, (const char *)fb->buf, fb->len); } else { res = ESP_FAIL; - Log.println("Capture Error: Non-JPEG image returned by camera module"); + ESP_LOGI(TAG, "Capture Error: Non-JPEG image returned by camera module"); } esp_camera_fb_return(fb); fb = NULL; int64_t fr_end = esp_timer_get_time(); if (debugData) { - Log.printf("JPG: %uB %ums\r\n", (uint32_t)(fb_len), (uint32_t)((fr_end - fr_start) / 1000)); + ESP_LOGI(TAG, "JPG: %uB %ums\r\n", (uint32_t)(fb_len), (uint32_t)((fr_end - fr_start) / 1000)); } imagesServed++; if (autoLamp && (lampVal != -1)) { @@ -246,9 +248,9 @@ static esp_err_t stream_handler(httpd_req_t *req) { streamKill = false; - print_client_ip(req); Log.print("Stream requested"); - Log.print(" stream_handler CPU "); - Log.println(xPortGetCoreID()); + print_client_ip(req); ESP_LOGI(TAG, "Stream requested"); + ESP_LOGI(TAG, " stream_handler CPU "); + ESP_LOGI(TAG, xPortGetCoreID()); if (autoLamp && (lampVal != -1)) setLamp(lampVal); streamCount = 1; // at present we only have one stream handler, so values are 0 or 1.. flashLED(75); // double flash of status LED @@ -264,7 +266,7 @@ static esp_err_t stream_handler(httpd_req_t *req) { if (res != ESP_OK) { streamCount = 0; if (autoLamp && (lampVal != -1)) setLamp(0); - Log.println("STREAM: failed to set HTTP response type"); + ESP_LOGI(TAG, "STREAM: failed to set HTTP response type"); return res; } @@ -277,11 +279,11 @@ static esp_err_t stream_handler(httpd_req_t *req) { while (true) { fb = esp_camera_fb_get(); if (!fb) { - Log.println("STREAM: failed to acquire frame"); + ESP_LOGI(TAG, "STREAM: failed to acquire frame"); res = ESP_FAIL; } else { if (fb->format != PIXFORMAT_JPEG) { - Log.println("STREAM: Non-JPEG frame returned by camera module"); + ESP_LOGI(TAG, "STREAM: Non-JPEG frame returned by camera module"); res = ESP_FAIL; } else { _jpg_buf_len = fb->len; @@ -309,12 +311,12 @@ static esp_err_t stream_handler(httpd_req_t *req) { if (res != ESP_OK) { // This is the error exit point from the stream loop. // We end the stream here only if a Hard failure has been encountered or the connection has been interrupted. - Log.printf("Stream failed, code = %i : %s\r\n", res, esp_err_to_name(res)); + ESP_LOGI(TAG, "Stream failed, code = %i : %s\r\n", res, esp_err_to_name(res)); break; } if ((res != ESP_OK) || streamKill) { // We end the stream here when a kill is signalled. - Log.printf("Stream killed\r\n"); + ESP_LOGI(TAG, "Stream killed\r\n"); break; } int64_t frame_time = esp_timer_get_time() - last_frame; @@ -323,9 +325,9 @@ static esp_err_t stream_handler(httpd_req_t *req) { delay(frame_delay); if (debugData) { - Log.printf("MJPG: %uB %ums, delay: %ums, framerate (%.1ffps)\r\n", - (uint32_t)(_jpg_buf_len), - (uint32_t)frame_time, frame_delay, 1000.0 / (uint32_t)(frame_time + frame_delay)); + ESP_LOGI(TAG, "MJPG: %uB %ums, delay: %ums, framerate (%.1ffps)\r\n", + (uint32_t)(_jpg_buf_len), + (uint32_t)frame_time, frame_delay, 1000.0 / (uint32_t)(frame_time + frame_delay)); } last_frame = esp_timer_get_time(); } @@ -333,7 +335,7 @@ static esp_err_t stream_handler(httpd_req_t *req) { streamsServed++; streamCount = 0; if (autoLamp && (lampVal != -1)) setLamp(0); - Log.println("Stream ended"); + ESP_LOGI(TAG, "Stream ended"); last_frame = 0; return res; } @@ -381,7 +383,10 @@ static esp_err_t cmd_handler(httpd_req_t *req) { if (s->pixformat == PIXFORMAT_JPEG) res = s->set_framesize(s, (framesize_t)val); } else if (!strcmp(variable, "quality")) res = s->set_quality(s, val); - else if (!strcmp(variable, "xclk")) { xclk = val; res = s->set_xclk(s, LEDC_TIMER_0, val); } + else if (!strcmp(variable, "xclk")) { + xclk = val; + res = s->set_xclk(s, LEDC_TIMER_0, val); + } else if (!strcmp(variable, "contrast")) res = s->set_contrast(s, val); else if (!strcmp(variable, "brightness")) res = s->set_brightness(s, val); else if (!strcmp(variable, "saturation")) res = s->set_saturation(s, val); @@ -438,11 +443,11 @@ static esp_err_t cmd_handler(httpd_req_t *req) { periph_module_disable(PERIPH_I2C1_MODULE); periph_module_reset(PERIPH_I2C0_MODULE); periph_module_reset(PERIPH_I2C1_MODULE); - Log.print("REBOOT requested"); + ESP_LOGI(TAG, "REBOOT requested"); while (true) { flashLED(50); delay(150); - Log.print('.'); + ESP_LOGI(TAG, '.'); } } @@ -451,74 +456,74 @@ static esp_err_t cmd_handler(httpd_req_t *req) { if (!strcmp(value, "up" )) { if (ptz_y <= 180) { ptz_y += Servo_Step; -// servo1.write(ptz_y); + // servo1.write(ptz_y); } - Log.printf("PTZ: %i\t%i\t", ptz_x, ptz_y); - Log.println("Up"); + ESP_LOGI(TAG, "PTZ: %i\t%i\t", ptz_x, ptz_y); + ESP_LOGI(TAG, "Up"); } else if (!strcmp(value, "left" )) { if (ptz_x <= 180) { ptz_x += Servo_Step; -// servo2.write(ptz_x); + // servo2.write(ptz_x); } - Log.printf("PTZ: %i\t%i\t", ptz_x, ptz_y); - Log.println("Left"); + ESP_LOGI(TAG, "PTZ: %i\t%i\t", ptz_x, ptz_y); + ESP_LOGI(TAG, "Left"); } else if (!strcmp(value, "right" )) { if (ptz_x >= 0) { ptz_x -= Servo_Step; -// servo2.write(ptz_x); + // servo2.write(ptz_x); } - Log.printf("PTZ: %i\t%i\t", ptz_x, ptz_y); - Log.println("Right"); + ESP_LOGI(TAG, "PTZ: %i\t%i\t", ptz_x, ptz_y); + ESP_LOGI(TAG, "Right"); } else if (!strcmp(value, "down" )) { if (ptz_y >= 0) { ptz_y -= Servo_Step; -// servo1.write(ptz_y); + // servo1.write(ptz_y); } - Log.printf("PTZ: %i\t%i\t" , ptz_x , ptz_y); - Log.println("Down"); + ESP_LOGI(TAG, "PTZ: %i\t%i\t" , ptz_x , ptz_y); + ESP_LOGI(TAG, "Down"); } else if (!strcmp(value, "center" )) { ptz_x = 90; ptz_y = 90; -// servo1.write(ptz_y); -// servo2.write(ptz_x); - Log.printf("PTZ: %i\t%i\t", ptz_x, ptz_y); - Log.println("Center"); + // servo1.write(ptz_y); + // servo2.write(ptz_x); + ESP_LOGI(TAG, "PTZ: %i\t%i\t", ptz_x, ptz_y); + ESP_LOGI(TAG, "Center"); } } else if (!strcmp(variable, "ptz_x")) { if (val >= 0 && val <= 180 ) { ptz_x = val; -// servo2.write(ptz_x); - Log.printf("PTZ: %i\t", ptz_x); - Log.println("PTZ pos x"); + // servo2.write(ptz_x); + ESP_LOGI(TAG, "PTZ: %i\t", ptz_x); + ESP_LOGI(TAG, "PTZ pos x"); } } else if (!strcmp(variable, "ptz_y")) { if (val >= 0 && val <= 180 ) { ptz_y = val; -// servo1.write(ptz_y); - Log.printf("PTZ: %i\t", ptz_y); - Log.println("PTZ pos y"); + // servo1.write(ptz_y); + ESP_LOGI(TAG, "PTZ: %i\t", ptz_y); + ESP_LOGI(TAG, "PTZ pos y"); } } else if (!strcmp(variable, "servo_step")) { if (val >= 0 && val <= 90 ) { Servo_Step = val; - Log.printf("PTZ: %i\t", Servo_Step ); - Log.println("PTZ Step Size"); + ESP_LOGI(TAG, "PTZ: %i\t", Servo_Step ); + ESP_LOGI(TAG, "PTZ Step Size"); } } else if (!strcmp(variable, "servo1_pin")) { if (val >= 0 && val <= 31 ) { Servo1Pin = val; - Log.printf("PTZ: %i\t", Servo1Pin ); - Log.println("PTZ Servo1Pin"); + ESP_LOGI(TAG, "PTZ: %i\t", Servo1Pin ); + ESP_LOGI(TAG, "PTZ Servo1Pin"); } } else if (!strcmp(variable, "servo2_pin")) { if (val >= 0 && val <= 31 ) { Servo2Pin = val; - Log.printf("PTZ: %i\t", Servo2Pin ); - Log.println("PTZ Servo2Pin"); + ESP_LOGI(TAG, "PTZ: %i\t", Servo2Pin ); + ESP_LOGI(TAG, "PTZ Servo2Pin"); } } else { @@ -624,10 +629,10 @@ static esp_err_t logo_svg_handler(httpd_req_t *req) { static esp_err_t dump_handler(httpd_req_t *req) { flashLED(75); - print_client_ip(req); Log.println("\r\nDump requested via Web"); + print_client_ip(req); ESP_LOGI(TAG, "\r\nDump requested via Web"); serialDump(); - Log.print("dump_handler CPU "); - Log.println(xPortGetCoreID()); + ESP_LOGI(TAG, "dump_handler CPU "); + ESP_LOGI(TAG, xPortGetCoreID()); static char dumpOut[2000] = ""; char * d = dumpOut; @@ -636,13 +641,13 @@ static esp_err_t dump_handler(httpd_req_t *req) { d += sprintf(d, "\n"); d += sprintf(d, "%s - Status\n", myName); // A javascript timer to refresh the page every minute. - d += sprintf(d, "\n"); + d += sprintf(d, "\n"); d += sprintf(d, "\n"); d += sprintf(d, "\n"); d += sprintf(d, "\n"); d += sprintf(d, "\n"); - d += sprintf(d, "\n"); - d+= sprintf(d,"\"\"\n"); + d += sprintf(d, "\n"); + d += sprintf(d, "\"\"\n"); if (critERR.length() > 0) { d += sprintf(d, "%s
\n", critERR.c_str()); } @@ -737,7 +742,7 @@ static esp_err_t dump_handler(httpd_req_t *req) { static esp_err_t stop_handler(httpd_req_t *req) { flashLED(75); - print_client_ip(req); Log.println("\r\nStream stop requested via Web"); + print_client_ip(req); ESP_LOGI(TAG, "\r\nStream stop requested via Web"); streamKill = true; httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); return httpd_resp_send(req, NULL, 0); @@ -752,7 +757,7 @@ static esp_err_t style_handler(httpd_req_t *req) { static esp_err_t streamviewer_handler(httpd_req_t *req) { flashLED(75); - print_client_ip(req); Log.println("Stream viewer requested"); + print_client_ip(req); ESP_LOGI(TAG, "Stream viewer requested"); httpd_resp_set_type(req, "text/html"); httpd_resp_set_hdr(req, "Content-Encoding", "identity"); return httpd_resp_send(req, (const char *)streamviewer_html, streamviewer_html_len); @@ -760,7 +765,7 @@ static esp_err_t streamviewer_handler(httpd_req_t *req) { static esp_err_t error_handler(httpd_req_t *req) { flashLED(75); - Log.println("Sending error page"); + ESP_LOGI(TAG, "Sending error page"); std::string s(error_html); size_t index; while ((index = s.find("")) != std::string::npos) @@ -780,13 +785,13 @@ void print_client_ip(httpd_req_t *req) struct sockaddr_in6 addr; // esp_http_server uses IPv6 addressing socklen_t addr_size = sizeof(addr); if (getpeername(sockfd, (struct sockaddr *)&addr, &addr_size) < 0) { - Log.println( "Error getting client IP"); + ESP_LOGI(TAG, "Error getting client IP"); return; } // inet_ntop(AF_INET, &addr.sin6_addr, ipstr, sizeof(ipstr)); inet_ntop(AF_INET, &addr.sin6_addr.un.u32_addr[3], ipstr, sizeof(ipstr)); - Log.print ("Client IP => "); - Log.println(ipstr); + ESP_LOGI(TAG, "Client IP => "); + ESP_LOGI(TAG, ipstr); } static esp_err_t index_handler(httpd_req_t *req) { @@ -827,17 +832,17 @@ static esp_err_t index_handler(httpd_req_t *req) { if (strncmp(view, "simple", sizeof(view)) == 0) { print_client_ip(req) ; - Log.print(" Simple index page requested"); - Log.print("CPU "); - Log.println(xPortGetCoreID()); + ESP_LOGI(TAG, " Simple index page requested"); + ESP_LOGI(TAG, "CPU "); + ESP_LOGI(TAG, xPortGetCoreID()); if (critERR.length() > 0) return error_handler(req); httpd_resp_set_type(req, "text/html"); httpd_resp_set_hdr(req, "Content-Encoding", "identity"); return httpd_resp_send(req, (const char *)index_simple_html, index_simple_html_len); } else if (strncmp(view, "full", sizeof(view)) == 0) { print_client_ip(req) ; - Log.print (" Full index page requested "); - Log.print("CPU "); Log.println(xPortGetCoreID()); + ESP_LOGI(TAG, " Full index page requested "); + ESP_LOGI(TAG, "CPU "); ESP_LOGI(TAG, xPortGetCoreID()); if (critERR.length() > 0) return error_handler(req); httpd_resp_set_type(req, "text/html"); httpd_resp_set_hdr(req, "Content-Encoding", "identity"); @@ -847,8 +852,8 @@ static esp_err_t index_handler(httpd_req_t *req) { return httpd_resp_send(req, (const char *)index_ov2640_html, index_ov2640_html_len); } else if (strncmp(view, "portal", sizeof(view)) == 0) { //Prototype captive portal landing page. - print_client_ip(req); Log.print("Portal page requested"); - Log.print("CPU "); Log.println(xPortGetCoreID()); + print_client_ip(req); ESP_LOGI(TAG, "Portal page requested"); + ESP_LOGI(TAG, "CPU "); ESP_LOGI(TAG, xPortGetCoreID()); std::string s(portal_html); size_t index; while ((index = s.find("")) != std::string::npos) @@ -861,8 +866,8 @@ static esp_err_t index_handler(httpd_req_t *req) { httpd_resp_set_hdr(req, "Content-Encoding", "identity"); return httpd_resp_send(req, (const char *)s.c_str(), s.length()); } else { - print_client_ip(req); Log.print("Unknown page requested: "); - Log.println(view); + print_client_ip(req); ESP_LOGI(TAG, "Unknown page requested: "); + ESP_LOGI(TAG, view); httpd_resp_send_404(req); return ESP_FAIL; } @@ -973,7 +978,7 @@ void startCameraServer(int hPort, int sPort) { config.server_port = hPort; config.ctrl_port = hPort; // config.core_id = 1; - Log.printf("Starting web server on port: '%d'\r\n", config.server_port); + ESP_LOGI(TAG, "Starting web server on port: '%d'\r\n", config.server_port); if (httpd_start(&camera_httpd, &config) == ESP_OK) { if (critERR.length() > 0) { httpd_register_uri_handler(camera_httpd, &error_uri); @@ -995,7 +1000,7 @@ void startCameraServer(int hPort, int sPort) { config.server_port = sPort; config.ctrl_port = sPort; config.core_id = 0; - Log.printf("Starting stream server on port: '%d'\r\n", config.server_port); + ESP_LOGI(TAG, "Starting stream server on port: '%d'\r\n", config.server_port); if (httpd_start(&stream_httpd, &config) == ESP_OK) { if (critERR.length() > 0) { httpd_register_uri_handler(camera_httpd, &error_uri); diff --git a/esp32-cam-webserver.ino b/esp32-cam-webserver.ino index c1c7b6b..d3d1575 100644 --- a/esp32-cam-webserver.ino +++ b/esp32-cam-webserver.ino @@ -5,6 +5,8 @@ #include #include #include +#include +#include #include "src/parsebytes.h" #include "time.h" #include @@ -37,7 +39,9 @@ an accesspoint called "ESP32-CAM-CONNECT" (password: "InsecurePassword") */ - +//#define LOG_LOCAL_LEVEL ESP_LOG_ERROR +//esp_log_level_set("*", ESP_LOG_ERROR); +static const char* TAG = "main"; // Primary config, or defaults. #if __has_include("myconfig.h") struct station { @@ -260,12 +264,12 @@ bool debugData; void debugOn() { debugData = true; - Log.println("Camera debug data is enabled (send 'd' for status dump, or any other char to disable debug)"); + ESP_LOGI(TAGLOG, "Camera debug data is enabled (send 'd' for status dump, or any other char to disable debug)"); } void debugOff() { debugData = false; - Log.println("Camera debug data is disabled (send 'd' for status dump, or any other char to enable debug)"); + ESP_LOGI(TAGLOG, "Camera debug data is disabled (send 'd' for status dump, or any other char to enable debug)"); } // Serial input (debugging controls) @@ -275,28 +279,28 @@ void handleSerial() { if (cmd == 'd' ) { serialDump(); } else if (cmd == 'i' ) { - Log.print("TaskCore0 start CPU "); - Log.println(xPortGetCoreID()); + ESP_LOGI(TAGLOG, "TaskCore0 start CPU "); + ESP_LOGI(TAGLOG, xPortGetCoreID()); } /* else if (cmd == 'a' ) { - Log.println("incPrio()"); + ESP_LOGI(TAGLOG, "incPrio()"); xHandle = xTaskGetCurrentTaskHandle(); - Log.println(uxTaskPriorityGet( xHandle )); + ESP_LOGI(TAGLOG, uxTaskPriorityGet( xHandle )); vTaskPrioritySet( xHandle , uxTaskPriorityGet( xHandle) +1); - Log.println(uxTaskPriorityGet( xHandle )); + ESP_LOGI(TAGLOG, uxTaskPriorityGet( xHandle )); } else if (cmd == 'z' ) { - Log.println("decPrio()"); + ESP_LOGI(TAGLOG, "decPrio()"); xHandle = xTaskGetCurrentTaskHandle(); - Log.println(uxTaskPriorityGet( xHandle )); + ESP_LOGI(TAGLOG, uxTaskPriorityGet( xHandle )); vTaskPrioritySet( xHandle , uxTaskPriorityGet( xHandle) -1); - Log.println(uxTaskPriorityGet( xHandle )); + ESP_LOGI(TAGLOG, uxTaskPriorityGet( xHandle )); } else if (cmd == 'l' ) { - Log.println("listtasks()"); - Log.println( "Task Name\tStatus\tPrio\tHWM\tTask\tAffinity\n"); + ESP_LOGI(TAGLOG, "listtasks()"); + ESP_LOGI(TAGLOG, "Task Name\tStatus\tPrio\tHWM\tTask\tAffinity\n"); vTaskList(&pcwriteBuffer); - Log.println( pcwriteBuffer); + ESP_LOGI(TAGLOG, pcwriteBuffer); }*/ else { if (debugData) debugOff(); @@ -324,10 +328,10 @@ void setLamp(int newVal) { // Apply a logarithmic function to the scale. int brightness = round((pow(2, (1 + (newVal * 0.02))) - 2) / 6 * pwmMax); ledcWrite(lampChannel, brightness); - Log.print("Lamp: "); - Log.print(newVal); - Log.print("%, pwm = "); - Log.println(brightness); + ESP_LOGI(TAGLOG, "Lamp: "); + ESP_LOGI(TAGLOG, newVal); + ESP_LOGI(TAGLOG, "%, pwm = "); + ESP_LOGI(TAGLOG, brightness); } #endif } @@ -335,70 +339,70 @@ void setLamp(int newVal) { void printLocalTime(bool extraData = false) { struct tm timeinfo; if (!getLocalTime(&timeinfo)) { - Log.println("Failed to obtain time"); + ESP_LOGI(TAGLOG, "Failed to obtain time"); } else { - Log.println(&timeinfo, "%H:%M:%S, %A, %B %d %Y"); + ESP_LOGI(TAGLOG, &timeinfo, "%H:%M:%S, %A, %B %d %Y"); } if (extraData) { - Log.printf("NTP Server: %s, GMT Offset: %li(s), DST Offset: %i(s)\r\n", ntpServer, gmtOffset_sec, daylightOffset_sec); + ESP_LOGI(TAGLOG, "NTP Server: %s, GMT Offset: %li(s), DST Offset: %i(s)\r\n", ntpServer, gmtOffset_sec, daylightOffset_sec); } } void TaskCore0 (void * pvParameters ) { - Log.print("TaskCore0 start CPU "); - Log.println(xPortGetCoreID()); + ESP_LOGI(TAGLOG, "TaskCore0 start CPU "); + ESP_LOGI(TAGLOG, xPortGetCoreID()); // Start the camera server startCameraServer(httpPort, streamPort); if (critERR.length() == 0) { - Log.printf("\r\nCamera Ready!\r\nUse '%s' to connect\r\n", httpURL); - Log.printf("Stream viewer available at '%sview'\r\n", streamURL); - Log.printf("Raw stream URL is '%s'\r\n", streamURL); + ESP_LOGI(TAGLOG, "\r\nCamera Ready!\r\nUse '%s' to connect\r\n", httpURL); + ESP_LOGI(TAGLOG, "Stream viewer available at '%sview'\r\n", streamURL); + ESP_LOGI(TAGLOG, "Raw stream URL is '%s'\r\n", streamURL); #if defined(DEBUG_DEFAULT_ON) debugOn(); #else debugOff(); #endif } else { - Log.printf("\r\nCamera unavailable due to initialisation errors.\r\n\r\n"); + ESP_LOGI(TAGLOG, "\r\nCamera unavailable due to initialisation errors.\r\n\r\n"); } // Info line; use for Info messages; eg 'This is a Beta!' warnings, etc. as necesscary - Log.print("\r\nThis is the 4.1 beta\r\n"); + ESP_LOGI(TAGLOG, "\r\nThis is the 4.1 beta\r\n"); // do something every 5 seconds. static unsigned long last_report = millis(); for (;;) { - Log.loop(); + //Log.loop(); if (millis() - last_report < 7 * 1000) { - vApplicationMinimalIdleHook( ); + taskYIELD( ); } else { //Log.print (millis()); - //Log.print(" CPU "); Log.println(xPortGetCoreID()); + //ESP_LOGI(TAGLOG, " CPU "); ESP_LOGI(TAGLOG, xPortGetCoreID()); last_report = millis(); //vTaskGetRunTimeStats( char *pcWriteBuffer ); - vApplicationMinimalIdleHook( ); + taskYIELD( ); } } } void asyncPos (void * pvParameters ) { - Log.print("asyncPos start CPU "); - Log.println(xPortGetCoreID()); + ESP_LOGI(TAGLOG, "asyncPos start CPU "); + ESP_LOGI(TAGLOG, xPortGetCoreID()); // Start the camera server // Info line; use for Info messages; eg 'This is a Beta!' warnings, etc. as necesscary - Log.print("\r\nasyncPos thread.\r\n"); + ESP_LOGI(TAGLOG, "\r\nasyncPos thread.\r\n"); // do something every 5 seconds. bool isYreached = false; bool isXreached = false; bool isPrefPosChanged = true; int periodtimer = 10; - if ((int)pvParameters != 0 || (int)pvParameters != NULL) + if ((int)pvParameters != 0)// || (int)pvParameters != NULL) periodtimer = (int)&pvParameters; static unsigned long lastTime = millis(); for (;;) { - Log.loop(); + //Log.loop(); if (millis() - lastTime < periodtimer) { - vApplicationMinimalIdleHook( ); + taskYIELD( ); } else { if (ptz_y_now != ptz_y) { @@ -421,11 +425,11 @@ void asyncPos (void * pvParameters ) { isXreached = true; if ( isYreached && isXreached && isPrefPosChanged ) { - saveprefpos(); + saveposPrefs(SPIFFS); isPrefPosChanged = false; } lastTime = millis(); - vApplicationMinimalIdleHook( ); + taskYIELD( ); } } } @@ -440,7 +444,7 @@ void calcURLs() { } sprintf(streamURL, "http://%s:%d/", URL_HOSTNAME, streamPort); #else - Log.println("Setting httpURL"); + ESP_LOGI(TAGLOG, "Setting httpURL"); if (httpPort != 80) { sprintf(httpURL, "http://%d.%d.%d.%d:%d/", ip[0], ip[1], ip[2], ip[3], httpPort); } else { @@ -451,8 +455,8 @@ void calcURLs() { } void StartCamera() { - Log.print("StartCamera CPU "); - Log.println(xPortGetCoreID()); + ESP_LOGI(TAGLOG, "StartCamera CPU "); + ESP_LOGI(TAGLOG, xPortGetCoreID()); // Populate camera config structure with hardware and other defaults config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; @@ -495,9 +499,9 @@ void StartCamera() { esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { delay(100); // need a delay here or the next serial o/p gets missed - Log.printf("\r\n\r\nCRITICAL FAILURE: Camera sensor failed to initialise.\r\n\r\n"); - Log.printf("A full (hard, power off/on) reboot will probably be needed to recover from this.\r\n"); - Log.printf("Meanwhile; this unit will reboot in 1 minute since these errors sometime clear automatically\r\n"); + ESP_LOGI(TAGLOG, "\r\n\r\nCRITICAL FAILURE: Camera sensor failed to initialise.\r\n\r\n"); + ESP_LOGI(TAGLOG, "A full (hard, power off/on) reboot will probably be needed to recover from this.\r\n"); + ESP_LOGI(TAGLOG, "Meanwhile; this unit will reboot in 1 minute since these errors sometime clear automatically\r\n"); // Reset the I2C bus.. may help when rebooting. periph_module_disable(PERIPH_I2C0_MODULE); // try to shut I2C down properly in case that is the problem periph_module_disable(PERIPH_I2C1_MODULE); @@ -510,7 +514,7 @@ void StartCamera() { esp_task_wdt_init(60, true); esp_task_wdt_add(NULL); } else { - Log.println("Camera init succeeded"); + ESP_LOGI(TAGLOG, "Camera init succeeded"); // Get a reference to the sensor sensor_t * s = esp_camera_sensor_get(); @@ -518,11 +522,11 @@ void StartCamera() { // Dump camera module, warn for unsupported modules. sensorPID = s->id.PID; switch (sensorPID) { - case OV9650_PID: Log.println("WARNING: OV9650 camera module is not properly supported, will fallback to OV2640 operation"); break; - case OV7725_PID: Log.println("WARNING: OV7725 camera module is not properly supported, will fallback to OV2640 operation"); break; - case OV2640_PID: Log.println("OV2640 camera module detected"); break; - case OV3660_PID: Log.println("OV3660 camera module detected"); break; - default: Log.println("WARNING: Camera module is unknown and not properly supported, will fallback to OV2640 operation"); + case OV9650_PID: ESP_LOGI(TAGLOG, "WARNING: OV9650 camera module is not properly supported, will fallback to OV2640 operation"); break; + case OV7725_PID: ESP_LOGI(TAGLOG, "WARNING: OV7725 camera module is not properly supported, will fallback to OV2640 operation"); break; + case OV2640_PID: ESP_LOGI(TAGLOG, "OV2640 camera module detected"); break; + case OV3660_PID: ESP_LOGI(TAGLOG, "OV3660 camera module detected"); break; + default: ESP_LOGI(TAGLOG, "WARNING: Camera module is unknown and not properly supported, will fallback to OV2640 operation"); } // OV3660 initial sensors are flipped vertically and colors are a bit saturated @@ -594,22 +598,22 @@ void WifiSetup() { flashLED(300); delay(100); flashLED(300); - Log.println("Starting WiFi"); + ESP_LOGI(TAGLOG, "Starting WiFi"); // Disable power saving on WiFi to improve responsiveness // (https://github.com/espressif/arduino-esp32/issues/1484) WiFi.setSleep(false); - Log.print("Known external SSIDs: "); + ESP_LOGI(TAGLOG, "Known external SSIDs: "); if (stationCount > firstStation) { - for (int i = firstStation; i < stationCount; i++) Log.printf(" '%s'", stationList[i].ssid); + for (int i = firstStation; i < stationCount; i++) ESP_LOGI(TAGLOG, " '%s'", stationList[i].ssid); } else { - Log.print("None"); + ESP_LOGI(TAGLOG, "None"); } - Log.println(); + //ESP_LOGI(TAGLOG, ); byte mac[6] = {0, 0, 0, 0, 0, 0}; WiFi.macAddress(mac); - Log.printf("MAC address: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + ESP_LOGI(TAGLOG, "MAC address: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); int bestStation = -1; long bestRSSI = -1024; @@ -617,21 +621,21 @@ void WifiSetup() { uint8_t bestBSSID[6]; if (stationCount > firstStation) { // We have a list to scan - Log.printf("Scanning local Wifi Networks\r\n"); + ESP_LOGI(TAGLOG, "Scanning local Wifi Networks\r\n"); int stationsFound = WiFi.scanNetworks(); - Log.printf("%i networks found\r\n", stationsFound); + ESP_LOGI(TAGLOG, "%i networks found\r\n", stationsFound); if (stationsFound > 0) { for (int i = 0; i < stationsFound; ++i) { // Print SSID and RSSI for each network found String thisSSID = WiFi.SSID(i); int thisRSSI = WiFi.RSSI(i); String thisBSSID = WiFi.BSSIDstr(i); - Log.printf("%3i : [%s] %s (%i)", i + 1, thisBSSID.c_str(), thisSSID.c_str(), thisRSSI); + ESP_LOGI(TAGLOG, "%3i : [%s] %s (%i)", i + 1, thisBSSID.c_str(), thisSSID.c_str(), thisRSSI); // Scan our list of known external stations for (int sta = firstStation; sta < stationCount; sta++) { if ((strcmp(stationList[sta].ssid, thisSSID.c_str()) == 0) || (strcmp(stationList[sta].ssid, thisBSSID.c_str()) == 0)) { - Log.print(" - Known!"); + ESP_LOGI(TAGLOG, " - Known!"); // Chose the strongest RSSI seen if (thisRSSI > bestRSSI) { bestStation = sta; @@ -642,7 +646,7 @@ void WifiSetup() { } } } - Log.println(); + //ESP_LOGI(TAGLOG, ); } } } else { @@ -653,22 +657,22 @@ void WifiSetup() { if (bestStation == -1) { if (!accesspoint) { #if defined(WIFI_AP_ENABLE) - Log.println("No known networks found, entering AccessPoint fallback mode"); + ESP_LOGI(TAGLOG, "No known networks found, entering AccessPoint fallback mode"); accesspoint = true; #else - Log.println("No known networks found"); + ESP_LOGI(TAGLOG, "No known networks found"); #endif } else { - Log.println("AccessPoint mode selected in config"); + ESP_LOGI(TAGLOG, "AccessPoint mode selected in config"); } } else { - Log.printf("Connecting to Wifi Network %d: [%02X:%02X:%02X:%02X:%02X:%02X] %s \r\n", - bestStation, bestBSSID[0], bestBSSID[1], bestBSSID[2], bestBSSID[3], - bestBSSID[4], bestBSSID[5], bestSSID); + ESP_LOGI(TAGLOG, "Connecting to Wifi Network %d: [%02X:%02X:%02X:%02X:%02X:%02X] %s \r\n", + bestStation, bestBSSID[0], bestBSSID[1], bestBSSID[2], bestBSSID[3], + bestBSSID[4], bestBSSID[5], bestSSID); // Apply static settings if necesscary if (stationList[bestStation].dhcp == false) { #if defined(ST_IP) - Log.println("Applying static IP settings"); + ESP_LOGI(TAGLOG, "Applying static IP settings"); #if !defined (ST_GATEWAY) || !defined (ST_NETMASK) #error "You must supply both Gateway and NetMask when specifying a static IP address" #endif @@ -687,7 +691,7 @@ void WifiSetup() { #endif #endif #else - Log.println("Static IP settings requested but not defined in config, falling back to dhcp"); + ESP_LOGI(TAGLOG, "Static IP settings requested but not defined in config, falling back to dhcp"); #endif } @@ -700,21 +704,21 @@ void WifiSetup() { unsigned long start = millis(); while ((millis() - start <= WIFI_WATCHDOG) && (WiFi.status() != WL_CONNECTED)) { delay(500); - Log.print('.'); + ESP_LOGI(TAGLOG, '.'); } - Log.println(); - Log.begin(); + //ESP_LOGI(TAGLOG, ); + //Log.begin(); // If we have connected, inform user if (WiFi.status() == WL_CONNECTED) { - Log.println("Client connection succeeded"); + ESP_LOGI(TAGLOG, "Client connection succeeded"); accesspoint = false; // Note IP details ip = WiFi.localIP(); net = WiFi.subnetMask(); gw = WiFi.gatewayIP(); - Log.printf("IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); - Log.printf("Netmask : %d.%d.%d.%d\r\n", net[0], net[1], net[2], net[3]); - Log.printf("Gateway : %d.%d.%d.%d\r\n", gw[0], gw[1], gw[2], gw[3]); + ESP_LOGI(TAGLOG, "IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); + ESP_LOGI(TAGLOG, "Netmask : %d.%d.%d.%d\r\n", net[0], net[1], net[2], net[3]); + ESP_LOGI(TAGLOG, "Gateway : %d.%d.%d.%d\r\n", gw[0], gw[1], gw[2], gw[3]); calcURLs(); // Flash the LED to show we are connected for (int i = 0; i < 5; i++) { @@ -722,7 +726,7 @@ void WifiSetup() { delay(150); } } else { - Log.println("Client connection Failed"); + ESP_LOGI(TAGLOG, "Client connection Failed"); WiFi.disconnect(); // (resets the WiFi scan) } } @@ -730,20 +734,20 @@ void WifiSetup() { if (accesspoint && (WiFi.status() != WL_CONNECTED)) { // The accesspoint has been enabled, and we have not connected to any existing networks #if defined(AP_CHAN) - Log.println("Setting up Fixed Channel AccessPoint"); - Log.print(" SSID : "); - Log.println(stationList[0].ssid); - Log.print(" Password : "); - Log.println(stationList[0].password); - Log.print(" Channel : "); - Log.println(AP_CHAN); + ESP_LOGI(TAGLOG, "Setting up Fixed Channel AccessPoint"); + ESP_LOGI(TAGLOG, " SSID : "); + ESP_LOGI(TAGLOG, stationList[0].ssid); + ESP_LOGI(TAGLOG, " Password : "); + ESP_LOGI(TAGLOG, stationList[0].password); + ESP_LOGI(TAGLOG, " Channel : "); + ESP_LOGI(TAGLOG, AP_CHAN); WiFi.softAP(stationList[0].ssid, stationList[0].password, AP_CHAN); # else - Log.println("Setting up AccessPoint"); - Log.print(" SSID : "); - Log.println(stationList[0].ssid); - Log.print(" Password : "); - Log.println(stationList[0].password); + ESP_LOGI(TAGLOG, "Setting up AccessPoint"); + ESP_LOGI(TAGLOG, " SSID : "); + ESP_LOGI(TAGLOG, stationList[0].ssid); + ESP_LOGI(TAGLOG, " Password : "); + ESP_LOGI(TAGLOG, stationList[0].password); WiFi.softAP(stationList[0].ssid, stationList[0].password); #endif #if defined(AP_ADDRESS) @@ -760,7 +764,7 @@ void WifiSetup() { net = WiFi.subnetMask(); gw = WiFi.gatewayIP(); strcpy(apName, stationList[0].ssid); - Log.printf("IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); + ESP_LOGI(TAGLOG, "IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); calcURLs(); // Flash the LED to show we are connected for (int i = 0; i < 5; i++) { @@ -769,7 +773,7 @@ void WifiSetup() { } // Start the DNS captive portal if requested if (stationList[0].dhcp == true) { - Log.println("Starting Captive Portal"); + ESP_LOGI(TAGLOG, "Starting Captive Portal"); dnsServer.start(DNS_PORT, "*", ip); captivePortal = true; } @@ -779,11 +783,11 @@ void WifiSetup() { void setup() { Serial.begin(115200); Serial.setDebugOutput(true); - Log.addPrintStream(std::make_shared(webSerialStream)); + //Log.addPrintStream(std::make_shared(webSerialStream)); if (stationCount == 0) { - Log.println("\r\nFatal Error; Halting"); + ESP_LOGI(TAGLOG, "\r\nFatal Error; Halting"); while (true) { - Log.println("No wifi details have been configured; we cannot connect to existing WiFi or start our own AccessPoint, there is no point in proceeding."); + ESP_LOGI(TAGLOG, "No wifi details have been configured; we cannot connect to existing WiFi or start our own AccessPoint, there is no point in proceeding."); delay(5000); } } @@ -791,23 +795,23 @@ void setup() { while ((WiFi.status() != WL_CONNECTED) && !accesspoint) { WifiSetup(); } - Log.begin(); - Log.print("setup: Log.begin(), CPU "); - Log.println(xPortGetCoreID()); - Log.println(); - Log.println("===="); - Log.print("esp32-cam-webserver: "); - Log.println(myName); - Log.print("Code Built: "); - Log.println(myVer); - Log.print("Base Release: "); - Log.println(baseVersion); - Log.println(); + //Log.begin(); + ESP_LOGI(TAGLOG, "setup: Log.begin(), CPU "); + ESP_LOGI(TAGLOG, xPortGetCoreID()); + //ESP_LOGI(TAGLOG, ); + ESP_LOGI(TAGLOG, "===="); + ESP_LOGI(TAGLOG, "esp32-cam-webserver: "); + ESP_LOGI(TAGLOG, myName); + ESP_LOGI(TAGLOG, "Code Built: "); + ESP_LOGI(TAGLOG, myVer); + ESP_LOGI(TAGLOG, "Base Release: "); + ESP_LOGI(TAGLOG, baseVersion); + //ESP_LOGI(TAGLOG, ); // Warn if no PSRAM is detected (typically user error with board selection in the IDE) if (!psramFound()) { - Log.println("\r\nFatal Error; Halting"); + ESP_LOGI(TAGLOG, "\r\nFatal Error; Halting"); while (true) { - Log.println("No PSRAM found; camera cannot be initialised: Please check the board config for your module."); + ESP_LOGI(TAGLOG, "No PSRAM found; camera cannot be initialised: Please check the board config for your module."); delay(5000); } } @@ -832,7 +836,7 @@ void setup() { loadPrefs(SPIFFS); loadposPrefs(SPIFFS); } else { - Log.println("No Internal Filesystem, cannot load or save preferences"); + ESP_LOGI(TAGLOG, "No Internal Filesystem, cannot load or save preferences"); } /* @@ -845,7 +849,7 @@ void setup() { // Set up OTA if (otaEnabled) { // Start OTA once connected - Log.println("Setting up OTA"); + ESP_LOGI(TAGLOG, "Setting up OTA"); // Port defaults to 3232 // ArduinoOTA.setPort(3232); // Hostname defaults to esp3232-[MAC] @@ -853,9 +857,9 @@ void setup() { // No authentication by default if (strlen(otaPassword) != 0) { ArduinoOTA.setPassword(otaPassword); - Log.printf("OTA Password: %s\n\r", otaPassword); + ESP_LOGI(TAGLOG, "OTA Password: %s\n\r", otaPassword); } else { - Log.printf("\r\nNo OTA password has been set! (insecure)\r\n\r\n"); + ESP_LOGI(TAGLOG, "\r\nNo OTA password has been set! (insecure)\r\n\r\n"); } ArduinoOTA .onStart([]() { @@ -865,54 +869,54 @@ void setup() { else // U_SPIFFS // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end() type = "filesystem"; - Log.println("Start updating " + type); - Log.print("setup ArduinoOTA.onStart CPU "); - Log.println(xPortGetCoreID()); + ESP_LOGI(TAGLOG, "Start updating " + type); + ESP_LOGI(TAGLOG, "setup ArduinoOTA.onStart CPU "); + ESP_LOGI(TAGLOG, xPortGetCoreID()); // Stop the camera since OTA will crash the module if it is running. // the unit will need rebooting to restart it, either by OTA on success, or manually by the user - Log.println("Stopping Camera"); + ESP_LOGI(TAGLOG, "Stopping Camera"); esp_err_t err = esp_camera_deinit(); critERR = "

OTA Has been started


Camera has Halted!

"; critERR += "

Wait for OTA to finish and reboot, or reboot manually to recover

"; }) .onEnd([]() { - Log.println("\r\nEnd"); + ESP_LOGI(TAGLOG, "\r\nEnd"); }) .onProgress([](unsigned int progress, unsigned int total) { - Log.printf("Progress: %u%%\r", (progress / (total / 100))); + ESP_LOGI(TAGLOG, "Progress: %u%%\r", (progress / (total / 100))); }) .onError([](ota_error_t error) { - Log.printf("Error[%u]: ", error); - if (error == OTA_AUTH_ERROR) Log.println("Auth Failed"); - else if (error == OTA_BEGIN_ERROR) Log.println("Begin Failed"); - else if (error == OTA_CONNECT_ERROR) Log.println("Connect Failed"); - else if (error == OTA_RECEIVE_ERROR) Log.println("Receive Failed"); - else if (error == OTA_END_ERROR) Log.println("End Failed"); + ESP_LOGI(TAGLOG, "Error[%u]: ", error); + if (error == OTA_AUTH_ERROR) ESP_LOGI(TAGLOG, "Auth Failed"); + else if (error == OTA_BEGIN_ERROR) ESP_LOGI(TAGLOG, "Begin Failed"); + else if (error == OTA_CONNECT_ERROR) ESP_LOGI(TAGLOG, "Connect Failed"); + else if (error == OTA_RECEIVE_ERROR) ESP_LOGI(TAGLOG, "Receive Failed"); + else if (error == OTA_END_ERROR) ESP_LOGI(TAGLOG, "End Failed"); }); ArduinoOTA.begin(); } else { - Log.println("OTA is disabled"); + ESP_LOGI(TAGLOG, "OTA is disabled"); if (!MDNS.begin(mdnsName)) { - Log.println("Error setting up MDNS responder!"); + ESP_LOGI(TAGLOG, "Error setting up MDNS responder!"); } - Log.println("mDNS responder started"); + ESP_LOGI(TAGLOG, "mDNS responder started"); } //MDNS Config -- note that if OTA is NOT enabled this needs prior steps! MDNS.addService("http", "tcp", 80); - Log.println("Added HTTP service to MDNS server"); + ESP_LOGI(TAGLOG, "Added HTTP service to MDNS server"); MDNS.addService("webserial", "tcp", 8514); - Log.println("Added webserial service to MDNS server"); + ESP_LOGI(TAGLOG, "Added webserial service to MDNS server"); // Set time via NTP server when enabled if (haveTime) { - Log.print("Time: "); + ESP_LOGI(TAGLOG, "Time: "); configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); printLocalTime(true); } else { - Log.println("Time functions disabled"); + ESP_LOGI(TAGLOG, "Time functions disabled"); } // Gather static values used when dumping status; these are slow functions, so just do them once during startup @@ -929,15 +933,15 @@ void setup() { else setLamp(lampVal); #endif } else { - Log.println("No lamp, or lamp disabled in config"); + ESP_LOGI(TAGLOG, "No lamp, or lamp disabled in config"); } // As a final init step chomp out the serial buffer in case we have recieved mis-keys or garbage during startup while (Serial.available()) Serial.read(); - xTaskCreatePinnedToCore(TaskCore0, "TaskCore0", 1000, NULL, 1, &TaskCore0Handle, 0); + xTaskCreatePinnedToCore(TaskCore0, "TaskCore0", 1000, NULL, tskIDLE_PRIORITY + 1, &TaskCore0Handle, 0); int pvPeriodtimer = 10; - xTaskCreatePinnedToCore(asyncPos, "asyncPos", 1000, pvPeriodtimer, 0, &asyncPos1Handle, 1); + xTaskCreatePinnedToCore(asyncPos, "asyncPos", 1000, ( void* ) &pvPeriodtimer, tskIDLE_PRIORITY, &asyncPos1Handle, 1); } @@ -965,7 +969,7 @@ void loop() { // We are connected, wait a bit and re-check if (warned) { // Tell the user if we have just reconnected - Log.println("WiFi reconnected"); + ESP_LOGI(TAGLOG, "WiFi reconnected"); warned = false; } // loop here for WIFI_WATCHDOG, turning debugData true/false depending on serial input.. @@ -978,11 +982,11 @@ void loop() { } else { // disconnected; attempt to reconnect if (!warned) { - Log.print("loop CPU "); - Log.println(xPortGetCoreID()); + ESP_LOGI(TAGLOG, "loop CPU "); + ESP_LOGI(TAGLOG, xPortGetCoreID()); // Tell the user if we just disconnected WiFi.disconnect(); // ensures disconnect is complete, wifi scan cleared - Log.println("WiFi disconnected, retrying"); + ESP_LOGI(TAGLOG, "WiFi disconnected, retrying"); warned = true; } WifiSetup(); diff --git a/storage.cpp b/storage.cpp index 3d81fc6..04ae3a0 100644 --- a/storage.cpp +++ b/storage.cpp @@ -1,3 +1,4 @@ +#include #include "esp_camera.h" #include "src/jsonlib/jsonlib.h" #include "storage.h" @@ -9,6 +10,8 @@ extern int lampVal; // The current Lamp value extern bool autoLamp; // Automatic lamp mode extern int xclk; // Camera module clock speed extern int minFrameTime; // Limits framerate +extern Servo servo1; +extern Servo servo2; extern int Servo1Pin; extern int Servo2Pin; extern int Servo_Step; From 554e9adbfcb93419c30446408281b9edecda466b Mon Sep 17 00:00:00 2001 From: Zalgo <80800403+ZalgoSoft@users.noreply.github.com> Date: Sun, 19 Jun 2022 18:54:10 +0800 Subject: [PATCH 09/12] care about pointer void* --- esp32-cam-webserver.ino | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/esp32-cam-webserver.ino b/esp32-cam-webserver.ino index d3d1575..d0814be 100644 --- a/esp32-cam-webserver.ino +++ b/esp32-cam-webserver.ino @@ -395,8 +395,8 @@ void asyncPos (void * pvParameters ) { bool isXreached = false; bool isPrefPosChanged = true; int periodtimer = 10; - if ((int)pvParameters != 0)// || (int)pvParameters != NULL) - periodtimer = (int)&pvParameters; + if ((int&)pvParameters != 0 && (int&)pvParameters > 0 && (int&)pvParameters < 100 )// || (int)pvParameters != NULL) + periodtimer = (int&)pvParameters; static unsigned long lastTime = millis(); for (;;) { //Log.loop(); @@ -941,7 +941,7 @@ void setup() { while (Serial.available()) Serial.read(); xTaskCreatePinnedToCore(TaskCore0, "TaskCore0", 1000, NULL, tskIDLE_PRIORITY + 1, &TaskCore0Handle, 0); int pvPeriodtimer = 10; - xTaskCreatePinnedToCore(asyncPos, "asyncPos", 1000, ( void* ) &pvPeriodtimer, tskIDLE_PRIORITY, &asyncPos1Handle, 1); + xTaskCreatePinnedToCore(asyncPos, "asyncPos", 1000, ( void* ) pvPeriodtimer, tskIDLE_PRIORITY, &asyncPos1Handle, 1); } From a72b4472026851effd3d8a196827012031814b4f Mon Sep 17 00:00:00 2001 From: Zalgo <80800403+ZalgoSoft@users.noreply.github.com> Date: Mon, 20 Jun 2022 14:41:31 +0800 Subject: [PATCH 10/12] update - works now ! --- app_httpd.cpp | 203 ++++++++++++------------- esp32-cam-webserver.ino | 327 ++++++++++++++++++++-------------------- partitions.csv | 6 + platformio.ini | 4 +- storage.cpp | 158 +++++++++---------- storage.h | 2 +- 6 files changed, 357 insertions(+), 343 deletions(-) create mode 100644 partitions.csv diff --git a/app_httpd.cpp b/app_httpd.cpp index bc5b23f..53e2d11 100644 --- a/app_httpd.cpp +++ b/app_httpd.cpp @@ -24,9 +24,9 @@ #include #include #include -#include +//#include #include -#include +//#include #include "index_ov2640.h" #include "index_ov3660.h" #include "index_other.h" @@ -73,7 +73,7 @@ extern bool otaEnabled; extern char otaPassword[]; extern unsigned long xclk; extern int sensorPID; -static const char* TAG = "httpd"; +//static const char* TAG = "httpd"; extern Servo servo1; extern Servo servo2; @@ -107,54 +107,54 @@ uint8_t temprature_sens_read(); #endif void serialDump() { - //ESP_LOGI(TAG, ); + ////ESP_LOGI(TAG, ); // Module - ESP_LOGI(TAG, "Name: %s\r\n", myName); + //ESP_LOGI(TAG, "Name: %s\r\n", myName); if (haveTime) { - ESP_LOGI(TAG, "Time: "); + //ESP_LOGI(TAG, "Time: "); printLocalTime(true); } - ESP_LOGI(TAG, "Firmware: %s (base: %s)\r\n", myVer, baseVersion); + //ESP_LOGI(TAG, "Firmware: %s (base: %s)\r\n", myVer, baseVersion); float sketchPct = 100 * sketchSize / sketchSpace; - ESP_LOGI(TAG, "Sketch Size: %i (total: %i, %.1f%% used)\r\n", sketchSize, sketchSpace, sketchPct); - ESP_LOGI(TAG, "MD5: %s\r\n", sketchMD5.c_str()); - ESP_LOGI(TAG, "ESP sdk: %s\r\n", ESP.getSdkVersion()); - ESP_LOGI(TAG, "This thread core affinity: "); - ESP_LOGI(TAG, xPortGetCoreID()); + //ESP_LOGI(TAG, "Sketch Size: %i (total: %i, %.1f%% used)\r\n", sketchSize, sketchSpace, sketchPct); + //ESP_LOGI(TAG, "MD5: %s\r\n", sketchMD5.c_str()); + //ESP_LOGI(TAG, "ESP sdk: %s\r\n", ESP.getSdkVersion()); + //ESP_LOGI(TAG, "This thread core affinity: "); + //ESP_LOGI(TAG, xPortGetCoreID()); if (otaEnabled) { if (strlen(otaPassword) != 0) { - ESP_LOGI(TAG, "OTA: Enabled, Password: %s\n\r", otaPassword); + //ESP_LOGI(TAG, "OTA: Enabled, Password: %s\n\r", otaPassword); } else { - ESP_LOGI(TAG, "OTA: Enabled, No Password! (insecure)\n\r"); + //ESP_LOGI(TAG, "OTA: Enabled, No Password! (insecure)\n\r"); } } else { - ESP_LOGI(TAG, "OTA: Disabled\n\r"); + //ESP_LOGI(TAG, "OTA: Disabled\n\r"); } // Network if (accesspoint) { if (captivePortal) { - ESP_LOGI(TAG, "WiFi Mode: AccessPoint with captive portal\r\n"); + //ESP_LOGI(TAG, "WiFi Mode: AccessPoint with captive portal\r\n"); } else { - ESP_LOGI(TAG, "WiFi Mode: AccessPoint\r\n"); + //ESP_LOGI(TAG, "WiFi Mode: AccessPoint\r\n"); } - ESP_LOGI(TAG, "WiFi SSID: %s\r\n", apName); + //ESP_LOGI(TAG, "WiFi SSID: %s\r\n", apName); } else { - ESP_LOGI(TAG, "WiFi Mode: Client\r\n"); + //ESP_LOGI(TAG, "WiFi Mode: Client\r\n"); String ssidName = WiFi.SSID(); - ESP_LOGI(TAG, "WiFi Ssid: %s\r\n", ssidName.c_str()); - ESP_LOGI(TAG, "WiFi Rssi: %i\r\n", WiFi.RSSI()); + //ESP_LOGI(TAG, "WiFi Ssid: %s\r\n", ssidName.c_str()); + //ESP_LOGI(TAG, "WiFi Rssi: %i\r\n", WiFi.RSSI()); String bssid = WiFi.BSSIDstr(); - ESP_LOGI(TAG, "WiFi BSSID: %s\r\n", bssid.c_str()); + //ESP_LOGI(TAG, "WiFi BSSID: %s\r\n", bssid.c_str()); } - ESP_LOGI(TAG, "WiFi IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); + //ESP_LOGI(TAG, "WiFi IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); if (!accesspoint) { - ESP_LOGI(TAG, "WiFi Netmask: %d.%d.%d.%d\r\n", net[0], net[1], net[2], net[3]); - ESP_LOGI(TAG, "WiFi Gateway: %d.%d.%d.%d\r\n", gw[0], gw[1], gw[2], gw[3]); + //ESP_LOGI(TAG, "WiFi Netmask: %d.%d.%d.%d\r\n", net[0], net[1], net[2], net[3]); + //ESP_LOGI(TAG, "WiFi Gateway: %d.%d.%d.%d\r\n", gw[0], gw[1], gw[2], gw[3]); } - ESP_LOGI(TAG, "WiFi Http port: %i, Stream port: %i\r\n", httpPort, streamPort); + //ESP_LOGI(TAG, "WiFi Http port: %i, Stream port: %i\r\n", httpPort, streamPort); byte mac[6]; WiFi.macAddress(mac); - ESP_LOGI(TAG, "WiFi MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + //ESP_LOGI(TAG, "WiFi MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); // System int64_t sec = esp_timer_get_time() / 1000000; int64_t upDays = int64_t(floor(sec / 86400)); @@ -163,31 +163,31 @@ void serialDump() { int upSec = sec % 60; int McuTc = (temprature_sens_read() - 32) / 1.8; // celsius int McuTf = temprature_sens_read(); // fahrenheit - ESP_LOGI(TAG, "System up: %" PRId64 ":%02i:%02i:%02i (d:h:m:s)\r\n", upDays, upHours, upMin, upSec); - ESP_LOGI(TAG, "Active streams: %i, Previous streams: %lu, Images captured: %lu\r\n", streamCount, streamsServed, imagesServed); - ESP_LOGI(TAG, "CPU Freq: %i MHz, Xclk Freq: %i MHz\r\n", ESP.getCpuFreqMHz(), xclk); - ESP_LOGI(TAG, "MCU temperature : %i C, %i F (approximate)\r\n", McuTc, McuTf); - ESP_LOGI(TAG, "Heap: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getHeapSize(), ESP.getFreeHeap(), ESP.getMinFreeHeap(), ESP.getMaxAllocHeap()); + //ESP_LOGI(TAG, "System up: %" PRId64 ":%02i:%02i:%02i (d:h:m:s)\r\n", upDays, upHours, upMin, upSec); + //ESP_LOGI(TAG, "Active streams: %i, Previous streams: %lu, Images captured: %lu\r\n", streamCount, streamsServed, imagesServed); + //ESP_LOGI(TAG, "CPU Freq: %i MHz, Xclk Freq: %i MHz\r\n", ESP.getCpuFreqMHz(), xclk); + //ESP_LOGI(TAG, "MCU temperature : %i C, %i F (approximate)\r\n", McuTc, McuTf); + //ESP_LOGI(TAG, "Heap: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getHeapSize(), ESP.getFreeHeap(), ESP.getMinFreeHeap(), ESP.getMaxAllocHeap()); if (psramFound()) { - ESP_LOGI(TAG, "Psram: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getPsramSize(), ESP.getFreePsram(), ESP.getMinFreePsram(), ESP.getMaxAllocPsram()); + //ESP_LOGI(TAG, "Psram: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getPsramSize(), ESP.getFreePsram(), ESP.getMinFreePsram(), ESP.getMaxAllocPsram()); } else { - ESP_LOGI(TAG, "Psram: Not found; please check your board configuration.\r\n"); - ESP_LOGI(TAG, "- High resolution/quality settings will show incomplete frames to low memory.\r\n"); + //ESP_LOGI(TAG, "Psram: Not found; please check your board configuration.\r\n"); + //ESP_LOGI(TAG, "- High resolution/quality settings will show incomplete frames to low memory.\r\n"); } // Filesystems if (filesystem && (SPIFFS.totalBytes() > 0)) { - ESP_LOGI(TAG, "Spiffs: %i, used: %i\r\n", SPIFFS.totalBytes(), SPIFFS.usedBytes()); + //ESP_LOGI(TAG, "Spiffs: %i, used: %i\r\n", SPIFFS.totalBytes(), SPIFFS.usedBytes()); } else { - ESP_LOGI(TAG, "Spiffs: No filesystem found, please check your board configuration.\r\n"); - ESP_LOGI(TAG, "- Saving and restoring camera settings will not function without this.\r\n"); + //ESP_LOGI(TAG, "Spiffs: No filesystem found, please check your board configuration.\r\n"); + //ESP_LOGI(TAG, "- Saving and restoring camera settings will not function without this.\r\n"); } - ESP_LOGI(TAG, "Preferences file: "); + //ESP_LOGI(TAG, "Preferences file: "); dumpPrefs(SPIFFS); if (critERR.length() > 0) { - ESP_LOGI(TAG, "\r\n\r\nAn error or halt has occurred with Camera Hardware, see previous messages.\r\n"); - ESP_LOGI(TAG, "A reboot is required to recover from this.\r\nError message: (html)\r\n %s\r\n\r\n", critERR.c_str()); + //ESP_LOGI(TAG, "\r\n\r\nAn error or halt has occurred with Camera Hardware, see previous messages.\r\n"); + //ESP_LOGI(TAG, "A reboot is required to recover from this.\r\nError message: (html)\r\n %s\r\n\r\n", critERR.c_str()); } - //ESP_LOGI(TAG, ); + ////ESP_LOGI(TAG, ); return; } @@ -195,8 +195,8 @@ static esp_err_t capture_handler(httpd_req_t *req) { camera_fb_t * fb = NULL; esp_err_t res = ESP_OK; - ESP_LOGI(TAG, "capture_handler CPU "); - ESP_LOGI(TAG, xPortGetCoreID()); + Serial.println( "capture_handler CPU "); + //ESP_LOGI(TAG, xPortGetCoreID()); if (autoLamp && (lampVal != -1)) { setLamp(lampVal); delay(75); // coupled with the status led flash this gives ~150ms for lamp to settle. @@ -207,7 +207,7 @@ static esp_err_t capture_handler(httpd_req_t *req) { fb = esp_camera_fb_get(); if (!fb) { - ESP_LOGI(TAG, "CAPTURE: failed to acquire frame"); + //ESP_LOGI(TAG, "CAPTURE: failed to acquire frame"); httpd_resp_send_500(req); if (autoLamp && (lampVal != -1)) setLamp(0); return ESP_FAIL; @@ -223,14 +223,14 @@ static esp_err_t capture_handler(httpd_req_t *req) { res = httpd_resp_send(req, (const char *)fb->buf, fb->len); } else { res = ESP_FAIL; - ESP_LOGI(TAG, "Capture Error: Non-JPEG image returned by camera module"); + //ESP_LOGI(TAG, "Capture Error: Non-JPEG image returned by camera module"); } esp_camera_fb_return(fb); fb = NULL; int64_t fr_end = esp_timer_get_time(); if (debugData) { - ESP_LOGI(TAG, "JPG: %uB %ums\r\n", (uint32_t)(fb_len), (uint32_t)((fr_end - fr_start) / 1000)); + //ESP_LOGI(TAG, "JPG: %uB %ums\r\n", (uint32_t)(fb_len), (uint32_t)((fr_end - fr_start) / 1000)); } imagesServed++; if (autoLamp && (lampVal != -1)) { @@ -248,9 +248,10 @@ static esp_err_t stream_handler(httpd_req_t *req) { streamKill = false; - print_client_ip(req); ESP_LOGI(TAG, "Stream requested"); - ESP_LOGI(TAG, " stream_handler CPU "); - ESP_LOGI(TAG, xPortGetCoreID()); + print_client_ip(req); + Serial.println( "Stream requested"); + //ESP_LOGI(TAG, " stream_handler CPU "); + //ESP_LOGI(TAG, xPortGetCoreID()); if (autoLamp && (lampVal != -1)) setLamp(lampVal); streamCount = 1; // at present we only have one stream handler, so values are 0 or 1.. flashLED(75); // double flash of status LED @@ -266,7 +267,7 @@ static esp_err_t stream_handler(httpd_req_t *req) { if (res != ESP_OK) { streamCount = 0; if (autoLamp && (lampVal != -1)) setLamp(0); - ESP_LOGI(TAG, "STREAM: failed to set HTTP response type"); + //ESP_LOGI(TAG, "STREAM: failed to set HTTP response type"); return res; } @@ -279,11 +280,11 @@ static esp_err_t stream_handler(httpd_req_t *req) { while (true) { fb = esp_camera_fb_get(); if (!fb) { - ESP_LOGI(TAG, "STREAM: failed to acquire frame"); + Serial.println( "STREAM: failed to acquire frame"); res = ESP_FAIL; } else { if (fb->format != PIXFORMAT_JPEG) { - ESP_LOGI(TAG, "STREAM: Non-JPEG frame returned by camera module"); + Serial.println( "STREAM: Non-JPEG frame returned by camera module"); res = ESP_FAIL; } else { _jpg_buf_len = fb->len; @@ -311,12 +312,12 @@ static esp_err_t stream_handler(httpd_req_t *req) { if (res != ESP_OK) { // This is the error exit point from the stream loop. // We end the stream here only if a Hard failure has been encountered or the connection has been interrupted. - ESP_LOGI(TAG, "Stream failed, code = %i : %s\r\n", res, esp_err_to_name(res)); + Serial.printf( "Stream failed, code = %i : %s\r\n", res, esp_err_to_name(res)); break; } if ((res != ESP_OK) || streamKill) { // We end the stream here when a kill is signalled. - ESP_LOGI(TAG, "Stream killed\r\n"); + Serial.println( "Stream killed\r\n"); break; } int64_t frame_time = esp_timer_get_time() - last_frame; @@ -325,9 +326,9 @@ static esp_err_t stream_handler(httpd_req_t *req) { delay(frame_delay); if (debugData) { - ESP_LOGI(TAG, "MJPG: %uB %ums, delay: %ums, framerate (%.1ffps)\r\n", - (uint32_t)(_jpg_buf_len), - (uint32_t)frame_time, frame_delay, 1000.0 / (uint32_t)(frame_time + frame_delay)); + //ESP_LOGI(TAG, "MJPG: %uB %ums, delay: %ums, framerate (%.1ffps)\r\n", + // (uint32_t)(_jpg_buf_len), + // (uint32_t)frame_time, frame_delay, 1000.0 / (uint32_t)(frame_time + frame_delay)); } last_frame = esp_timer_get_time(); } @@ -335,7 +336,7 @@ static esp_err_t stream_handler(httpd_req_t *req) { streamsServed++; streamCount = 0; if (autoLamp && (lampVal != -1)) setLamp(0); - ESP_LOGI(TAG, "Stream ended"); + Serial.println( "Stream ended"); last_frame = 0; return res; } @@ -443,11 +444,11 @@ static esp_err_t cmd_handler(httpd_req_t *req) { periph_module_disable(PERIPH_I2C1_MODULE); periph_module_reset(PERIPH_I2C0_MODULE); periph_module_reset(PERIPH_I2C1_MODULE); - ESP_LOGI(TAG, "REBOOT requested"); + //ESP_LOGI(TAG, "REBOOT requested"); while (true) { flashLED(50); delay(150); - ESP_LOGI(TAG, '.'); + //ESP_LOGI(TAG, '.'); } } @@ -458,72 +459,72 @@ static esp_err_t cmd_handler(httpd_req_t *req) { ptz_y += Servo_Step; // servo1.write(ptz_y); } - ESP_LOGI(TAG, "PTZ: %i\t%i\t", ptz_x, ptz_y); - ESP_LOGI(TAG, "Up"); + //ESP_LOGI(TAG, "PTZ: %i\t%i\t", ptz_x, ptz_y); + //ESP_LOGI(TAG, "Up"); } else if (!strcmp(value, "left" )) { if (ptz_x <= 180) { ptz_x += Servo_Step; // servo2.write(ptz_x); } - ESP_LOGI(TAG, "PTZ: %i\t%i\t", ptz_x, ptz_y); - ESP_LOGI(TAG, "Left"); + //ESP_LOGI(TAG, "PTZ: %i\t%i\t", ptz_x, ptz_y); + //ESP_LOGI(TAG, "Left"); } else if (!strcmp(value, "right" )) { if (ptz_x >= 0) { ptz_x -= Servo_Step; // servo2.write(ptz_x); } - ESP_LOGI(TAG, "PTZ: %i\t%i\t", ptz_x, ptz_y); - ESP_LOGI(TAG, "Right"); + //ESP_LOGI(TAG, "PTZ: %i\t%i\t", ptz_x, ptz_y); + //ESP_LOGI(TAG, "Right"); } else if (!strcmp(value, "down" )) { if (ptz_y >= 0) { ptz_y -= Servo_Step; // servo1.write(ptz_y); } - ESP_LOGI(TAG, "PTZ: %i\t%i\t" , ptz_x , ptz_y); - ESP_LOGI(TAG, "Down"); + //ESP_LOGI(TAG, "PTZ: %i\t%i\t" , ptz_x , ptz_y); + //ESP_LOGI(TAG, "Down"); } else if (!strcmp(value, "center" )) { ptz_x = 90; ptz_y = 90; // servo1.write(ptz_y); // servo2.write(ptz_x); - ESP_LOGI(TAG, "PTZ: %i\t%i\t", ptz_x, ptz_y); - ESP_LOGI(TAG, "Center"); + //ESP_LOGI(TAG, "PTZ: %i\t%i\t", ptz_x, ptz_y); + //ESP_LOGI(TAG, "Center"); } } else if (!strcmp(variable, "ptz_x")) { if (val >= 0 && val <= 180 ) { ptz_x = val; // servo2.write(ptz_x); - ESP_LOGI(TAG, "PTZ: %i\t", ptz_x); - ESP_LOGI(TAG, "PTZ pos x"); + //ESP_LOGI(TAG, "PTZ: %i\t", ptz_x); + //ESP_LOGI(TAG, "PTZ pos x"); } } else if (!strcmp(variable, "ptz_y")) { if (val >= 0 && val <= 180 ) { ptz_y = val; // servo1.write(ptz_y); - ESP_LOGI(TAG, "PTZ: %i\t", ptz_y); - ESP_LOGI(TAG, "PTZ pos y"); + //ESP_LOGI(TAG, "PTZ: %i\t", ptz_y); + //ESP_LOGI(TAG, "PTZ pos y"); } } else if (!strcmp(variable, "servo_step")) { if (val >= 0 && val <= 90 ) { Servo_Step = val; - ESP_LOGI(TAG, "PTZ: %i\t", Servo_Step ); - ESP_LOGI(TAG, "PTZ Step Size"); + //ESP_LOGI(TAG, "PTZ: %i\t", Servo_Step ); + //ESP_LOGI(TAG, "PTZ Step Size"); } } else if (!strcmp(variable, "servo1_pin")) { if (val >= 0 && val <= 31 ) { Servo1Pin = val; - ESP_LOGI(TAG, "PTZ: %i\t", Servo1Pin ); - ESP_LOGI(TAG, "PTZ Servo1Pin"); + //ESP_LOGI(TAG, "PTZ: %i\t", Servo1Pin ); + //ESP_LOGI(TAG, "PTZ Servo1Pin"); } } else if (!strcmp(variable, "servo2_pin")) { if (val >= 0 && val <= 31 ) { Servo2Pin = val; - ESP_LOGI(TAG, "PTZ: %i\t", Servo2Pin ); - ESP_LOGI(TAG, "PTZ Servo2Pin"); + //ESP_LOGI(TAG, "PTZ: %i\t", Servo2Pin ); + //ESP_LOGI(TAG, "PTZ Servo2Pin"); } } else { @@ -629,10 +630,10 @@ static esp_err_t logo_svg_handler(httpd_req_t *req) { static esp_err_t dump_handler(httpd_req_t *req) { flashLED(75); - print_client_ip(req); ESP_LOGI(TAG, "\r\nDump requested via Web"); + print_client_ip(req); //ESP_LOGI(TAG, "\r\nDump requested via Web"); serialDump(); - ESP_LOGI(TAG, "dump_handler CPU "); - ESP_LOGI(TAG, xPortGetCoreID()); + //ESP_LOGI(TAG, "dump_handler CPU "); + //ESP_LOGI(TAG, xPortGetCoreID()); static char dumpOut[2000] = ""; char * d = dumpOut; @@ -742,7 +743,7 @@ static esp_err_t dump_handler(httpd_req_t *req) { static esp_err_t stop_handler(httpd_req_t *req) { flashLED(75); - print_client_ip(req); ESP_LOGI(TAG, "\r\nStream stop requested via Web"); + print_client_ip(req); //ESP_LOGI(TAG, "\r\nStream stop requested via Web"); streamKill = true; httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); return httpd_resp_send(req, NULL, 0); @@ -757,7 +758,7 @@ static esp_err_t style_handler(httpd_req_t *req) { static esp_err_t streamviewer_handler(httpd_req_t *req) { flashLED(75); - print_client_ip(req); ESP_LOGI(TAG, "Stream viewer requested"); + print_client_ip(req); //ESP_LOGI(TAG, "Stream viewer requested"); httpd_resp_set_type(req, "text/html"); httpd_resp_set_hdr(req, "Content-Encoding", "identity"); return httpd_resp_send(req, (const char *)streamviewer_html, streamviewer_html_len); @@ -765,7 +766,7 @@ static esp_err_t streamviewer_handler(httpd_req_t *req) { static esp_err_t error_handler(httpd_req_t *req) { flashLED(75); - ESP_LOGI(TAG, "Sending error page"); + //ESP_LOGI(TAG, "Sending error page"); std::string s(error_html); size_t index; while ((index = s.find("")) != std::string::npos) @@ -785,13 +786,13 @@ void print_client_ip(httpd_req_t *req) struct sockaddr_in6 addr; // esp_http_server uses IPv6 addressing socklen_t addr_size = sizeof(addr); if (getpeername(sockfd, (struct sockaddr *)&addr, &addr_size) < 0) { - ESP_LOGI(TAG, "Error getting client IP"); + //ESP_LOGI(TAG, "Error getting client IP"); return; } // inet_ntop(AF_INET, &addr.sin6_addr, ipstr, sizeof(ipstr)); inet_ntop(AF_INET, &addr.sin6_addr.un.u32_addr[3], ipstr, sizeof(ipstr)); - ESP_LOGI(TAG, "Client IP => "); - ESP_LOGI(TAG, ipstr); + //ESP_LOGI(TAG, "Client IP => "); + //ESP_LOGI(TAG, ipstr); } static esp_err_t index_handler(httpd_req_t *req) { @@ -832,17 +833,17 @@ static esp_err_t index_handler(httpd_req_t *req) { if (strncmp(view, "simple", sizeof(view)) == 0) { print_client_ip(req) ; - ESP_LOGI(TAG, " Simple index page requested"); - ESP_LOGI(TAG, "CPU "); - ESP_LOGI(TAG, xPortGetCoreID()); + //ESP_LOGI(TAG, " Simple index page requested"); + //ESP_LOGI(TAG, "CPU "); + //ESP_LOGI(TAG, xPortGetCoreID()); if (critERR.length() > 0) return error_handler(req); httpd_resp_set_type(req, "text/html"); httpd_resp_set_hdr(req, "Content-Encoding", "identity"); return httpd_resp_send(req, (const char *)index_simple_html, index_simple_html_len); } else if (strncmp(view, "full", sizeof(view)) == 0) { print_client_ip(req) ; - ESP_LOGI(TAG, " Full index page requested "); - ESP_LOGI(TAG, "CPU "); ESP_LOGI(TAG, xPortGetCoreID()); + //ESP_LOGI(TAG, " Full index page requested "); + //ESP_LOGI(TAG, "CPU "); //ESP_LOGI(TAG, xPortGetCoreID()); if (critERR.length() > 0) return error_handler(req); httpd_resp_set_type(req, "text/html"); httpd_resp_set_hdr(req, "Content-Encoding", "identity"); @@ -852,8 +853,8 @@ static esp_err_t index_handler(httpd_req_t *req) { return httpd_resp_send(req, (const char *)index_ov2640_html, index_ov2640_html_len); } else if (strncmp(view, "portal", sizeof(view)) == 0) { //Prototype captive portal landing page. - print_client_ip(req); ESP_LOGI(TAG, "Portal page requested"); - ESP_LOGI(TAG, "CPU "); ESP_LOGI(TAG, xPortGetCoreID()); + print_client_ip(req); //ESP_LOGI(TAG, "Portal page requested"); + //ESP_LOGI(TAG, "CPU "); //ESP_LOGI(TAG, xPortGetCoreID()); std::string s(portal_html); size_t index; while ((index = s.find("")) != std::string::npos) @@ -866,8 +867,8 @@ static esp_err_t index_handler(httpd_req_t *req) { httpd_resp_set_hdr(req, "Content-Encoding", "identity"); return httpd_resp_send(req, (const char *)s.c_str(), s.length()); } else { - print_client_ip(req); ESP_LOGI(TAG, "Unknown page requested: "); - ESP_LOGI(TAG, view); + print_client_ip(req); //ESP_LOGI(TAG, "Unknown page requested: "); + //ESP_LOGI(TAG, view); httpd_resp_send_404(req); return ESP_FAIL; } @@ -978,7 +979,7 @@ void startCameraServer(int hPort, int sPort) { config.server_port = hPort; config.ctrl_port = hPort; // config.core_id = 1; - ESP_LOGI(TAG, "Starting web server on port: '%d'\r\n", config.server_port); + Serial.printf( "Starting web server on port: '%d'\r\n", config.server_port); if (httpd_start(&camera_httpd, &config) == ESP_OK) { if (critERR.length() > 0) { httpd_register_uri_handler(camera_httpd, &error_uri); @@ -1000,7 +1001,7 @@ void startCameraServer(int hPort, int sPort) { config.server_port = sPort; config.ctrl_port = sPort; config.core_id = 0; - ESP_LOGI(TAG, "Starting stream server on port: '%d'\r\n", config.server_port); + Serial.printf( "Starting stream server on port: '%d'\r\n", config.server_port); if (httpd_start(&stream_httpd, &config) == ESP_OK) { if (critERR.length() > 0) { httpd_register_uri_handler(camera_httpd, &error_uri); diff --git a/esp32-cam-webserver.ino b/esp32-cam-webserver.ino index d0814be..680293d 100644 --- a/esp32-cam-webserver.ino +++ b/esp32-cam-webserver.ino @@ -5,12 +5,13 @@ #include #include #include -#include -#include +//#include +//#include +#include "soc/soc.h" +#include "soc/rtc_cntl_reg.h" #include "src/parsebytes.h" #include "time.h" #include - #include @@ -41,7 +42,7 @@ */ //#define LOG_LOCAL_LEVEL ESP_LOG_ERROR //esp_log_level_set("*", ESP_LOG_ERROR); -static const char* TAG = "main"; +//static const char* TAG = "main"; // Primary config, or defaults. #if __has_include("myconfig.h") struct station { @@ -68,7 +69,9 @@ stationList[] = {{"ESP32-CAM-CONNECT", "InsecurePassword", true}}; TaskHandle_t TaskCore0Handle; TaskHandle_t asyncPos1Handle; TaskHandle_t xHandle; -const TickType_t xDelay = 10; +//const TickType_t xDelay = 10; +const TickType_t xDelay = 10 / portTICK_PERIOD_MS; +const TickType_t xDelayAsync = 1 / portTICK_PERIOD_MS; // Upstream version string #include "src/version.h" @@ -108,7 +111,7 @@ IPAddress gw; // Declare external function from app_httpd.cpp extern void startCameraServer(int hPort, int sPort); -extern void serialDump(); +//extern void serialDump(); // Names for the Camera. (set these in myconfig.h) #if defined(CAM_NAME) @@ -264,49 +267,49 @@ bool debugData; void debugOn() { debugData = true; - ESP_LOGI(TAGLOG, "Camera debug data is enabled (send 'd' for status dump, or any other char to disable debug)"); + //ESP_LOGI(TAGLOG, "Camera debug data is enabled (send 'd' for status dump, or any other char to disable debug)"); } void debugOff() { debugData = false; - ESP_LOGI(TAGLOG, "Camera debug data is disabled (send 'd' for status dump, or any other char to enable debug)"); + //ESP_LOGI(TAGLOG, "Camera debug data is disabled (send 'd' for status dump, or any other char to enable debug)"); } // Serial input (debugging controls) void handleSerial() { - if (Serial.available()) { + /*if (Serial.available()) { char cmd = Serial.read(); if (cmd == 'd' ) { serialDump(); } else if (cmd == 'i' ) { - ESP_LOGI(TAGLOG, "TaskCore0 start CPU "); - ESP_LOGI(TAGLOG, xPortGetCoreID()); + //ESP_LOGI(TAGLOG, "TaskCore0 start CPU "); + //ESP_LOGI(TAGLOG, xPortGetCoreID()); } /* else if (cmd == 'a' ) { - ESP_LOGI(TAGLOG, "incPrio()"); + //ESP_LOGI(TAGLOG, "incPrio()"); xHandle = xTaskGetCurrentTaskHandle(); - ESP_LOGI(TAGLOG, uxTaskPriorityGet( xHandle )); + //ESP_LOGI(TAGLOG, uxTaskPriorityGet( xHandle )); vTaskPrioritySet( xHandle , uxTaskPriorityGet( xHandle) +1); - ESP_LOGI(TAGLOG, uxTaskPriorityGet( xHandle )); + //ESP_LOGI(TAGLOG, uxTaskPriorityGet( xHandle )); } else if (cmd == 'z' ) { - ESP_LOGI(TAGLOG, "decPrio()"); + //ESP_LOGI(TAGLOG, "decPrio()"); xHandle = xTaskGetCurrentTaskHandle(); - ESP_LOGI(TAGLOG, uxTaskPriorityGet( xHandle )); + //ESP_LOGI(TAGLOG, uxTaskPriorityGet( xHandle )); vTaskPrioritySet( xHandle , uxTaskPriorityGet( xHandle) -1); - ESP_LOGI(TAGLOG, uxTaskPriorityGet( xHandle )); + //ESP_LOGI(TAGLOG, uxTaskPriorityGet( xHandle )); } else if (cmd == 'l' ) { - ESP_LOGI(TAGLOG, "listtasks()"); - ESP_LOGI(TAGLOG, "Task Name\tStatus\tPrio\tHWM\tTask\tAffinity\n"); + //ESP_LOGI(TAGLOG, "listtasks()"); + //ESP_LOGI(TAGLOG, "Task Name\tStatus\tPrio\tHWM\tTask\tAffinity\n"); vTaskList(&pcwriteBuffer); - ESP_LOGI(TAGLOG, pcwriteBuffer); - }*/ + //ESP_LOGI(TAGLOG, pcwriteBuffer); + }* / else { if (debugData) debugOff(); else debugOn(); } - } + }*/ while (Serial.available()) Serial.read(); // chomp the buffer } @@ -328,10 +331,10 @@ void setLamp(int newVal) { // Apply a logarithmic function to the scale. int brightness = round((pow(2, (1 + (newVal * 0.02))) - 2) / 6 * pwmMax); ledcWrite(lampChannel, brightness); - ESP_LOGI(TAGLOG, "Lamp: "); - ESP_LOGI(TAGLOG, newVal); - ESP_LOGI(TAGLOG, "%, pwm = "); - ESP_LOGI(TAGLOG, brightness); + //ESP_LOGI(TAGLOG, "Lamp: "); + //ESP_LOGI(TAGLOG, newVal); + //ESP_LOGI(TAGLOG, "%, pwm = "); + //ESP_LOGI(TAGLOG, brightness); } #endif } @@ -339,57 +342,58 @@ void setLamp(int newVal) { void printLocalTime(bool extraData = false) { struct tm timeinfo; if (!getLocalTime(&timeinfo)) { - ESP_LOGI(TAGLOG, "Failed to obtain time"); + //ESP_LOGI(TAGLOG, "Failed to obtain time"); } else { - ESP_LOGI(TAGLOG, &timeinfo, "%H:%M:%S, %A, %B %d %Y"); + //ESP_LOGI(TAGLOG, &timeinfo, "%H:%M:%S, %A, %B %d %Y"); } if (extraData) { - ESP_LOGI(TAGLOG, "NTP Server: %s, GMT Offset: %li(s), DST Offset: %i(s)\r\n", ntpServer, gmtOffset_sec, daylightOffset_sec); + //ESP_LOGI(TAGLOG, "NTP Server: %s, GMT Offset: %li(s), DST Offset: %i(s)\r\n", ntpServer, gmtOffset_sec, daylightOffset_sec); } } void TaskCore0 (void * pvParameters ) { - ESP_LOGI(TAGLOG, "TaskCore0 start CPU "); - ESP_LOGI(TAGLOG, xPortGetCoreID()); + //ESP_LOGI(TAGLOG, "TaskCore0 start CPU "); + //ESP_LOGI(TAGLOG, xPortGetCoreID()); // Start the camera server startCameraServer(httpPort, streamPort); if (critERR.length() == 0) { - ESP_LOGI(TAGLOG, "\r\nCamera Ready!\r\nUse '%s' to connect\r\n", httpURL); - ESP_LOGI(TAGLOG, "Stream viewer available at '%sview'\r\n", streamURL); - ESP_LOGI(TAGLOG, "Raw stream URL is '%s'\r\n", streamURL); + Serial.printf( "\r\nCamera Ready!\r\nUse '%s' to connect\r\n", httpURL); + Serial.printf( "Stream viewer available at '%sview'\r\n", streamURL); + Serial.printf( "Raw stream URL is '%s'\r\n", streamURL); #if defined(DEBUG_DEFAULT_ON) debugOn(); #else debugOff(); #endif } else { - ESP_LOGI(TAGLOG, "\r\nCamera unavailable due to initialisation errors.\r\n\r\n"); + Serial.println( "\r\nCamera unavailable due to initialisation errors.\r\n\r\n"); } // Info line; use for Info messages; eg 'This is a Beta!' warnings, etc. as necesscary - ESP_LOGI(TAGLOG, "\r\nThis is the 4.1 beta\r\n"); + Serial.println( "\r\nThis is the 4.1 beta\r\n"); // do something every 5 seconds. - static unsigned long last_report = millis(); + // static unsigned long last_report = millis(); for (;;) { + vTaskDelay( xDelay * 1); //Log.loop(); - if (millis() - last_report < 7 * 1000) - { - taskYIELD( ); - } - else { - //Log.print (millis()); - //ESP_LOGI(TAGLOG, " CPU "); ESP_LOGI(TAGLOG, xPortGetCoreID()); - last_report = millis(); - //vTaskGetRunTimeStats( char *pcWriteBuffer ); - taskYIELD( ); - } + //if (millis() - last_report < 7 * 1000) + //{ + // taskYIELD( ); + //} + //else { + //Log.print (millis()); + //ESP_LOGI(TAGLOG, " CPU "); ESP_LOGI(TAGLOG, xPortGetCoreID()); + //last_report = millis(); + //vTaskGetRunTimeStats( char *pcWriteBuffer ); + //taskYIELD( ); + //} } } void asyncPos (void * pvParameters ) { - ESP_LOGI(TAGLOG, "asyncPos start CPU "); - ESP_LOGI(TAGLOG, xPortGetCoreID()); + Serial.println( "asyncPos start CPU "); + //Serial.println( xPortGetCoreID()); // Start the camera server // Info line; use for Info messages; eg 'This is a Beta!' warnings, etc. as necesscary - ESP_LOGI(TAGLOG, "\r\nasyncPos thread.\r\n"); + //ESP_LOGI(TAGLOG, "\r\nasyncPos thread.\r\n"); // do something every 5 seconds. bool isYreached = false; bool isXreached = false; @@ -402,7 +406,8 @@ void asyncPos (void * pvParameters ) { //Log.loop(); if (millis() - lastTime < periodtimer) { - taskYIELD( ); + vTaskDelay( xDelay ); + //taskYIELD( ); } else { if (ptz_y_now != ptz_y) { @@ -429,7 +434,7 @@ void asyncPos (void * pvParameters ) { isPrefPosChanged = false; } lastTime = millis(); - taskYIELD( ); + //taskYIELD( ); } } } @@ -444,7 +449,7 @@ void calcURLs() { } sprintf(streamURL, "http://%s:%d/", URL_HOSTNAME, streamPort); #else - ESP_LOGI(TAGLOG, "Setting httpURL"); + //ESP_LOGI(TAGLOG, "Setting httpURL"); if (httpPort != 80) { sprintf(httpURL, "http://%d.%d.%d.%d:%d/", ip[0], ip[1], ip[2], ip[3], httpPort); } else { @@ -455,8 +460,8 @@ void calcURLs() { } void StartCamera() { - ESP_LOGI(TAGLOG, "StartCamera CPU "); - ESP_LOGI(TAGLOG, xPortGetCoreID()); + Serial.println( "StartCamera CPU "); + //ESP_LOGI(TAGLOG, xPortGetCoreID()); // Populate camera config structure with hardware and other defaults config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; @@ -498,10 +503,10 @@ void StartCamera() { // camera init esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { - delay(100); // need a delay here or the next serial o/p gets missed - ESP_LOGI(TAGLOG, "\r\n\r\nCRITICAL FAILURE: Camera sensor failed to initialise.\r\n\r\n"); - ESP_LOGI(TAGLOG, "A full (hard, power off/on) reboot will probably be needed to recover from this.\r\n"); - ESP_LOGI(TAGLOG, "Meanwhile; this unit will reboot in 1 minute since these errors sometime clear automatically\r\n"); + vTaskDelay( xDelay * 10 ); // need a delay here or the next serial o/p gets missed + Serial.println("\r\n\r\nCRITICAL FAILURE: Camera sensor failed to initialise.\r\n\r\n"); + Serial.println("A full (hard, power off/on) reboot will probably be needed to recover from this.\r\n"); + Serial.println("Meanwhile; this unit will reboot in 1 minute since these errors sometime clear automatically\r\n"); // Reset the I2C bus.. may help when rebooting. periph_module_disable(PERIPH_I2C0_MODULE); // try to shut I2C down properly in case that is the problem periph_module_disable(PERIPH_I2C1_MODULE); @@ -514,7 +519,7 @@ void StartCamera() { esp_task_wdt_init(60, true); esp_task_wdt_add(NULL); } else { - ESP_LOGI(TAGLOG, "Camera init succeeded"); + Serial.println( "Camera init succeeded"); // Get a reference to the sensor sensor_t * s = esp_camera_sensor_get(); @@ -522,11 +527,11 @@ void StartCamera() { // Dump camera module, warn for unsupported modules. sensorPID = s->id.PID; switch (sensorPID) { - case OV9650_PID: ESP_LOGI(TAGLOG, "WARNING: OV9650 camera module is not properly supported, will fallback to OV2640 operation"); break; - case OV7725_PID: ESP_LOGI(TAGLOG, "WARNING: OV7725 camera module is not properly supported, will fallback to OV2640 operation"); break; - case OV2640_PID: ESP_LOGI(TAGLOG, "OV2640 camera module detected"); break; - case OV3660_PID: ESP_LOGI(TAGLOG, "OV3660 camera module detected"); break; - default: ESP_LOGI(TAGLOG, "WARNING: Camera module is unknown and not properly supported, will fallback to OV2640 operation"); + case OV9650_PID: Serial.println( "WARNING: OV9650 camera module is not properly supported, will fallback to OV2640 operation"); break; + case OV7725_PID: Serial.println( "WARNING: OV7725 camera module is not properly supported, will fallback to OV2640 operation"); break; + case OV2640_PID: Serial.println( "OV2640 camera module detected"); break; + case OV3660_PID: Serial.println("OV3660 camera module detected"); break; + default: Serial.println( "WARNING: Camera module is unknown and not properly supported, will fallback to OV2640 operation"); } // OV3660 initial sensors are flipped vertically and colors are a bit saturated @@ -596,24 +601,24 @@ void StartCamera() { void WifiSetup() { // Feedback that we are now attempting to connect flashLED(300); - delay(100); + vTaskDelay( xDelay * 10 ); flashLED(300); - ESP_LOGI(TAGLOG, "Starting WiFi"); + Serial.println( "Starting WiFi"); // Disable power saving on WiFi to improve responsiveness // (https://github.com/espressif/arduino-esp32/issues/1484) WiFi.setSleep(false); - ESP_LOGI(TAGLOG, "Known external SSIDs: "); - if (stationCount > firstStation) { + //ESP_LOGI(TAGLOG, "Known external SSIDs: "); + /*if (stationCount > firstStation) { for (int i = firstStation; i < stationCount; i++) ESP_LOGI(TAGLOG, " '%s'", stationList[i].ssid); - } else { + } else { ESP_LOGI(TAGLOG, "None"); - } - //ESP_LOGI(TAGLOG, ); + }*/ + ////ESP_LOGI(TAGLOG, ); byte mac[6] = {0, 0, 0, 0, 0, 0}; WiFi.macAddress(mac); - ESP_LOGI(TAGLOG, "MAC address: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + //ESP_LOGI(TAGLOG, "MAC address: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); int bestStation = -1; long bestRSSI = -1024; @@ -621,21 +626,21 @@ void WifiSetup() { uint8_t bestBSSID[6]; if (stationCount > firstStation) { // We have a list to scan - ESP_LOGI(TAGLOG, "Scanning local Wifi Networks\r\n"); + //ESP_LOGI(TAGLOG, "Scanning local Wifi Networks\r\n"); int stationsFound = WiFi.scanNetworks(); - ESP_LOGI(TAGLOG, "%i networks found\r\n", stationsFound); + //ESP_LOGI(TAGLOG, "%i networks found\r\n", stationsFound); if (stationsFound > 0) { for (int i = 0; i < stationsFound; ++i) { // Print SSID and RSSI for each network found String thisSSID = WiFi.SSID(i); int thisRSSI = WiFi.RSSI(i); String thisBSSID = WiFi.BSSIDstr(i); - ESP_LOGI(TAGLOG, "%3i : [%s] %s (%i)", i + 1, thisBSSID.c_str(), thisSSID.c_str(), thisRSSI); + //ESP_LOGI(TAGLOG, "%3i : [%s] %s (%i)", i + 1, thisBSSID.c_str(), thisSSID.c_str(), thisRSSI); // Scan our list of known external stations for (int sta = firstStation; sta < stationCount; sta++) { if ((strcmp(stationList[sta].ssid, thisSSID.c_str()) == 0) || (strcmp(stationList[sta].ssid, thisBSSID.c_str()) == 0)) { - ESP_LOGI(TAGLOG, " - Known!"); + //ESP_LOGI(TAGLOG, " - Known!"); // Chose the strongest RSSI seen if (thisRSSI > bestRSSI) { bestStation = sta; @@ -657,22 +662,22 @@ void WifiSetup() { if (bestStation == -1) { if (!accesspoint) { #if defined(WIFI_AP_ENABLE) - ESP_LOGI(TAGLOG, "No known networks found, entering AccessPoint fallback mode"); + //ESP_LOGI(TAGLOG, "No known networks found, entering AccessPoint fallback mode"); accesspoint = true; #else - ESP_LOGI(TAGLOG, "No known networks found"); + //ESP_LOGI(TAGLOG, "No known networks found"); #endif } else { - ESP_LOGI(TAGLOG, "AccessPoint mode selected in config"); + //ESP_LOGI(TAGLOG, "AccessPoint mode selected in config"); } } else { - ESP_LOGI(TAGLOG, "Connecting to Wifi Network %d: [%02X:%02X:%02X:%02X:%02X:%02X] %s \r\n", - bestStation, bestBSSID[0], bestBSSID[1], bestBSSID[2], bestBSSID[3], - bestBSSID[4], bestBSSID[5], bestSSID); + //ESP_LOGI(TAGLOG, "Connecting to Wifi Network %d: [%02X:%02X:%02X:%02X:%02X:%02X] %s \r\n", + // bestStation, bestBSSID[0], bestBSSID[1], bestBSSID[2], bestBSSID[3], + // bestBSSID[4], bestBSSID[5], bestSSID); // Apply static settings if necesscary if (stationList[bestStation].dhcp == false) { #if defined(ST_IP) - ESP_LOGI(TAGLOG, "Applying static IP settings"); + //ESP_LOGI(TAGLOG, "Applying static IP settings"); #if !defined (ST_GATEWAY) || !defined (ST_NETMASK) #error "You must supply both Gateway and NetMask when specifying a static IP address" #endif @@ -691,7 +696,7 @@ void WifiSetup() { #endif #endif #else - ESP_LOGI(TAGLOG, "Static IP settings requested but not defined in config, falling back to dhcp"); + //ESP_LOGI(TAGLOG, "Static IP settings requested but not defined in config, falling back to dhcp"); #endif } @@ -703,30 +708,30 @@ void WifiSetup() { // Wait to connect, or timeout unsigned long start = millis(); while ((millis() - start <= WIFI_WATCHDOG) && (WiFi.status() != WL_CONNECTED)) { - delay(500); - ESP_LOGI(TAGLOG, '.'); + vTaskDelay( xDelay * 50 ); + //ESP_LOGI(TAGLOG, '.'); } //ESP_LOGI(TAGLOG, ); //Log.begin(); // If we have connected, inform user if (WiFi.status() == WL_CONNECTED) { - ESP_LOGI(TAGLOG, "Client connection succeeded"); + //ESP_LOGI(TAGLOG, "Client connection succeeded"); accesspoint = false; // Note IP details ip = WiFi.localIP(); net = WiFi.subnetMask(); gw = WiFi.gatewayIP(); - ESP_LOGI(TAGLOG, "IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); - ESP_LOGI(TAGLOG, "Netmask : %d.%d.%d.%d\r\n", net[0], net[1], net[2], net[3]); - ESP_LOGI(TAGLOG, "Gateway : %d.%d.%d.%d\r\n", gw[0], gw[1], gw[2], gw[3]); + //ESP_LOGI(TAGLOG, "IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); + //ESP_LOGI(TAGLOG, "Netmask : %d.%d.%d.%d\r\n", net[0], net[1], net[2], net[3]); + //ESP_LOGI(TAGLOG, "Gateway : %d.%d.%d.%d\r\n", gw[0], gw[1], gw[2], gw[3]); calcURLs(); // Flash the LED to show we are connected for (int i = 0; i < 5; i++) { flashLED(50); - delay(150); + vTaskDelay( xDelay * 2 ); } } else { - ESP_LOGI(TAGLOG, "Client connection Failed"); + //ESP_LOGI(TAGLOG, "Client connection Failed"); WiFi.disconnect(); // (resets the WiFi scan) } } @@ -734,26 +739,26 @@ void WifiSetup() { if (accesspoint && (WiFi.status() != WL_CONNECTED)) { // The accesspoint has been enabled, and we have not connected to any existing networks #if defined(AP_CHAN) - ESP_LOGI(TAGLOG, "Setting up Fixed Channel AccessPoint"); - ESP_LOGI(TAGLOG, " SSID : "); - ESP_LOGI(TAGLOG, stationList[0].ssid); - ESP_LOGI(TAGLOG, " Password : "); - ESP_LOGI(TAGLOG, stationList[0].password); - ESP_LOGI(TAGLOG, " Channel : "); - ESP_LOGI(TAGLOG, AP_CHAN); + //ESP_LOGI(TAGLOG, "Setting up Fixed Channel AccessPoint"); + //ESP_LOGI(TAGLOG, " SSID : "); + //ESP_LOGI(TAGLOG, stationList[0].ssid); + //ESP_LOGI(TAGLOG, " Password : "); + //ESP_LOGI(TAGLOG, stationList[0].password); + //ESP_LOGI(TAGLOG, " Channel : "); + //ESP_LOGI(TAGLOG, AP_CHAN); WiFi.softAP(stationList[0].ssid, stationList[0].password, AP_CHAN); # else - ESP_LOGI(TAGLOG, "Setting up AccessPoint"); - ESP_LOGI(TAGLOG, " SSID : "); - ESP_LOGI(TAGLOG, stationList[0].ssid); - ESP_LOGI(TAGLOG, " Password : "); - ESP_LOGI(TAGLOG, stationList[0].password); + //ESP_LOGI(TAGLOG, "Setting up AccessPoint"); + //ESP_LOGI(TAGLOG, " SSID : "); + //ESP_LOGI(TAGLOG, stationList[0].ssid); + //ESP_LOGI(TAGLOG, " Password : "); + //ESP_LOGI(TAGLOG, stationList[0].password); WiFi.softAP(stationList[0].ssid, stationList[0].password); #endif #if defined(AP_ADDRESS) // User has specified the AP details; apply them after a short delay // (https://github.com/espressif/arduino-esp32/issues/985#issuecomment-359157428) - delay(100); + vTaskDelay( xDelay * 10 ); IPAddress local_IP(AP_ADDRESS); IPAddress gateway(AP_ADDRESS); IPAddress subnet(255, 255, 255, 0); @@ -764,16 +769,16 @@ void WifiSetup() { net = WiFi.subnetMask(); gw = WiFi.gatewayIP(); strcpy(apName, stationList[0].ssid); - ESP_LOGI(TAGLOG, "IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); + //ESP_LOGI(TAGLOG, "IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); calcURLs(); // Flash the LED to show we are connected for (int i = 0; i < 5; i++) { flashLED(150); - delay(50); + vTaskDelay( xDelay * 50 ); } // Start the DNS captive portal if requested if (stationList[0].dhcp == true) { - ESP_LOGI(TAGLOG, "Starting Captive Portal"); + //ESP_LOGI(TAGLOG, "Starting Captive Portal"); dnsServer.start(DNS_PORT, "*", ip); captivePortal = true; } @@ -783,12 +788,13 @@ void WifiSetup() { void setup() { Serial.begin(115200); Serial.setDebugOutput(true); + WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable detector //Log.addPrintStream(std::make_shared(webSerialStream)); if (stationCount == 0) { - ESP_LOGI(TAGLOG, "\r\nFatal Error; Halting"); + //ESP_LOGI(TAGLOG, "\r\nFatal Error; Halting"); while (true) { - ESP_LOGI(TAGLOG, "No wifi details have been configured; we cannot connect to existing WiFi or start our own AccessPoint, there is no point in proceeding."); - delay(5000); + //ESP_LOGI(TAGLOG, "No wifi details have been configured; we cannot connect to existing WiFi or start our own AccessPoint, there is no point in proceeding."); + vTaskDelay( xDelay * 500 ); } } // Start Wifi and loop until we are connected or have started an AccessPoint @@ -796,23 +802,23 @@ void setup() { WifiSetup(); } //Log.begin(); - ESP_LOGI(TAGLOG, "setup: Log.begin(), CPU "); - ESP_LOGI(TAGLOG, xPortGetCoreID()); + //ESP_LOGI(TAGLOG, "setup: Log.begin(), CPU "); + //ESP_LOGI(TAGLOG, xPortGetCoreID()); //ESP_LOGI(TAGLOG, ); - ESP_LOGI(TAGLOG, "===="); - ESP_LOGI(TAGLOG, "esp32-cam-webserver: "); - ESP_LOGI(TAGLOG, myName); - ESP_LOGI(TAGLOG, "Code Built: "); - ESP_LOGI(TAGLOG, myVer); - ESP_LOGI(TAGLOG, "Base Release: "); - ESP_LOGI(TAGLOG, baseVersion); + Serial.println( "===="); + Serial.printf( "esp32-cam-webserver: "); + Serial.println( myName); + Serial.printf( "Code Built: "); + Serial.println( myVer); + Serial.printf( "Base Release: "); + Serial.println( baseVersion); //ESP_LOGI(TAGLOG, ); // Warn if no PSRAM is detected (typically user error with board selection in the IDE) if (!psramFound()) { - ESP_LOGI(TAGLOG, "\r\nFatal Error; Halting"); + //ESP_LOGI(TAGLOG, "\r\nFatal Error; Halting"); while (true) { - ESP_LOGI(TAGLOG, "No PSRAM found; camera cannot be initialised: Please check the board config for your module."); - delay(5000); + //ESP_LOGI(TAGLOG, "No PSRAM found; camera cannot be initialised: Please check the board config for your module."); + vTaskDelay( xDelay * 500 ); } } @@ -824,7 +830,7 @@ void setup() { // Start the SPIFFS filesystem before we initialise the camera if (filesystem) { filesystemStart(); - delay(200); // a short delay to let spi bus settle after SPIFFS init + vTaskDelay( xDelay * 20 ); // a short delay to let spi bus settle after SPIFFS init } // Start (init) the camera @@ -832,11 +838,12 @@ void setup() { // Now load and apply any saved preferences if (filesystem) { - delay(200); // a short delay to let spi bus settle after camera init + vTaskDelay( xDelay * 15 ); // a short delay to let spi bus settle after camera init loadPrefs(SPIFFS); + vTaskDelay( xDelay * 20 ); // a short delay to let spi bus settle after camera init loadposPrefs(SPIFFS); } else { - ESP_LOGI(TAGLOG, "No Internal Filesystem, cannot load or save preferences"); + //ESP_LOGI(TAGLOG, "No Internal Filesystem, cannot load or save preferences"); } /* @@ -849,7 +856,7 @@ void setup() { // Set up OTA if (otaEnabled) { // Start OTA once connected - ESP_LOGI(TAGLOG, "Setting up OTA"); + //ESP_LOGI(TAGLOG, "Setting up OTA"); // Port defaults to 3232 // ArduinoOTA.setPort(3232); // Hostname defaults to esp3232-[MAC] @@ -857,9 +864,9 @@ void setup() { // No authentication by default if (strlen(otaPassword) != 0) { ArduinoOTA.setPassword(otaPassword); - ESP_LOGI(TAGLOG, "OTA Password: %s\n\r", otaPassword); + //ESP_LOGI(TAGLOG, "OTA Password: %s\n\r", otaPassword); } else { - ESP_LOGI(TAGLOG, "\r\nNo OTA password has been set! (insecure)\r\n\r\n"); + //ESP_LOGI(TAGLOG, "\r\nNo OTA password has been set! (insecure)\r\n\r\n"); } ArduinoOTA .onStart([]() { @@ -869,54 +876,54 @@ void setup() { else // U_SPIFFS // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end() type = "filesystem"; - ESP_LOGI(TAGLOG, "Start updating " + type); - ESP_LOGI(TAGLOG, "setup ArduinoOTA.onStart CPU "); - ESP_LOGI(TAGLOG, xPortGetCoreID()); + //ESP_LOGI(TAGLOG, "Start updating " + type); + //ESP_LOGI(TAGLOG, "setup ArduinoOTA.onStart CPU "); + //ESP_LOGI(TAGLOG, xPortGetCoreID()); // Stop the camera since OTA will crash the module if it is running. // the unit will need rebooting to restart it, either by OTA on success, or manually by the user - ESP_LOGI(TAGLOG, "Stopping Camera"); + //ESP_LOGI(TAGLOG, "Stopping Camera"); esp_err_t err = esp_camera_deinit(); critERR = "

OTA Has been started


Camera has Halted!

"; critERR += "

Wait for OTA to finish and reboot, or reboot manually to recover

"; }) .onEnd([]() { - ESP_LOGI(TAGLOG, "\r\nEnd"); + //ESP_LOGI(TAGLOG, "\r\nEnd"); }) .onProgress([](unsigned int progress, unsigned int total) { - ESP_LOGI(TAGLOG, "Progress: %u%%\r", (progress / (total / 100))); + //ESP_LOGI(TAGLOG, "Progress: %u%%\r", (progress / (total / 100))); }) .onError([](ota_error_t error) { - ESP_LOGI(TAGLOG, "Error[%u]: ", error); - if (error == OTA_AUTH_ERROR) ESP_LOGI(TAGLOG, "Auth Failed"); - else if (error == OTA_BEGIN_ERROR) ESP_LOGI(TAGLOG, "Begin Failed"); - else if (error == OTA_CONNECT_ERROR) ESP_LOGI(TAGLOG, "Connect Failed"); - else if (error == OTA_RECEIVE_ERROR) ESP_LOGI(TAGLOG, "Receive Failed"); - else if (error == OTA_END_ERROR) ESP_LOGI(TAGLOG, "End Failed"); + //ESP_LOGI(TAGLOG, "Error[%u]: ", error); + if (error == OTA_AUTH_ERROR); //ESP_LOGI(TAGLOG, "Auth Failed"); + else if (error == OTA_BEGIN_ERROR) ;//ESP_LOGI(TAGLOG, "Begin Failed"); + else if (error == OTA_CONNECT_ERROR); //ESP_LOGI(TAGLOG, "Connect Failed"); + else if (error == OTA_RECEIVE_ERROR); //ESP_LOGI(TAGLOG, "Receive Failed"); + else if (error == OTA_END_ERROR) ;//ESP_LOGI(TAGLOG, "End Failed"); }); ArduinoOTA.begin(); } else { - ESP_LOGI(TAGLOG, "OTA is disabled"); + //ESP_LOGI(TAGLOG, "OTA is disabled"); if (!MDNS.begin(mdnsName)) { - ESP_LOGI(TAGLOG, "Error setting up MDNS responder!"); + //ESP_LOGI(TAGLOG, "Error setting up MDNS responder!"); } - ESP_LOGI(TAGLOG, "mDNS responder started"); + //ESP_LOGI(TAGLOG, "mDNS responder started"); } //MDNS Config -- note that if OTA is NOT enabled this needs prior steps! MDNS.addService("http", "tcp", 80); - ESP_LOGI(TAGLOG, "Added HTTP service to MDNS server"); + //ESP_LOGI(TAGLOG, "Added HTTP service to MDNS server"); - MDNS.addService("webserial", "tcp", 8514); - ESP_LOGI(TAGLOG, "Added webserial service to MDNS server"); + //MDNS.addService("webserial", "tcp", 8514); + //ESP_LOGI(TAGLOG, "Added webserial service to MDNS server"); // Set time via NTP server when enabled if (haveTime) { - ESP_LOGI(TAGLOG, "Time: "); + //ESP_LOGI(TAGLOG, "Time: "); configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); printLocalTime(true); } else { - ESP_LOGI(TAGLOG, "Time functions disabled"); + //ESP_LOGI(TAGLOG, "Time functions disabled"); } // Gather static values used when dumping status; these are slow functions, so just do them once during startup @@ -933,15 +940,15 @@ void setup() { else setLamp(lampVal); #endif } else { - ESP_LOGI(TAGLOG, "No lamp, or lamp disabled in config"); + //ESP_LOGI(TAGLOG, "No lamp, or lamp disabled in config"); } // As a final init step chomp out the serial buffer in case we have recieved mis-keys or garbage during startup while (Serial.available()) Serial.read(); - xTaskCreatePinnedToCore(TaskCore0, "TaskCore0", 1000, NULL, tskIDLE_PRIORITY + 1, &TaskCore0Handle, 0); + xTaskCreatePinnedToCore(TaskCore0, "TaskCore0", ESP_TASK_MAIN_STACK, NULL, ESP_TASK_MAIN_PRIO, &TaskCore0Handle, 0); int pvPeriodtimer = 10; - xTaskCreatePinnedToCore(asyncPos, "asyncPos", 1000, ( void* ) pvPeriodtimer, tskIDLE_PRIORITY, &asyncPos1Handle, 1); + xTaskCreatePinnedToCore(asyncPos, "asyncPos", ESP_TASK_MAIN_STACK, ( void* ) pvPeriodtimer, ESP_TASK_MAIN_PRIO, &asyncPos1Handle, 1); } @@ -957,7 +964,7 @@ void loop() { unsigned long start = millis(); while (millis() - start < WIFI_WATCHDOG ) { //delay(100); - vTaskDelay( xDelay ); + vTaskDelay( xDelay * 10 ); if (otaEnabled) ArduinoOTA.handle(); handleSerial(); if (captivePortal) dnsServer.processNextRequest(); @@ -969,24 +976,24 @@ void loop() { // We are connected, wait a bit and re-check if (warned) { // Tell the user if we have just reconnected - ESP_LOGI(TAGLOG, "WiFi reconnected"); + //ESP_LOGI(TAGLOG, "WiFi reconnected"); warned = false; } // loop here for WIFI_WATCHDOG, turning debugData true/false depending on serial input.. unsigned long start = millis(); while (millis() - start < WIFI_WATCHDOG ) { - delay(100); + vTaskDelay( xDelay * 10 ); if (otaEnabled) ArduinoOTA.handle(); handleSerial(); } } else { // disconnected; attempt to reconnect if (!warned) { - ESP_LOGI(TAGLOG, "loop CPU "); - ESP_LOGI(TAGLOG, xPortGetCoreID()); + //ESP_LOGI(TAGLOG, "loop CPU "); + //ESP_LOGI(TAGLOG, xPortGetCoreID()); // Tell the user if we just disconnected WiFi.disconnect(); // ensures disconnect is complete, wifi scan cleared - ESP_LOGI(TAGLOG, "WiFi disconnected, retrying"); + //ESP_LOGI(TAGLOG, "WiFi disconnected, retrying"); warned = true; } WifiSetup(); diff --git a/partitions.csv b/partitions.csv new file mode 100644 index 0000000..fe903d6 --- /dev/null +++ b/partitions.csv @@ -0,0 +1,6 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +otadata, data, ota, 0xe000, 0x2000, +app0, app, ota_0, 0x10000, 0x1E0000, +app1, app, ota_1, 0x1F0000,0x1E0000, +spiffs, data, spiffs, 0x3F0000,0x10000, \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index c44e52e..daeed2a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -43,7 +43,7 @@ build_flags = -DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue ; For OTA uploading uncomment the next lines and add the IP address or mDNS name of the camera module, and the OTA password -upload_protocol = espota -upload_port = 192.168.1.157 +;upload_protocol = espota +;upload_port = 192.168.1.157 ;upload_flags = ; --auth= diff --git a/storage.cpp b/storage.cpp index 04ae3a0..ad86f97 100644 --- a/storage.cpp +++ b/storage.cpp @@ -21,29 +21,29 @@ extern int ptz_y_now; extern int ptz_x_now; /* - * Useful utility when debugging... - */ + Useful utility when debugging... +*/ -void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ +void listDir(fs::FS &fs, const char * dirname, uint8_t levels) { Serial.printf("Listing SPIFFS directory: %s\r\n", dirname); File root = fs.open(dirname); - if(!root){ + if (!root) { Serial.println("- failed to open directory"); return; } - if(!root.isDirectory()){ + if (!root.isDirectory()) { Serial.println(" - not a directory"); return; } File file = root.openNextFile(); - while(file){ - if(file.isDirectory()){ + while (file) { + if (file.isDirectory()) { Serial.print(" DIR : "); Serial.println(file.name()); - if(levels){ - listDir(fs, file.name(), levels -1); + if (levels) { + listDir(fs, file.name(), levels - 1); } } else { Serial.print(" FILE: "); @@ -55,14 +55,14 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ } } -void dumpPrefs(fs::FS &fs){ +void dumpPrefs(fs::FS &fs) { if (fs.exists(PREFERENCES_FILE)) { // Dump contents for debug File file = fs.open(PREFERENCES_FILE, FILE_READ); int countSize = 0; while (file.available() && countSize <= PREFERENCES_MAX_SIZE) { - Serial.print(char(file.read())); - countSize++; + Serial.print(char(file.read())); + countSize++; } Serial.println(""); file.close(); @@ -71,7 +71,7 @@ void dumpPrefs(fs::FS &fs){ } } -void loadPrefs(fs::FS &fs){ +void loadPrefs(fs::FS &fs) { if (fs.exists(PREFERENCES_FILE)) { // read file into a string String prefs; @@ -89,28 +89,28 @@ void loadPrefs(fs::FS &fs){ return; } while (file.available()) { - prefs += char(file.read()); - if (prefs.length() > size) { - // corrupted SPIFFS files can return data beyond their declared size. - Serial.println("Preferences file failed to load properly, appears to be corrupt, removing"); - removePrefs(SPIFFS); - return; - } + prefs += char(file.read()); + if (prefs.length() > size) { + // corrupted SPIFFS files can return data beyond their declared size. + Serial.println("Preferences file failed to load properly, appears to be corrupt, removing"); + removePrefs(SPIFFS); + return; + } } Servo1Pin = jsonExtract(prefs, "servo1_pin").toInt(); - Servo2Pin = jsonExtract(prefs, "servo2_pin").toInt(); + Servo2Pin = jsonExtract(prefs, "servo2_pin").toInt(); ptz_x = jsonExtract(prefs, "ptz_x").toInt(); ptz_y = jsonExtract(prefs, "ptz_y").toInt(); - Servo_Step= jsonExtract(prefs, "servo_step").toInt(); + Servo_Step = jsonExtract(prefs, "servo_step").toInt(); // get sensor reference sensor_t * s = esp_camera_sensor_get(); // process local settings if (lampVal >= 0) { - int lampValPref = jsonExtract(prefs, "lamp").toInt(); - if (lampValPref >= 0) lampVal = lampValPref; + int lampValPref = jsonExtract(prefs, "lamp").toInt(); + if (lampValPref >= 0) lampVal = lampValPref; } minFrameTime = jsonExtract(prefs, "min_frame_time").toInt(); if (jsonExtract(prefs, "autolamp").toInt() == 0) autoLamp = false; else autoLamp = true; @@ -152,7 +152,7 @@ void loadPrefs(fs::FS &fs){ } } -void loadposPrefs(fs::FS &fs){ +void loadposPrefs(fs::FS &fs) { if (fs.exists(PREFERENCES_POS_FILE)) { // read file into a string String prefs; @@ -170,31 +170,31 @@ void loadposPrefs(fs::FS &fs){ return; } while (file.available()) { - prefs += char(file.read()); - if (prefs.length() > size) { - // corrupted SPIFFS files can return data beyond their declared size. - Serial.println("Preferences pos file failed to load properly, appears to be corrupt, removing"); - removeposPrefs(SPIFFS); - return; - } + prefs += char(file.read()); + if (prefs.length() > size) { + // corrupted SPIFFS files can return data beyond their declared size. + Serial.println("Preferences pos file failed to load properly, appears to be corrupt, removing"); + removeposPrefs(SPIFFS); + return; + } } ptz_x_now = jsonExtract(prefs, "ptz_x_now").toInt(); ptz_y_now = jsonExtract(prefs, "ptz_y_now").toInt(); // close the file file.close(); -// dumpPrefs(SPIFFS); + // dumpPrefs(SPIFFS); } else { - ptz_y_now = ptz_y; - ptz_x_now = ptz_x; - servo1.write(ptz_y); - servo2.write(ptz_x); - saveposPrefs(SPIFFS); + //ptz_y_now = ptz_y; + //ptz_x_now = ptz_x; + //servo1.write(ptz_y); + //servo2.write(ptz_x); + //saveposPrefs(SPIFFS); Serial.printf("Preference pos file %s not found; using system defaults.\r\n", PREFERENCES_POS_FILE); } } -void savePrefs(fs::FS &fs){ +void savePrefs(fs::FS &fs) { if (fs.exists(PREFERENCES_FILE)) { Serial.printf("Updating %s\r\n", PREFERENCES_FILE); } else { @@ -205,40 +205,40 @@ void savePrefs(fs::FS &fs){ sensor_t * s = esp_camera_sensor_get(); char * p = json_response; *p++ = '{'; - p+=sprintf(p, "\"lamp\":%i,", lampVal); - p+=sprintf(p, "\"autolamp\":%u,", autoLamp); - p+=sprintf(p, "\"framesize\":%u,", s->status.framesize); - p+=sprintf(p, "\"quality\":%u,", s->status.quality); - p+=sprintf(p, "\"xclk\":%u,", xclk); - p+=sprintf(p, "\"min_frame_time\":%d,", minFrameTime); - p+=sprintf(p, "\"brightness\":%d,", s->status.brightness); - p+=sprintf(p, "\"contrast\":%d,", s->status.contrast); - p+=sprintf(p, "\"saturation\":%d,", s->status.saturation); - p+=sprintf(p, "\"special_effect\":%u,", s->status.special_effect); - p+=sprintf(p, "\"wb_mode\":%u,", s->status.wb_mode); - p+=sprintf(p, "\"awb\":%u,", s->status.awb); - p+=sprintf(p, "\"awb_gain\":%u,", s->status.awb_gain); - p+=sprintf(p, "\"aec\":%u,", s->status.aec); - p+=sprintf(p, "\"aec2\":%u,", s->status.aec2); - p+=sprintf(p, "\"ae_level\":%d,", s->status.ae_level); - p+=sprintf(p, "\"aec_value\":%u,", s->status.aec_value); - p+=sprintf(p, "\"agc\":%u,", s->status.agc); - p+=sprintf(p, "\"agc_gain\":%u,", s->status.agc_gain); - p+=sprintf(p, "\"gainceiling\":%u,", s->status.gainceiling); - p+=sprintf(p, "\"bpc\":%u,", s->status.bpc); - p+=sprintf(p, "\"wpc\":%u,", s->status.wpc); - p+=sprintf(p, "\"raw_gma\":%u,", s->status.raw_gma); - p+=sprintf(p, "\"lenc\":%u,", s->status.lenc); - p+=sprintf(p, "\"vflip\":%u,", s->status.vflip); - p+=sprintf(p, "\"hmirror\":%u,", s->status.hmirror); - p+=sprintf(p, "\"dcw\":%u,", s->status.dcw); - p+=sprintf(p, "\"colorbar\":%u,", s->status.colorbar); - p+=sprintf(p, "\"rotate\":\"%d\",", myRotation); - p+=sprintf(p, "\"servo1_pin\":%u,", Servo1Pin ); - p+=sprintf(p, "\"servo2_pin\":%u,", Servo2Pin ); - p+=sprintf(p, "\"servo_step\":%u,", Servo_Step ); - p+=sprintf(p, "\"ptz_y\":%u,", ptz_y ); - p+=sprintf(p, "\"ptz_x\":%u", ptz_x ); + p += sprintf(p, "\"lamp\":%i,", lampVal); + p += sprintf(p, "\"autolamp\":%u,", autoLamp); + p += sprintf(p, "\"framesize\":%u,", s->status.framesize); + p += sprintf(p, "\"quality\":%u,", s->status.quality); + p += sprintf(p, "\"xclk\":%u,", xclk); + p += sprintf(p, "\"min_frame_time\":%d,", minFrameTime); + p += sprintf(p, "\"brightness\":%d,", s->status.brightness); + p += sprintf(p, "\"contrast\":%d,", s->status.contrast); + p += sprintf(p, "\"saturation\":%d,", s->status.saturation); + p += sprintf(p, "\"special_effect\":%u,", s->status.special_effect); + p += sprintf(p, "\"wb_mode\":%u,", s->status.wb_mode); + p += sprintf(p, "\"awb\":%u,", s->status.awb); + p += sprintf(p, "\"awb_gain\":%u,", s->status.awb_gain); + p += sprintf(p, "\"aec\":%u,", s->status.aec); + p += sprintf(p, "\"aec2\":%u,", s->status.aec2); + p += sprintf(p, "\"ae_level\":%d,", s->status.ae_level); + p += sprintf(p, "\"aec_value\":%u,", s->status.aec_value); + p += sprintf(p, "\"agc\":%u,", s->status.agc); + p += sprintf(p, "\"agc_gain\":%u,", s->status.agc_gain); + p += sprintf(p, "\"gainceiling\":%u,", s->status.gainceiling); + p += sprintf(p, "\"bpc\":%u,", s->status.bpc); + p += sprintf(p, "\"wpc\":%u,", s->status.wpc); + p += sprintf(p, "\"raw_gma\":%u,", s->status.raw_gma); + p += sprintf(p, "\"lenc\":%u,", s->status.lenc); + p += sprintf(p, "\"vflip\":%u,", s->status.vflip); + p += sprintf(p, "\"hmirror\":%u,", s->status.hmirror); + p += sprintf(p, "\"dcw\":%u,", s->status.dcw); + p += sprintf(p, "\"colorbar\":%u,", s->status.colorbar); + p += sprintf(p, "\"rotate\":\"%d\",", myRotation); + p += sprintf(p, "\"servo1_pin\":%u,", Servo1Pin ); + p += sprintf(p, "\"servo2_pin\":%u,", Servo2Pin ); + p += sprintf(p, "\"servo_step\":%u,", Servo_Step ); + p += sprintf(p, "\"ptz_y\":%u,", ptz_y ); + p += sprintf(p, "\"ptz_x\":%u", ptz_x ); *p++ = '}'; *p++ = 0; @@ -247,7 +247,7 @@ void savePrefs(fs::FS &fs){ dumpPrefs(SPIFFS); } -void saveposPrefs(fs::FS &fs){ +void saveposPrefs(fs::FS &fs) { if (fs.exists(PREFERENCES_POS_FILE)) { Serial.printf("Updating %s\r\n", PREFERENCES_POS_FILE); } else { @@ -257,13 +257,13 @@ void saveposPrefs(fs::FS &fs){ static char json_response[64]; char * p = json_response; *p++ = '{'; - p+=sprintf(p, "\"ptz_y_now\":%u,", ptz_y_now); - p+=sprintf(p, "\"ptz_x_now\":%u",ptz_x_now); + p += sprintf(p, "\"ptz_y_now\":%u,", ptz_y_now); + p += sprintf(p, "\"ptz_x_now\":%u", ptz_x_now); *p++ = '}'; *p++ = 0; file.print(json_response); file.close(); -// dumpPrefs(SPIFFS); + // dumpPrefs(SPIFFS); } void removeposPrefs(fs::FS &fs) { @@ -288,14 +288,14 @@ void removePrefs(fs::FS &fs) { } } -void filesystemStart(){ +void filesystemStart() { Serial.println("Starting internal SPIFFS filesystem"); while ( !SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED) ) { // if we sit in this loop something is wrong; // if no existing spiffs partition exists one should be automagically created. Serial.println("SPIFFS Mount failed, this can happen on first-run initialisation"); Serial.println("If it happens repeatedly check if a SPIFFS partition is present for your board?"); - for (int i=0; i<10; i++) { + for (int i = 0; i < 10; i++) { flashLED(100); // Show SPIFFS failure delay(100); } diff --git a/storage.h b/storage.h index ac38a39..2414db1 100644 --- a/storage.h +++ b/storage.h @@ -12,7 +12,7 @@ extern void loadPrefs(fs::FS &fs); extern void removePrefs(fs::FS &fs); extern void savePrefs(fs::FS &fs); extern void loadposPrefs(fs::FS &fs); -extern void saveposPrefs(fs::FS &fs); extern void removeposPrefs(fs::FS &fs); +extern void saveposPrefs(fs::FS &fs); extern void filesystemStart(); From a09b467fe4d90fbb3254d445cd905dad31bc93ec Mon Sep 17 00:00:00 2001 From: Zalgo <80800403+ZalgoSoft@users.noreply.github.com> Date: Mon, 20 Jun 2022 14:41:44 +0800 Subject: [PATCH 11/12] extracted driver --- .../DIFxData.ini | 5 + .../DeleteUSB.exe | Bin 0 -> 143360 bytes .../FontData.ini | 3 + .../ISBEW64.exe | Bin 0 -> 120768 bytes .../License.txt | 32 + .../SetupEx.dll | Bin 0 -> 73728 bytes .../StringTable-0009-English.ips | 48 + .../Uninstall.ICO | Bin 0 -> 766 bytes .../Uninstall.exe | Bin 0 -> 143360 bytes .../_ISUser.dll | Bin 0 -> 16384 bytes .../_IsRes.dll | Bin 0 -> 126912 bytes .../corecomp.ini | 2733 +++++++++++++++++ .../default.pal | Bin 0 -> 1168 bytes .../dotnetinstaller.exe | Bin 0 -> 10704 bytes .../isrt.dll | Bin 0 -> 222144 bytes .../ser2pl.cat | Bin 0 -> 8101 bytes .../ser2pl.inf | 115 + .../ser2pl.sys | Bin 0 -> 126976 bytes .../ser2pl64.sys | Bin 0 -> 152064 bytes .../{info}.txt | Bin 0 -> 13430 bytes 20 files changed, 2936 insertions(+) create mode 100644 PL2303-Prolific-DriverInstaller-v1.5.0/DIFxData.ini create mode 100644 PL2303-Prolific-DriverInstaller-v1.5.0/DeleteUSB.exe create mode 100644 PL2303-Prolific-DriverInstaller-v1.5.0/FontData.ini create mode 100644 PL2303-Prolific-DriverInstaller-v1.5.0/ISBEW64.exe create mode 100644 PL2303-Prolific-DriverInstaller-v1.5.0/License.txt create mode 100644 PL2303-Prolific-DriverInstaller-v1.5.0/SetupEx.dll create mode 100644 PL2303-Prolific-DriverInstaller-v1.5.0/StringTable-0009-English.ips create mode 100644 PL2303-Prolific-DriverInstaller-v1.5.0/Uninstall.ICO create mode 100644 PL2303-Prolific-DriverInstaller-v1.5.0/Uninstall.exe create mode 100644 PL2303-Prolific-DriverInstaller-v1.5.0/_ISUser.dll create mode 100644 PL2303-Prolific-DriverInstaller-v1.5.0/_IsRes.dll create mode 100644 PL2303-Prolific-DriverInstaller-v1.5.0/corecomp.ini create mode 100644 PL2303-Prolific-DriverInstaller-v1.5.0/default.pal create mode 100644 PL2303-Prolific-DriverInstaller-v1.5.0/dotnetinstaller.exe create mode 100644 PL2303-Prolific-DriverInstaller-v1.5.0/isrt.dll create mode 100644 PL2303-Prolific-DriverInstaller-v1.5.0/ser2pl.cat create mode 100644 PL2303-Prolific-DriverInstaller-v1.5.0/ser2pl.inf create mode 100644 PL2303-Prolific-DriverInstaller-v1.5.0/ser2pl.sys create mode 100644 PL2303-Prolific-DriverInstaller-v1.5.0/ser2pl64.sys create mode 100644 PL2303-Prolific-DriverInstaller-v1.5.0/{info}.txt diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/DIFxData.ini b/PL2303-Prolific-DriverInstaller-v1.5.0/DIFxData.ini new file mode 100644 index 0000000..6734173 --- /dev/null +++ b/PL2303-Prolific-DriverInstaller-v1.5.0/DIFxData.ini @@ -0,0 +1,5 @@ +[] +DIFx32Supported=No +DIFxIntel64Supported=No +DIFxAMD64Supported=No + diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/DeleteUSB.exe b/PL2303-Prolific-DriverInstaller-v1.5.0/DeleteUSB.exe new file mode 100644 index 0000000000000000000000000000000000000000..29d7cfc97c1b3b079b4fd998be71ede2d1a6805d GIT binary patch literal 143360 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

-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

^ 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 m-Bh;S;@u(wiwGonu}A literal 0 HcmV?d00001 diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/FontData.ini b/PL2303-Prolific-DriverInstaller-v1.5.0/FontData.ini new file mode 100644 index 0000000..bfe46d1 --- /dev/null +++ b/PL2303-Prolific-DriverInstaller-v1.5.0/FontData.ini @@ -0,0 +1,3 @@ +[] +FontRegistration=No + diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/ISBEW64.exe b/PL2303-Prolific-DriverInstaller-v1.5.0/ISBEW64.exe new file mode 100644 index 0000000000000000000000000000000000000000..2e507cd489c5e2a34a1d7c5d922513609461d996 GIT binary patch literal 120768 zcmeFaeSB2awf{eP7#JX7qB4rlqXvzlHf_`-GER$BWE4XP^DB_S$Q$z1G@m@6&PN;y_g(5UA#_PzVH;aMiz<`TgjhZM+_T=%eEU z4~^Wcj{G3a_5be73>Z`w)ivHW>(K+d>qgPxVZ9Dti=oh|t z+2zOA){d?BtG+b1?6^s9{A@w-ukx5@797WOH&Ef~Y~+-sIEs5jT=797KM z(i=Zr@IU7L?-m?suFsnHmB;+XTt9V1*DTe!YY%3$2LhLUDHxdj;E`t(-)##V5g1n) zqB9kNz=Jlm^LDOvx{v9{-d9>Y=`k4K!Ths{`y5oMl!bnw(xr4`>ar!uZUc*YDgyT^ zd222NfUwnQOEnuv!EAA^(m~T|O_xyBBNevj9@x zMFeI4qJco?@pCS_G<9hp@ah+ML7joCx$e!i>|YEd9dEM*CLYU+#k@a&>%!gg^&dam zW;A{5=l#Cq`{r)>V#m*!JEx0R1}9s2FPuEEdp=VC|9}4%7-;Grh}RVO=VU9g@sQ&# zTd}VEpOblGmgCl5@{Ni>GJ9Eltmzr2Z%s0rs&DLYx3;@)rD_~Ecs6gHzW($P?j7}u z0mjMIP9VuU6oR5~lzVpr`HnLA)`WZCRi?gvCwp;yr<1*^ex^f>Go0-FdMC+abGUao zIpUcQD#Cq|NC~&5z7Pr2QO}95f4w4*Syga7r|YHgqOb8b=^nS9M8{p>RP`rv^PdPg zU87sQ^rVD4q26)N9!k3X9aa7DrDEBEw)&{9-txZ%0)73deKUWqa58_Xb29mg>j!{# z4prsPaJp7eS=>!NK?i&5@1jID)YR{|fatga))m+;9Y}K5oFuI=>4G6AvvSr7>N&=M zRFQOVGo{MWmz&&W2zRpQ)z>B6--7pf4zR{PU~CfEizX(rbEApu zjYA#Tu5BIJE4_~F+^vrLuH#lFa_0iq(}fum`})I+eh81WH~pc*{j0{S(Q(^A=Oa#I zw)W?DY78fRmrEaG@GZLJxSN-V`JElFI0MTJ8H8iYoJ@bn37@{qaaVg+{TpwyZFCx3 zP0mhC=4OYSTyWB7Y;rW2t6lnjq0r{8i06Pj;XdUpy($pMR~Z1nNxlwf9QU#MMYLmj z-qE)`eW2rxcHHyon+5n{VRy;+!03g8Z*u3>jt0cI`&Xd6U38FeU+V5&Z2wa(nQN6p9x<)!ElSuO;c;Z%g{R&TJc?Ilr`F_y=H9>$==ak0VuvwS_X?3a$(~sSL9M83 zJu!AiMIe0JnV>b9J#jJ*yLDOwb&q8k_aQ?jBCy$_qgf&=Xe$MkWme8Ba%Jq(P)5{o zUw7ON$2;{(h9R>udP(v1IzvCo!^pqRK-~=eJK32No$Rcrlbub?^R^|kogTvD z@cAIHX{D3xtzW3@nJEKbh1OGhakt*wjc)26+{&w@JE`{j6@f%%{he{pZ#7%AU)rWSGNS$>Gm2o z9%>0bq1$dZUegkMT(=i>_e}XDB?^V~3~rCNx9#yI)qv)}5woeXU#XGhlHG0j6Gv8Zqp9R3Dk(&!?NZ`2Q^K%F-}dmL zAE<4*19K(SrwVZl50RU{Lg^We?ly7F#mYs7W+$7hk7_K(nIVSOP2$D%4SvxECl_fu zfueOPw^k$12=dmJOOJK>3h8-+j~J3Dq^`E)0053(0kjeMeUmCkx`zrFhlFQHFzmRG zDvF6g9jA45EPTg+WX*U-+`78(DSq{Om;__Jg>=F;ZowFY%G4&ED5UoHB}9}azGIsx zm@0VtW@=x@ZKu`shLQna+^k-h(%IT;(Oe+4r~gZ&(Vwbzax+88TyUC_bCIoohd3eV z)n^-?Pl5uVLXL?s7Tb!3!PIkO*}G91Zk|2xG^lyw9Y%|^BRqN>ifkKNVL`F`cVD7=K5IuU0jpy z_v;tyxo4#qtt2Zn?Uc!bj+x#eGsrbUo|M0D_I^swKm2{vyZs~IH+Wa?_P(iq1UTzr z=UVx;*@*jYusVI_qneoD3p#I}o1R%UwG%ezB!N+SW8saRf%FTR8*2jT4a#4LoGLs` zpMm_3=g!%?y{W$txp8bo0C7v_E-G))w)aalur0jof||^VLVEnFcxMH2kBWk-Xhm5m zUtWpSkynl{uS&8C;<@2Eh{eh&3D|@?#4MY1&tzn8h=%4MM?V$HS38;IA>i^(883_u z6~evmG3d!$>?mhom7qzwPe~}u5W$VEH3WBY{Vb<%OSo66x|4aYB7BR)NYZ^anY&oC z1T#k{8J^00cWJ&%xXU}-wH?U0-roSt;_i5+C7P;BWR_Jr8LuMTyNuNQV23n-{{pB0HM-B0H^`sUkZq z#4M4WR%3@{j%jG7*Fi%MROBa&O#LLOpP<85i*R7;c2dOFtJOHF!M)}RJL?J?bFoxh z&Yv^9Z;$2mhw^XKTksFwe|ER`Qbl{-m}sO)@H?pzY0Gp&EgeE7-CBrT4IwtIaokOX zNEawUa((~z8uuwT-O5u&VzcMoHg2;$+m>)~d+xJOLp-IT$h>pO$m=N+{*#38&npV& z$DGW7<77??q~CJfDJR^fVznpg(zSaqNvyatp;#!DwRH5Dle{hdx)wkwUpgH%)9~%vJp+8?CcHc`v z1u|>8+kC1}y&8$`w||!SwL}2_ZgzHTZ2!cY?Vs2#4nfsVv_9>)Z(SSlet4nA@D5WV z>DsEC))&H=|E3BW0sP8vb)h;;_^?FH+he9M31aGvWSB1!*8As6SxZBbv zEtNvwqWR_jx*5YD2L3)tB1q&Nk-n)|4H2glZU^36A?zA@U>D=|1IdC`4Z7 z77Ul+_5+8Z37Mfn-yYMl&W)vh|O1FB0}pGM@J? zho{XuP4eAJo{`A>9h}TRE&zZ$PR~uKPr9qXoaad)MV`#!z1opX!uUkpZf`1d8*Jq# zQBnFqo=p~0m&umIMiqR``6^z@y0{n2NgOz4D7`Jr*0%ES!$X$sXLz6aTp)njk{TU< zxS~D$@ShRm$k>Hjh0)vUAD{;JmSj7mSP_2YmKof1XXDl3-j{gMooPi=e9kn|YqEwP zsq02l*r&T?pA_aT`2I3f%&?{Z$YfE7^w=l3F}-}yT6v^iSxg-Y_kKzBN?l}r%|*_c zqyc)m5OD%lLw$qsC{J(n)1M=~8-`3JL+6>uYr3}R z13K?Y`_!!d0}49sUMSLo_n2F0_srPiOk2J_3jH>#>*-=$2m5uMQdU>$b2fMWd^(dl zT}|NkP&*Wl@lM8Pw8LH5^o(&v08+7Bad|Yi!#QS~9O;(~V6FwJFe7UE<+pEoUNU7Fr9a^F2BV+G zS>xRs6Jgw-iY2(#=v7g=&OueT;@8Vwq`vrK3&)0Lk|cBVR&(`d8dPr0JaT*tnX8?V zG^f`=?ubCD>(?7*`}0*}&q~d*<+`c#b8Le2s3ld9#)<(bRwYMdvHC0OTf*I(9%nLI zZIwCkzKl_M`_`oQrHi-l6n8gxw{C-d+*+4MCyU8f+oL-OB4ma|POdT~8EqWPu?-a~ zR~s`$U_72XVZf;OQeMJtW%DpdP$~yD#AkaXRa!vj2i)v(y(-PFP0qHNd2&9eP zj=va?hImw-GaY8hd+BS^-K#D9h(GJmAdpyB9PTDbfJQxQigVoG7>S@~DcyRA;^>*_ z`|AWxX5~!4)ck^X0aumGUb?&zh-XQcZ`@Uvm){|oowYULZcDnaC*4;%5V2zoiU%c` z69fFfx0)vyK_tG;$*ff=H#Z=d5fkne+=Q%s$Mm< zxq>SbZxwT0!hK#7LY>~FjvJVYEfeUcsm6NKl*%r=z9EnryDHuQ;a`eZR@TN3XHp%W z(0eQ@@j!J7jWY$p3;}~yhKp0w34IEcC7%?gve*~4Df*-s&vbBb->N`h@SJJ{rf=V6 zu8)HI&2z?JW`(>@(xNjkH7do6>qIVrZs6sqj1*0Kw!GNqMQ7l2TOxb<#P00r)VC4v zMJC?0L3O3vZZn1XvE?)IP{F+*l%61R3n$%*N5xuk>&_cduESlO#7motJbQ3OVDR=+ z>B5MAP*1}^yolKs4iRSM>dGPvjjLD;AioRn79D7fg~%7)6M$zopfB4y=CBLw-NZuV zZ0@$NzyzfxvE|cVG|Gcil-R!t;r)z{A9!k|Vj8LL7n+0pvsb<-U8is%v{Az^GcC-Z(t%F6|)NY{t*WAy8|FLy7d z224sOpVWl#BjcH)TE?c1v38+Xk$x)yKLI0oX-)7)lWsjqN)a5nIJR{3ZArLmjWYIR zYGOS6NB}#sB7L}wQfp=oR-`=xLY3p5=1l&Lvk^!4^8ELe&lsNZ@agLqx-E|Tq?*L= z%w1S18nfsE#_W?jG#XEPH-B1J>Vaf5RwG8nwqK&3-yaJ7oOQ~s^iw8}{wYy3lyqM$ zlS5L%+MC|&$TmD~#83)^Gtdq3Tt~APKw$^UkM}B z&d(K5yEtFPf`&yfXf4Wkp|xDRA5oOyJ~}1CkyK^qoH6mErL@)#M3O~OZ4f%_FL0rd z$3F#ylw`FsjCe1~_nt&{59irc-nZ^D9^$WL%jrhuG)m?)OEksIa!kVYI^0(fQAqx| zLGLRaRBVOhf{D)L_mi!!CBmow-D!O(-1m2pTCVyoWc z%?%l~=dIMgIqtbpnagv=CSBHQayN$ZqxB0pnq-_r;XI<`=|ryjgyiI>5|f|n$W_PA z%+*}lQMJaYddB;2W}u{d(ZuBBmz>OvQCQ`oiE|`;x=$ad#&}b!$=3D2H;7>v?!}OW zQ;MxRBU+W57BHn&latpcbJeqGht|B4OHKW5k4+8UN8g<#CAUKB(6vGD@-x*QIz#Kg z+{5T3B=sB3)n7nml-K(@C$j+O;?a(KMks%j{PBZ$6=CBWCu)wJ8tTSk{gjjAMp{dL znv**NAwArI>7Z?{LEBu?p91%%6=8PQc@JMiGs26h5WJk!9UrJZL3p`LqQHn!Q5#~v z*_VcmMjA5HR^SdRDTpKI-@PPmYli1vNP3q^+vXRmmMgbSTN2rcEeE61)3;HRbO_6wKaFf})~0tGKma%=*GWs|IJs3X#vgqv1Wf zxez(e-k~C#Y44bBV%(t)q%c9A_QuJD?hc5YQ3uo%*vB{NE8*q*8#5inrALp8`k2Kh z3`oalCuU$MWRl$ z?z|TEcsD;e>Bgf8ceS%|&{^{1AK8D-j@O)xuRE<9=hh@Aujy!Ac3t(Exl<~f+}RbP zmv&+h2KtdZ1!u=wP1BpSh;i(D}Stecn9E+rLK zeEA&pep`M&A#%2sNfruOAatHo78I*LU~h`<=ZunM$yX=gptEx|^;o>8Rl+CUJyKmw z4%lpZ$h%5Ht;l9h77=(OvqKliEU>0Nb(Q2vr`p)#90LgC~@e->G9KZH39EiGpHi7(pga&mBfy1W>mJyiO-1OEN6*Lgfr7S4vZ&r z2OlpI%SC>3mK_mZqA7Y0AZSZ~`!_}Ya>`6JEp{-ebZYXLrI{s$qZP_18fS_Jz;Tyt zi9aT#s7;{&%G;1TyV=Vd{xN3RiP?Dww0S6Z^O&#Zk!M~5f6|F+_Yup&W3?;#d|oB1 z(TPxlO=bDLXag#l(Pm|!Z3w^c zPf^<4+ExokYAjL>yvhb()zQBj#+sQD`;#ssv^f=Hq!I(t>hYq*GtGhYf$_||>Oguz zyl0-3nPa&#LNhgLNnJ(t!WAs~u=0{XuP$`OjImpi-D+i!1(otavg-pLLWZTUn^{x# zm%i>L#jX!rxlL;Xgsp5MY-Izuy*|RyQg-g@_NMLDZ_!RH4+b_vit@xP(#DU2y)DLV zOnoZhwrGkwlL#1ZF?WtTH-u9VANk>h$SD_D62cLMV)+{{IZCcg>pL_4P4~t+MPq16 zTp?|1g8*}@#liKBT2!6UAja<}xv$^d6ka56G=8BAHS7lm=c@YiG<0k2dVC?WGq0@a z8ZU~K>24bQ4G1<1`k0eYdZRZJjcLgZ3TIi(D>>~t>cAWJ-#~&Wc`)h znRky$@10pz(X(?jP0tf?n-D}c%kt=eI! zQ$)B%$ej*!Mw_KuFUP~}FAaW=p>uM#nXKIdz4fzc?r{2g-|K?1SjBDib4bTpdURh5 z_GH&;DJ{P^*91%X9lVYVOM>{M24C~5R8@t@=cvf(T20+aTQ?9tlvH(v$k#5gaOwqc z-m!NP&TrDn2sl~dT$G_+>hsI^eVbh>(@mMaemeC*U*UQd%7yh;!8P;Z%yw1)B8A8i zl+|LuCp9ngDv+-$M8^Axhl|9bxRg&cRcd@yN78-5dvCM`H6Q%t`3#_~d68;fAs62R zP>JG(mT;9twAx(nuis>@_tbASSKQ9J;@Dd-jcdP@J_({ZhmawsV#8fhTJ zi}}z$S(!m=y(ct18V`%90QOMo&unTPwNhb?wOI^rb3AVv62pi)q zuqkz|Z(`+@H~0!QnyNS1sx?Ak@5@weQtvNs@cIvJ@X*~Fto0idP%6&8Isv~OruQ2Z)+-30LJ-HgWfF_^%3)hCdp4o9r6us3KI56(BiX z8kdkOkU$q6SYediaExBA_Fin(Xt&XGO^^AbsVI@Vgm{tf*WXJ4i78o-RGy@#SYz^& zoBTwgaK&J-OOA!e&;DQ=S$|+)cLG# z3x_%E?un4_+KhLQNuog;m;U%|PN6iK?E%LyO zAb|qBc5*hg%E|5@&(I{v@8f&R*BGx}K4>m|+vDN8pHQEs#igBN44%qO+~N-%G^|9;q>%yrE0&Qb#-_+!`d zzyI*^IgzC&{jscyGJAB4_r)0R2GE{t7MUKBAKoXY|D!RSL=k@s4=}f848yt|mNk-0 zst-a($B%4`TNR|y`y|?pFScxa*An!Lat4QSW^cnZ@K_VtirW;C6#VKr6t{6+3(4N$ z4jN+@NA>1HQ?A-zC;> z(_jMP>u{eizSPx)$d0YbC!2*VKeAbH+FBB4rSfUsC$Y2*gPKfzHWPkoGCgaSGrvnF zcZe*F5VYJ#4vOhKr=_iaHj$sGKeIi>9WJ(k*klg4t0D4}OLm=aZO=Kx$xRsJ^t>CO z*Vi6sOZI_vV?^gCSnj+7(dgtZrUCUiPmCuQ$zK$8>>o(55gCvk{Ywp0{!@j>+_MRP zz(!O4Xq%)0%g73Dc=crsetL}ebHzb!${&fh0H&EupoS9&w88CLHCn9q&K4|=w^^Vw zLLlbblwG`gKYu`u#hNp2tJly;Q+tjzG_lYFrY=ONxjt5ZFITb9UFLd!{bHr}tQ3J5 zt*x9tI=!DB$=eb9QT~3mck2GTzAy1lqm9>o4!jxu^W(K0cg*0#M2S4tEm;(WiN3yx zdM0m$3Tr@{PlYkwI9UX(x!zyDkgFnP8{1`2z0l%qzOgI2K4T+`Wd`a4A4AteXM@A^5&*&2@<_h3_nzS z$$6SI)_X^cww2F2A@07Ea0%5YSo>^0jasY_dGdFL$){#m__9iCUFN;Mud?U!!~o9_&^y;f>+G|0Zuc zKAx$Lo5m;s(sp;9oW|~YV<33PhisAS9s8F31m>-iO$Tg_8gdMNR=yWgyqLkh{EOe` z@S;=5A)^$j-4O^sQjr-NGylNM(AWiIGefnhU}h+qt|>$YAXnTuf&Av~ww8~F`xIL? zSV2*PgTWm<{<11Yln7YRXo@g3x{5|v$W@DXg;aHS zJd4&>NbfDX_s^`mTlsVhjU}?DDjW%KJP*FjpKz5n3EZI*7$G}{G6>m3c2sw!nHTrd zfq1UHGT!<``1UIV+)zdM_D*hESIm#~ya!09g}*$5=c+9NwROc!uN!ayH2fdUq{}^m z^u9tBOQESJ4VWc<8?ZjZi}oR*tu-IcjaBXy@ySoLt_XkmeL>W(d~t|5Xt+F@cJ-POAG5_uW$_1yTnX8TVEAhW>TC_U-Ew z$!}G}Uhm7?cDO{ltV&GocQy{;l{+;2<>jPe)jtY3K=VY#dGlh1^XgH%!o4Y8qk4sV zJI&4ER&7NE3-?Vm^>v4u3h|ct^%KLl%a->Q7!#>nGelg~i>9&(^oDrMig+sv!QtE) z_Be(_jP_vb&h-NkXd1wKuRHU2{WN4;%0!QmoWQ#n?dQ&896P^ zCF`kwefak8@UnGv`1Wt;x_16FJBT;8_yf51razkjTq<&Na3>$&kKhlWQP7)W*~pGw zzNYC-)Tz&y-x-YMyg1`{(;1--C>m9ocJ3t|aSANb0Lth0sCT^Hedzq(?A?CI zuJ6tIQejdAFpUN({ZuLt9Wd)@#6Gi%G~S;w4j4IQj4MR$fE}FdsQeakARW>Zme}di z6fT{O6VC!6~7^J$nWG<}AJi_dEMynyL5b)JEzPdPsX zp1CIjOTD|=#JyS$QvB*i!1GlD0?h_}tQrSO(WN4l*1A%B+d&s=KMXM;Ie1v_q8m)w z+R}!AnT4i5+ry05%9MI;dudATCwCi0$^4`rUv5@vmdPNWt#u3{j-g+9o3lO{V=F(4 zp{0#n*9Qk%&_TL0HwA7A_a4ISi2flv=OHveO62GvE)t=gL=!h{K^on$0!o|3tCNba z+IfXQ49Pr4IFg?bGMNUK`OSqF{Su`H{b@cF^Qg(OKKw|#=AP6fjq;R>1F3xqk-xv7 z!mI79lpZ94h*;FVucLxFxr5Jt&&WQj|6v*c)4FF(!{BoT=5X*%a^T>e52kwS7pfUh zv&b~}yjZLA+&79w@bMNmUuJ4Hp*P(-mSM999l(TvO(7Fxr7 zmC8chEOzqhFT5&s?bX^MICl%2Z;1um5^Wsq>t{v!_$`FCJADjN$fvFEf>MkXq+qAO z@ASbx)PiqXy{CSmIwwdv43O!=Sp-691Uf|jIR-kI$8eA)-=8V_t~KsoRwFf4*_sY1 zuW9ryHKnfbYw4}O!&E89SP{r(y=w&Z4T6>XsGZ0R$TaX(CLCdVfBIV9$ahJXZ?Xh# z-wq@HU_gJsx5@y9<-?0UNm)ZY>BFHAf1R~cuA%!?tI6}ADNTLKh_NGG)Ueu88j?2A zHw481XOu2rM@#<5xKYfgcOq)At!7;jh_zm4sr^St9MpFD62YCjM`A0-Ew(o86e8b! z8VENrRUM$AA^@48`X7^~-b1E<42A8@5)2IlkfI`K$*_dok%PkZsENNp4%|z!w}crT z@niMZcLbI6S82bv55v7Lm>cw0X}%?L{n}8mhtil!$p_(|vK@bxWP`f&`37yb03&Ei zCy+=+7K1rPwumzc$%2od>&F-I!c10P`yr)9(TV&F%zslLp6mEqpY=_j496}6r~ zmcjFsz=I;xjBo-$X8jwVlI|S+#PkE*8MQ&{(9ojgcT0M>aD?S%6hH9(MR!FDOdkG5 zKS=vG#PRCCNgUfXQ^(y$@>O^x&e0SI_tJCJ8Y7thPF@M--=Jj86JYWHyw~Z%_Ec4}`xgFfZs0@pZ1IT5j`@vUuIh$X`eed#eU~enoM13z^&%`LnJ1 zd;*d8zWRK$xi#wZA-aWqUtkD`YuSft)^fWzzdv`&OyY2bA6JDenzIi9p&`}y>0{KB zd+N988P(V`S9Ug-D?1%@?O7@9rnqETuK#v=$J4}z>c959fpH_VEZKAz9K7lY%HhvK z8qK!)(mnMXcp?ANYI8*|=PGyB5_3f_H&;A$=89g<6}{@c){nq{v(7(C6C+WUvb%sS@{of_qWO1 zar1a&0l@bc;U7cm1GYls2TzI@II=`8vH{#<)pK69^fXQ*(`B40;YTihB2?11KgxEP z2}K**L9C({6wq|zI~D;;5%J+iRuDuO?v*nnGqhK@_kYNg8QLe@JB^zup%_{EZqNi# z0`X!%Bx*qewNNzPwHknRYRrg;tvQ5WSRXR=T#G0AHj~>sRo#F9RWyHq^(3F^$+_l- zOX1$M@64ehMFoH}G8F8}<^=qDh9_mqIJw76ueuS&>Rljpy8Lel!p}kZ;YY&VnVlD> z561FnOz&rn4Ou4gLY+zm#~sR#>t=_HZ?4GIl83?eGPFpPy2Di}J;SqUKiJQpZd|yRstPR`vEjjLtnosV%khCd6R7us<+#bUi_=+8U<+cK5Fx?%&~n zzAX#ROS)c({^RZ{(^03ZG&HBPrD(ok_U{07+}(TiDrZ zLe8lCFsebQzgw@N@#QIwV*KDk$)t|K~*gksi60g=rL2a9j3UyNb#*t zdcQsv*wA?V9h-qaFgq%$FEbqUtM~(a*uy~wiYIJjkANc5+*c?nN0ax&?@dvoY7sur zR3I$Dm(NW6pMOF^52rpcss~NYoiZ)$X`#3+=ZrG+@w{Ew!W1Y(zO_=rp%4TZBBsSK z7(&4gCO{!mzL!q^gzzKF+H$cC@yyUk*Bwj1Qu6zF%)3^{!w=s!=8cO)zISAQ%QaE8 zvG8jA*8UZl{x$slaK$J3SF9&}BY)5Hx0%1;e^vHhh56?{?BP;r{t1lIza`C427TYh z>4aH-x{Y&T9J>k{&QohuY?WqUK_H(25SPWkD4aZ z=V+a&Q;K%XYs9mpR@0v|EecRup`?ec%T&GR3J*6GrhaD25|c2l5IKZ2wHIT<1cwq7 zA`t_8F-tyFyi1MZyo6=y>SOiuDs_Fx9!Y~BxsPZ3?TDOv&70fmgGVN=YOF-H%6oYzqs2Mc)TkXHW5{=1?NW6-mI!L`*X_qR_6z zz6}kqFF^IW2d5oXZ}iwwJn9wT3n4ewTl^v_#WJ#wh(>*K6H}&%Mtz7^mew@OjFRy9 ze|^*fPahJE8uZ~*PA3-`Rf4l-S2+8&%$r+?Jb(O%e*Nh+6;r={ zyIDLqG7@zr01=7mC=!*R)4M4vHw)Mgm{s`w@|+mWPb;RAfGqI6sh?l2a8A_ znv+>JXYaC6$>1|u2w@35i;wH$&Jj6}0viD6jO_5o}4yw z+2MW~FX=zV(c@l#?}r5mv$amn6adw>CO`+6v z$(GCOQlG}5kdEZe2YQ|0u`~$$>~DTdV*$}n$92SEY)?h4O76I4g$ih`pRJS9dg=jS zUvR&Z{*%TYWBl`>WcG4ic3{Yr;CFHzY>V#yrPfJ~D&KQP|3x^%%P_)E=6Wo0)3$~6 znh;d-<3DKJE>mpLtD4w3YNglMD4FZ)0=U6Alrob0%*bB+fClM>Y2<2p@n&k0kNb{L z;nN`R5&&KA&D-DaMP4Vc2pV)bqFT=g!SPIG)9TEXon9llbT(aj6HQ8@%^b;_1SbZL5Pq0iaCGm#c*#;g@7aqwTc_| zT@*LVz??W%Ndp9}!F|&15NRy!5IM5ALnM8WcMyAz*0MX*Y!kkOLk$KOP&nyw zQlF5{4)K(o@oc=yIE5Uo;aI;_p!g7XG&{XdcBfUh#H-VvaHoY@;-U00?zEbgc#U>| zzgv+?ve}Z5UKVY!tJlQ~&p?j{P_`P~kqyP?Hb9Ts$)5h+l1g6|89h2Gv4IE~K@-~h zn8+Pey$i_sH6}DTKOlun`}fTLq6X`G(h5kCd<=WBF@Ol(HR;i|&{fv!7|oqM(YwdU zk8Q?YBYJ=^Tn=}TStY><7a47?T6$fX1 zrY=Fd#TT2Gphq$I0!O@|?wRO0QM=te#Q5(Lzj*`XQ69f(=mRCTjFUzg{oj+s*xrmU@fy}Dc|!(tWqrnx2b(=n>Cu07YmUZ(vZ~BA*1cN z_>qdLYJdV!AV(YBK;E0AX6jcNRp>zejoa!?c{KQ+Odzpmr5dms1Iyc6xQF)cnKYuk z$!c#2HSgZuoISNS<)hlG+e3TD(w^ynSt8>6sb843CKMvin7aiB6!##MI=T~D*sY^0 z_t~YRJ_VHbcd^>q1;6*#k8FQ_sr^rVSo_!Ssr|MOYhSV2vz?r5wCp7_2}EpgvNuJU zGba+GS;wfqD+rpNaEK!`0m%°>%8i+@L-`nI&O-7eg|w&|I+-030K;~r8fqs+lz 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≫jO$~PZZR;#P$}t z2KbHOOdfBf_P6H|ulU+CBlYr~_dS>ipx{wjF4{;N7da%9oT7K2?ttXKxJm#64D8E8 z4K~h=#Bv5*6(p_+s_CYyf%py6U*@Tw(X~KLiy#oi=F0lxbdiu&0972~;5g#bDgGWn zkAD|gnX*)yN9sO?YEOU+&s;w_D|6}6A3k2f8c|b<2Dd!A6B>`GpwGzV4>h7FdDr03 ztY}QQF{t@@Y9;>7ao7^1Jwhr8UqwS3MO%N2Pd_4c&Z5AAo}!6MFt^$TiH{+JTg9_r zkndVK@S%YrVUlo}=!R_m0^p`mapo)=JweVgtIW1LXTYF+|2c#%UV^=iiLHRpbP|8) z-(>G&ilSXUj34@Id!Lp zcPd-kt&gF9A@ztl3F=d*?;y>o9gtd7Jt7+=!DI}TEuoj0Y@?FTO@l6X; zGFbVD<5VEh7(~*p6lBoBDv&|zqT1!;q;4lCZ8kU4nA+3Tzync;%Fnq5i&I3eXgw#% ztmHmnB0cDd&!{>kWM7H84csj*J3x`wdqF?1uZw@h1B~JUlAilHh2#Fv>a{1IqUn|; z;8Li#BEz9_{suBmmh(T!c(!tW3!WryY`48YIv}|GI5Aehow99<66)xKyw5}@V-?bpTQJWY{V&XecX*X+c8(h>2?ad$C?!ZEh9{xG_=BZ^+#QSoK zvC|KP7`>L#*62liV6=G z%_+kU7xQVjxY++OEybCU>pSfOw666jgiu!^72BP!a^b`0ZiG-E5z~#rr*4XN&bw_p zMdR=NC9+3yibTiIP$U#;Tu)YJ61E{u%A$?~%1B|*>fRUS^8g~{(==_;LN~b?YU2QgRSu590WDPP@!lEf28n7wOlkh z-kVUC5sG9v?>*jv3Ql)mY-{3WfK0ZapW)f(naAKO6+~iREqZB0g8V?|q@8{VPX1k7 zWZ9GkTM$+OPirgvCq2w4JslYS(f+S%Sieti8T* zql1cJ-Aa#|o#wB%GG(!L4@IHpOp9^xX5?;VF11r?Bwo@I_M&y6_q;u&9WHb>2=+8s zNvEOKioT2L3}=Oc-y=?7cb>{p3*{!V!UGY|if zW|04kXT<|Er@V$fqRqe2YVu9>6z}7k9xwyOZ>0*j4}rjLPiv&6Ch@w%h1PrQG|iOx zmrbuoQh}A|Mc2ZoP9?pdoXFvW>tf7TcI0-M_Y%R_RPf3f^I?+J9a!@J3>qV7yZ|&} z=0%LBumMWFj4pQ`=ih2IVVRwFEm`MN@g3Ike~A{>dLG2R-IMw6O>Yu04l%r;fezn~ zDo+^4@qFT;?t__#i>y#S-XAhOMlG1@%a$@C1)KNOxNhupYDXN=y5)Kg${U?Ov}3A0 zF2Jz6pb*9O1)k;5 z{5xXxJx;OiLM+s-oP^iMzu-SqB}xHXI8qVL6M4+zpZ`}pl%wrOFAVB%gfBsxK(bto z`>U)a!6>*CXxi7n%FCZ`7HLdHSqhApk%#EmfHmq)OkQJmrLxwe{(!m>axd~{FyAVV zdMC}=(b~fpyjY4fFL{L0xs%Xnt>?l^y)$`mh|z`+=ZFx5RQn2ITaWoEH~%1w$Lvtt zl-T#+nL!SXz1R(n`9=}mLr(tA2JJav&)4n06?Vd*Jt)it(X-)T32u+Uv|=Nb4i&k%&yQ^Z zYNIIeuw9gI*shnF2p@12xONfw-avc-_`^Hb)2GDI`Y)(M5G3KR2gUIox~4Yl*5Sa3 zY?H6YquxrT(&ulWvN8$bN9~n5t$To%?zkC3CE1NslHEup*^N|Uz;2-OiQkia)akTi zf{*BoK*>rv^Fe3GElg*lflj1g*n2|!E%gJeJE`v|Ih0YfxCHEAQ7)pZqSXW1HZ+$! zAfA*9%LHf{w8I_?dAN@X6k&%8bfCBR(JD+{(n@!Fhk%4$zi;4W(zfv$YfCqZraAr} zJ2B~!3?-@qR-6*ke!=~>lQlR)-1{>dINLk{mE3RwWGX62TY}_)Mg(~8OIY|>+{F%U z1y@WZ1w3W(CnPUKoZnHLkgz}yuli@YjgISNmIu*0d(!uMFk3)cTyE>N_T1K+lCd(P z=9=k7y8PVMjkxA%eFn)lTT>;fo@U2Zq}05`U{?3EwM6h)hux;kuG)XvcDhrpqO0>r z$)krN9ZemcfRb{Ra;d)K$+q(<6SV#gcjoT(V_Y+!tao4|k-3KMaCpL@9YO=ywh)`+ z_tDF?ud6w6Xn`4Y_N<0FZ#4&(*1rl9pIxfK_>d2v#i>)gk1-B3<(So#6w8TV88iu1 z14Xo^;E6_;a5MQ$l}3eoDw@e@@u`9nAC({M$FG%Q7JpSHXPR{RF7>n3ySP1e?%a1rfIc;oF2NF6c1g1LyWPfaZg2YjER zznY5(5R4Om&9$om$h|XO(c1&U(}MswNTr!tTsTIx(;f2-t~K%f17`ykpkY$2<)>rs z0Mv76-4{ZJ<7xr*@44#Bgkx@+t?4r$MgzgBHRHk5Naz)B?C6nvFww()b&x$e&GB3im6Ne`| z*N=70=*|telP4g}wg%cSMf0|Jd+48ZCdQd@f$soT^CvyC6*+Bd@C;ZRu(6m8Z6HZO5_ z_9hs-Mh*5l1tg(Z)4vHC$^oD{CZ&Xl`BhMN%4PTR+9an#N$HvZ%n>% zFHj{0N54Q77L0qrjLHdGUf>mRQ`}<8LF9gPLGDB5ves-nH$}lTikqx3C2~_NOk=ny z4yI&o8VS=l8l=1pnTXS~7>8hc01ayO;bmcHp9Q*&2C7oX>#RwOXDc!y70Ihc{p;i4*tG_`kGl9_J}OfI3=g z$0@%iPukNa1`eUiPJ-`=@Qq)RjM+Sv!tHd=9lxNZ$&~i9aIn7;QXwxJzap`-c|5L0 zfXXqKWF&=l-iOd~srJth-qU_fxn~2kAuT=`7Rt6oyW<`dYim|C_l-7*JZ-@3IKdg1 zR`N|pfjsvJ1^${|8Glu~9^tiCsGj0Ax}YWfm|Oj)OAKQ3X%JgL+)_x)gJqmy7Ho&~ zzwt=xjQ-c3HIvr0eTmQfoA~6{_}gVU2TsUbcqg>z(7|sR(BdV_VIG9vECbaZ{Z3cM zam4q0@tG%cPu(2tHB59FuHw)qIpyP9*;tQ*CNFrM_?J(h*dBj-7o`df!-L)Z{CqQB z7F!P;IX(tU?ty$OCM*Y%R$fS9I(+l}S*M>zcqNru(g3t2IKD#nuSIo5#|iR>BoX!- zk~q(xu8%mm7V=Uo(Gr+&6(pdje~dh}axBC^bwnqDx%bxWejhe<&}4v|2NDa-QvbpI z50g8I#p9<4FjasQ02}%tGN*D!*5Pf-^QLim->wxLu5?Up2EEZ z{{BSU4?Z;^o$Z)7D38I8*PTtK6a8oqcQ+mc@I<~g@HcSRk2_#i}?3BkG69n6JC zlknI)$OE^cOsf+fm4iIafyZj$ajnrqn?P$+susLK`_ZE)By3sYGa(BHdVNHl+Sbkp z9KbaWRrk|)bM7^G#{~+7J#=HkZaPA$4YJl*C|D#WrM-b7Yo2;xN-j^6~oAy2yV|edNY*|R6qMW!C ztIj2~2wh2?4PMBl5^wu73_S^GB? z+mqf)AK;@#HU1Nb2JIm}!^P(kac==eH`><6_-?60YRks5IS(s6P$kn$z8Ey_4G>zv zd1yCnb4bsxO$CQy-e)pY=d0j?d12gJHJuC`Hx~0IETkwnmNy}b1Rf;MN6w<(ACzwMuhw*7n>Wy@4JNFc2Rr9k{J+zHP@exjkGi=(GI z=GdA)M2({~B6w+RqKwl?V~sbr-%~3NB)tVCotF!}dq{Fz~)uc-Mx!J>2_Y={<^j)1b7~aw&YY&fkdI3o|wKIu5M@<3Xyu2p=vLPl^=i za1XD%b%Vj_xK(HnTKsnw^GjMUeXP_ zvO&8N1mT)jo_V}!s>bhtyOt@*%y97;A6gr6;FvQWh{oC;CDMc9h{ju49z1{}w2fL>$E(w`%;k(kov317(6PwIs$= z<3E2E)ZGs^%-CQJhwu7?CpGl~YV?KS?I_~x01b}oi3w}KM^GgN|A_v5@cox*{QgUH zu7;`zcjseJYMO$)gzvv>n2Wnb#S9D7?9VW7=!?Q#m%(Sh!+n_dqI$#W480FCj?$Sz z^+fstp9&mwVul(EZudFkJ=|0olx85u(>&%m^zdw~yT$k%F3;z=z!5eYM}82zkdIH#^p7KdMZAXl9uXDkZi%I7-sW6X zJ%0>0KD)&`Za{wv*R?M~l=s<7=^u|9OG(shxPF`W*H8DKj@V-NpN{m6S1k=R-lyVJ zEj}1q1Z~YA%tKk`?cW;$!r(qb~2lVnY13Qzm;;Mk_w`IB+R?Wd|a42$b3YYyUE-w%spg&UYL)P zd516`C-Wo1tdV)UF!z!9c3~#1LTeCa8fIvUFw=C3RxZqTGOrS58V+jt!t5ZkTbOB% zLCX+kTH4Sq6y^*vJA~Ou=0sukkl8BC`DFgOg>$dt+TC(J4)S3^xUOS7nelTUKzCr# zUZ;?>yp$P#k#Ok{E?8TQpC(*>KLi{2iTFoFZo@cplM&%-Xum+ZS)g#h<#XY3lW<9e zizZyI5iXdljel3TTp?UC;BrK`Tq0bYa5*4crV1AiTsnkH0=du%ip(k(2>krrN-R+{ zfJRTClDgmPFr(nZ0BAGx;?gv4>sstf^*Ow)n=uNr919>^`pcfy94qcwd5ZRs^tsh9 z>E=K@p-EW8?p<#nk2Hn+%W1gaMd*~tu?2pHHqr|EpWo5vv4RdV=;WsNQyaNYn}~U7zo@3pjsM%gzias z7D?@-UB`b{pQ5-%bmqA)P;+prdG&lXV^<7pdFnp(uq~$tnqn$f7x6ytc%s-_d|YYY z@_=U-M$YtY^=2Mlf9GO!>~;?xJ;l7xdUW$H8&+!9$A&`T0)*pz+C`9Oo*BnI0q9m3 z(b}3;06|ye!Gp;BXsyVP`XKG%s1n=7{_+EpQDF!$XRyf$->l8P!K zoGNa}4`o|BhIx8URllw27nowEV<#%FS4o0P{gWy#@EJ(D3MpW)jU4dlipQIQ9OuvT zte*5kS|=219B;t57|f)CnN%>73T9HlOe&ZuP?|qjc?Cz3{@O^7jbq46$3M&a=muNo zY?KrpjuP8joh|hpcrXoHh1}|gwq`IS0@r9-$GwzbO9$E29lJO<3jX)}hyq~SA}MR& zYYcm^MMy3cK6fu>K4P^e-$z`8K?}O1{3nD!C`ky&AGB$<+$92Di!DGD&~u8rNBCy> z`N~0r^J$#X!h}e00yK4+l156neN9}dXxquRj6mVXewm|085qck9ooP|Tdzo#LTQ67 z4YqFBTzn%|D($c7pz!c=XiKnWNeUh2dP<W`U33$rA9RLuu4b~ z&}UPzo<4&f2Da8tp=-hu%i6Y?=9y!C7m7E2;pY29UM=mLME8Q(gnyiT1Nbu!?i)C_ z!+&&OPaAFuk5I6)3|nS^0UKPA^GsY5?eoG28R?F-`?6q!^mE51`(~k6chIxKhv?pD z{r>8o>G98nH-B~b6L?1l{bUXO)Hu8u-0iX9wy92$dMIbY5Y8VF?L#K78q{nI8q zEQ|hNx9??6n_si$K0ELY|F*2dqDbF>H}dt|^xe75dz8*#92Je{+zt;FPSfkkd079M z>goK@4)eJ%pCipSm`4a_bJHnb3q>>J2IFhoKTUNB*$j@l4twT&VC2o%F<0t@Y=(^X zK}K%|r&zuRZV<9L*{vpRzyetMF`Qz+g<#&+Jgd7k2SV@5)|GY~`}8e#2Ns(!QTliW z7IjG;W3hD=$vzCRa8E}vm)244z;aV?>_F0+7X3 zZn$S|OO^`{P^*WrI+QUMn;Wp?0{!nZt|YqD{WH3u>$)=cZ;p2da&c&$M+?Td)&0Wg z@_!j&Yq|y90BE)~-3$YqFavxqOm6jek0KSf`aaGa`Jz24UK=hq&%J*K90v(Wv)*-l4H=z<}7<*F-6%J$~XkP;-@`@*t)A7neiy^3(M!03tsPB|#1**ug! zCUFLmsNbNO_p1?9UCDCzQ4xrALzXtlEFBjsWjG~{vsAHlS!#1Tii0ALqjWNl+wM$& z0n!5u(!3ph>T4lJfYYNC@Sov_NwpWA}`{v z`b2l@X1n?nF&-2WoKuTdYjExn?>|Lx{lhIMM(#$;%zfxhZB46S^aeO=GonpH{@9=OnsxN!k`!`vqYUi!N7EV7gdY;7HW*R33z!fp0+qyZoBI{@ z?ZMSkfwn_CuZsZlnolV6@~|9o3Ekti6fVIT0(Y1YL#?AAWyP0(7VHNiWh9xDkvTUb zpDLuM3hAjrda96~Dx{|h>8V0`21*M_84>yiRrj~+AK0p#GgSX@-bHDgseg2DBW!dI z75WEcH&$)J`bQ?N9E1Kb=NRH5Og{7v?GA*e?d+f;tbdFW0gwGf1S~j<{!t#%KakQO z{iB@E1Vf+bqufFNzzi_yA5J)FaKfdxuib$$R zefSuYIQ7J}5pnQokV4Xqm}eew;=M`lsUPe6%EkO;J-Tg_za45_GM+9ietVx&!}jcZ zfI@qxO%?!M0-!c@z|EU!DQV?X?z9Tiu!~Xxk@?D0m%jDm2ny4es2zHns9r@o&!NK6 z;b0WFWj$0#Wui;h^d6xt$81geK&?w|4C$r&3Ouc1KRPzfLW}ft z4p^PGov&)I!wbsH7*aCbEvr&;kn}?4;sqGA!NCoO95^5Wu#Y!|W@~613}NI>ajULG z-qj%AX{rmm%@6=)Fg_{0Fgdh_lf=IwarD|_GLSdgvxr0I{`PJl`Zv}b#@U`m1W7&l z($TwzxUbH$q<*##5&pgPMqP%~n)KJP^DMUaDJWT7%fWmR3QewG7m^?;=gK}bmXZ`F zGn|7}^R%?FUnkNa=MlPqYF8PqJ()Mk=r)Ku~A3N%6L zLvg>JjQB(N<*HxwLj2(r!N+rb%r}Fm#;^c$IRY1tXUxwzGC#^yp5iye1Cb}FWeJ7V zHEew9>baP}do3e4Ct~aJVeNSzb=Ln1#!=N_W)@mOt7&k5{!;|;(3S<P z4l57fI~9DVg6~xD9eQT;#2!!J7Y)daoEf0av#{~eKh`jaG;k=6UgW6n<*Axi{Tx!y zgT4V{cBZ{ZvzjO>bnR^&aPVd(E%sB#u!3%#;Cm(M_2~>{nm+u09(}X#9POz$gsg`? z(8Eieq@L58Ibjt^mMMDZJ1BIbcJ*5n8aOE^!~ueyY9J99ft&95yg~%`CeqM3(3lpI z9HB$~G55y0wPMa|^`YiZ`LeW!e)?_mnhA&K0(4DAgUXed+#5u0}5 zZ_3su!q@!Zf+#LlA)hYC^DKeuO)melacE+uE#pYkq*3p}Z>iU|_RD+)6LQsCNwSgO zHtd)?ZbjD<TV{hVIvWONl0>fejm8`V2?lui4`It3d?&znhR+Tc>Bn88r3IAQ zT5bet(24h53WX`fcIQJ2r zr|rd8{k>^HhwFo_Byh!p^T)229*&@yhv?kz$~;&%)_(|Bpng_69e;f0%meEt z_z#(B^8qF+f+pvwm#w~Wu;$uw-c3IhEOOZ%KNQ(wGC5A%;)1|&8KZ8MWc)X^TPx$(tA`6@W|SN<%^ z10WabQAU3ZzZ@@j+~()D~i%iuX#`+|6vI(mnur=_ls$Ch9662Uk>w1~K4=?4cs>dFPv&dB zbg@>dn*=mHaj$l2um2Wx(xZI^fYok#5Iz+?u3c!IOnZu45!epQ$wPG_w{_Db~F7V_pc3WbcfgJllddO188ET(0|HrPE~mN}#v;Onx? z4w)_tncf9j4}1|YQaWl6T)|0B*k_qaBzIY!K_L2ol-3b=(!FIEj1X-+?GcE}(|)*? z(zc8^@ePr1lCZa0-XsvPtScodp4XAJT3#0J*TWs5UV=@VBGN{2{pvnhTq=bUsgusb zQ@@E)4}V05KkMI!LFr7N$?<&vt5PQ$L{=|sG?6lg{y?c;MNGWZI)LMGH`rZ)f@j3rv?F&7)X&@haT;lJA^FY$=k(9Gr^w7Lrz;hZj z>fXYYz)N+gCQTp>I}l$5pxuvE4xqi4oPg1;ZC?wAE=w~U=kofw*Uk&gvz8WPDJh;gjuJx>k0?qMYyXdIPJ{KJX(vFSmKw!j&px# zf?bx0F!NwY>IUO|neUO37>Hj)aa%3f0KJ!j`$Xvf^mk+{Dh}V*EdqWh;X4u@kZ`Aj zk4m^*LWhj6r}F@cXFH%hok!rNv1`=tFb z315`(h=dNy+FbnC0r+AlZ03p;q*N$;gb^X zmhdeJ`y@20B7Cxhb0l0QVVQ)tNO*^Y4@S&lrj_(ShPsdL z$3_s{$l;BWpXwznkkBjPVM))W(ym9oMdG<#!gdLFNq9iQcP0Ep!U$PEH%hyXPlxl* zb#db=36DzHK2Esn;dJP1baG?INdb3s3CJD4<DVTEaaEjP*~9k3XK}om)Ns^@PTatYhhhTb{1T7j*ZmcJdg` zW&!C+0IXfJ4$M|lIyHbXfX4yT0O_L?`|?Em_VrG3VrdeVFB#rlJBvG|N9mMbM_9#2 z>DR;VkaqH^Q)(-!);N^vYDZ;t)fz_e$bE+)9u>i^A@THZ+K_O4!-OL`lCK|3M=ISZXbyHRK`YK0h zeQ{|G$H;@R78#zYPT?T`(rp)EO2b}McJw(=KEgEo-}BKHhl`J?7ykXH_`_rU@4M#z zT9i+pggI5k)g`6*)fH7rX)Vw%&RMo3$D2NTmfP#4)ZC?m{j;lUbLuOU{Mzc`(z-gv z*47nQ*Or#fDygjG#MSz$l!~>bj?&uN>RJb5@idymx5B%0`EudPotEb=xx!#&?xlII z+$CX`WtXO<&xwz9RXK`kYAP#=i>S^VFk+6|5hqP<}v8=XwEt06Ha}?Fpm9AY~ zxxrE5#^YD?>Um5QUf%u!raSxGG#B}FvNEUsQ#Q&Cx3;z+%yxU%+qN13mx zn3pN1v&a!5stQfdSF9lO_|HAvm6dr#6;(X%l<(P;@2YCWQCd~)TT||+t0^i*ei6K~ z8p#eSFk^XLJfyrrc`p@}w`_$dZ>1bWS63C6&id}qcq=I|GAspqUMKuBwg}dxq^0~gk5RuniINqgajaR3Xd`rAbC|->Z9Jj8bR`C^8 zhAW9`lP5rQpT8L6a5 zDH3FhMDRCWu!5nva$!(gdb6*zj))`fUnYeQDizXfZ3TE5%t$;y&A?aXtD{0)U-UmH z3Xq>PUarHohtew4WOdcr(keyfhr;u69X5PX?HV5it_$U!!t?f41|g?VgRUW2%~_ko zUMc5lOiff2*H+h6mnn{`DtIolXUqtdhgS$gD$H24fmyR=vH3N%)oW@Y<*JGxt$m_* zyd3o@i!g`e_vF}E2zm-O&q0ytJM843U-p~r2ZUYkXIG=nhxV})!4wf`wnRl+V`4|d z#gDYv6Gn|rOd4}e^4M|bj-N1bl4J6esVUQ@pO)pgh3P*}9OxTLgfO?kzQ zH&w2!s;;@YwodV_TVKE7mW`V>Z`sPSIMtZ5*X3<#b}b|?+SPI}H~JP=Rmt+2imL2t z6ad2BR9ahAT8Vy8c5GLa>V4kT5YN@?mn*!{Gq|s;E3I9+`bMD14R;ixmu2MdEvi#o zNMjwk*&1JsAO!BhO`v0W=uL~(lrE^Q7co~Z&si4kg`sa`Lw;A5f}cfF4lhJ4g!Fkb zUykfbbTbZ5MJc+y;_?j+cWGU5ZAFb9#Ib;SJ`u=OTU)e2Ml`yIqo8wjq;kxT6&q?w zha!VdAs6*f(@+e>Xnee}ukjVtmI%a!Ym2IopAyG9lnZ)>;_8|WT-fNHO9fh}Ap?an z+`84GhyM1^NdLRyE!hAL2Z>T7mOxs_?u|Muz4%z69xmJ)p!W-hC@d}4v+|utG=%@w ztPd?G1AT)^XlOW++j>Tf0Sjv?(HWBrfk-EQx%N6oab#w~|Fr2Lab!EJd8C0{zRNyUQ-4;W1HXm>reiz|4^YRNAqOcicrXT*yfCaPT z@M8?h4;MeMGUDmUh>zE$*<{$~1JUJ#6rbdO&iiD);RYyBl@)8M=!H;jhsuqyb1`)q z++L&9UOETipk-4L2xr*K&<%tgZn%Ml21Yw{!>|?MYl_HQMkjnFrNxziBp^$KaMnEm z`{&4UorK3F?2)iT!W|N}OSoOa776PmY+EGom0u*FN5V7-?GpCQ68<$ZUb%#6(!EgH zS4mhP;R*@!CG<+@lyJU;84}KsFipY>B}|ntMM8&!<0VX%Fi}FggmDsDB{WOOB>XyE zqK~geN3CF5#agJSyQ4340_wC}FpRdnMc@;iD3^OV}o1y@cfw=1Z6+ zp{N%*LQ4H7C6mP=S5VTOds685DD z{M{0^OIRaezJ#d~G6{PmzqL!)Afe8uhNkfUrP0BL{!3;0zo9JgEM_*t(O1a<^WS;=$|<8@t^AU^YY5|l|BL3+qk}Yhu%QG(jImaTz(D2_ax8YEB7B&l$$zJ?;qdshbR8{$KU(g`zQYXj}Nro4}%|l{K=<%pMCz%lm9yPMgQq9zxw*$-wgb> z2mEIr(0``^|NnOW|F_fsZ)iw=bz)H^{yevl`^R9IHvXhs(FdSBG)HB3~s( zz6f)o6xmf%TS1C^9?i^fY>X`|U0sXW5MjWr-H49>vC4j%9z5| zvm#atcl}$AQeKYGITANfEpnO**K71(2;<@*@_=uxA-;#>D>(yiE~`RnrAVs`A&NsW z79xHnY&v~<0@ z?hAQbN`J8LRlrScbpd`<`c$%M^4(Hx$?ip&ox4v!T z$M$VYpSo<@(@Q^QQ-8Mn=}-TevUB0%RhbdzUis;#m2Sbgl3-Ce@IBH^#Yj_ZXzZH|E2RRV9}`NDoYRfdDo>n1Xn}j_QI&T#2J0wiIN!lfJtQGeBDgpZ> zWHrKWzga-1q|YkpZI^WF^wvnb^CA(R$uEDI$X}Xtw@c`d@c)(kkjSBE1IM*qtoxCTX`yJ6bvS zXVM-i?R^UbJ!WY?F6~j$-XrZ6X@6AO_4FE~T~Dt-+V%9D(ypgxmv%k9K9@*ePp@0r z_4M)}&q|n&%RVYoqn-MiB1mHTsDHfz4lK6Na`~jWc`nk{>$W7SJIflTdH>Ivm>m3$7ITuDMLaZ_r_~w9gZ;O}f`)2z!Q%=e$kWhr+YT zjSj}Yg$rc?==M=V-)O;Yh^*e4ZMksVkYJwh))kk@pr+U>}`Nnz@vapK>GA>L|>00 z=xYEZ`WWt~luM$aaMaT(bZ@2nXwOs=?AxVX$4BAP)`i1G!|sILIV2p>SH51*=LDp5 zTL6ca3x(77<&Ccw`|>IQjr;PbTqs=H27%8CNcqhN92$=3)601;{3+f?!-S)9z3`U7 z`EbMTfjfPAekuMVhHx>k?}a^|0^!rc8Pm<*B+{)197-RB-vM|1BRY1$?vM_{;Y-^r z@D%_W@hw~KUOxSWl9?yIzc2Tm!$n6%HYiOLzj)rNZ0vKQ)#tiZ6?NEVvZ}TeYiY_V zZ&4MNkJgkra;r*8u@$8RYnH3(FP*b0clm;xt1q21tEObNBxDFkZZk3ak}%yyZ_0bB z!OsbENB)^%35V`V{Q=={;&(Q@+#hjT47kZn|ETQR4SpRkpDk^Q;{-0El|EzoXTwk7 z$`Qx9RHvF;!XKsYF!(uP{DIt+e2 z1~Y}BxcX--kF(+9VSj95$!DR5@|I@s^T0eDA28t1Q#Pi1HoTN>KgyxafSc1I|4_P* z8vN{64xcWSrT!VyJzM$m(7>gCL-Rs3>ApsMXQPwwl>frS8tAT*vwZyznOMCcO=B?P zw>E>Hb(x9nfIaz|;qmnVm+oVv@2CNX5kHkJ_-35`jHFC+_qu-j>FBd0&VUp6YEBqcCSQRfZYyQgWuW8WoR0@ooJwbg+60> z4M&#;}{AFC)G85MmmN|M}z_$kAN2pY3c5I`SlFr z*MV~TpDaHoXdr!nJ|o>8)XC6~T&S!I4SxSqwDg^&{CW&&8R?;V(hPpzm4~{K&T#D@ z1H3ofM|GNS@cU1E`Y7=0n2hDQ-GIZG4$-p1;CHq*(DrkI)sFB+ynTkaM!dYPz$^Nf zY%r6Xj*raWhOZCla$G~gl@Gy3c<7`2G#LE0!|W*t)4>DbkB*n@#`K5cr8Y8L`yQ^{ z=(yV&~V8^!Vxa|sJ_w+e%oOluD#S?&LZc7!)XTGghT&$+cxyAdcErYI&=W9{u$GE8sh5y1SxcZ!Eb0k zMLb7!OrH_oaC|62K@Ud%y2F4|cPB`=x($A9c#OOs_CoZ>9rz`~{%s%i-NW@qXY0?2 zmop4~{dY|(1L^QGM|@+xTMW32bP`SN2EYH5A3N~tIW^+f3^;wxN zVH(HGHIap6@4>|@9f&wKDS|~Ui%27TD%o+$E!uQ$$lnwl$)XoT)^HpnBH4%q(fLt` z@4!LIT`49uHa3FA&W_3t*)NJ=7wwH@Gn5hRyplLJbxr~svpXDKr~U&I>xkR2~nr0g%2|rJdr_w-%7X`T&WB+ob#N z0g0Yt(momHc1->4z|V^_d6O*>%%a2$ax=w5vY0tmW?sNp0&WqCHjU=xlse7CX=twp z5_}zicKnFu+0rcwkmzWT_Jr{kHXdbo&YV~lvs#p2p~RDqRm$TszE!S#UJgk3hKtuC zP1y?^N-Rq*8No)+iDM&ohr_c5#wOtBlrZ7E z7Q1NYIfSpe z6?EZ8A1|}oh&0o$w5^M%;-ogWMz!8r@7u7M27& zb_1TmW<7X7jbl2&5XgHq26j* z7<&;vh2qAVSuETwL)=XX7M1{#}*-Qzd?w*JMec*#1Ved13 zU*&!?a%-)E$XtJML!e z75sJ)uDB=`cOr^e;cnh*9pq;^2RK02XvkRGiV!Ce zhw>B~Q?iqdTJbc>a2M+B8D@%$U~wq#7>b8*I*tFjkFnGEQ9TkI>Obv%#?Hr&{0S!T zav9vlbX#G}3~)k?j|0QXS{FGjBQ2P;mjcK-p z%|`qLq)la%Fafeo)&rNP;DeZ3!)4d=E5?c*MPG&=eZ1c?J;|t#H>Jd~6y<5u!!Fdr zGpL7WQ4hFzI-2^kr+8WP?LeLX0nNPx^-eMfJY{s_{04p<4gMSn{)_<+n34Wuq?PtZ zthwOVUWvGPhcH1I!Fj~!Zn9#0M)@HAgl?kO(<4tZb`n4PQ=Dv$&k1wHPV_4wTB4cJ zO|%ES-bJ4>nMOZIm!Und6_|-axph2^8(Q%5mJ(f7mH>AyUu3vJ{!TMdw>dGa<0X`Phb-^-D9Cx_SI?8tk7PC6Ey$NK zj@19S4jD7u4jDEIeckA9m9r+~A*z$HQTW;SGIn4O^1sl+7NVT(ifr$kpMG{myZzNZ z6bXLECFF9E;&q|@;n!Uzd2WcCDK3)5>9|P;g?S8QPy*UhsGpJUV~4m?ndk3EUyI*` zYk(iGWsX7^3)-L2-89z1#saThwo%bHjbQczkc0Sfp4Q8eY z*vo9}vXfCP{X{go=!ligfbMdh63eDScbNp)eeQ12mcc#j*ef`La}b6@0{$HKpTX{c zoxYfOQ%D|By-YuhwDHTAkn-LR^XK@bl_T$oR+e}qhS~PUvRLqz6mpq-3Cc_%^EBtq7V z4)xXdzm8Y_@MA{=B>UxWAaAhK7sK@~=z%Ds*qxUoiepjNOGFg(XPkvjgx0{Awyh`y}(aqYxcrw?;7QiqYIZe@k;Ky}dx8incy-MOaUzygE+c zTr++dHzIG2D99`HVKupX1kqAAOT; zQBp^U=IzY+59~4ffU&!gE|;T7kN0KN2h0xl0WbA3_9lMpLym@*n*-)s@jF2@Q+<>? z#f)xa)2%FB*}+m)Jjon${sI_|Lqr{1fN#PNI$DN1xEWM?fZ`Peyy>I^Z&l+osys z)RR^==|l`W_ed=A16@}ci8_jBBOr649}epe4}QVerTsv5nxlknfH{KIm?OwX+v0q1 z_O>|cOVmAng%X-3#j{CAMzC}D#zB8d08c`{hMqlQ&PbkLt}haur2kC;92vnz&W=qR zJ3rx)Stn!I1t((Jbi|*6_|zYcgWfx4j*X2}C@!*Xy2pejAkRVV@!!GBA@6fK-!dk4`lPZ_#Kq=kU4s!i9JSkPR}UrA9CaLAaB6U zWeenv5r?3MWT=oQ`8E?w90gGNTtk z1wp+MIg1BGL_@s@C?p^;2$}=a6-cJwA~<#-Gt)}S*&ME8W~P){S`JiJ=A%VLIpjb| zYB_{cYMFljbeF-bzGS3kH`?5SkJAc{OMd& zEE1HJC)Jn8!yiR{zV9=WwXtDsF!wm19q<8Tro3Jn1JXXw!xe3bHl@1ghBT$Rb3xr< zZ&8E2#R1&I8QP%kur37P9u9Tq&g-rK`c!u*ZSWpTTNSILyky$3O!S%7NY@$dZ-=p> z3|D#JIRW~K8~RBr^b=e8egb)r$9qCL#xlsrQRQpPd@=qW4ZwXW=1FnwlI}^xXI+{R zc=k0|!v>?x2cpdb(dPbW7hkk_57cQFUwZy(4IZ2VQnM zoSmhyu9F3XTt?4K$g4yx!mLOLr^FPAD3=&$|R5`6mJ~J+ik4 zN&feNVp@ocoY+swsV%UVJ^%ssx-0>u2~e}Du9%BK#sahr^;v|sMz{mQTUdmP`?d^> zy`hLxyiaX`Ilu<%60IS)pFtYZnucdLXb-yIZJB`k8O#sr9}(u`$b2yOx*M8a=h53a zyc6a!&jWalhP{C+=CW28i;kf-U(;Mg{ZEIidwAlxohm}S{~?)RCG{~O8(*XciF-9y z=^jm--vex!GEDglG>G~I&E2>U=xnfMURW#I1xWW_^o*3kWheKAIZvCndsU{??#i|m zuYsIo!9a3R+)w)CI)ke8cxQ1U`cxr}Sri26o5^V0TF6wMnDbGG^qfbzU#9pfF&@Td zpq?l`eyvibnr+W!<2qXZS}XPg(%#sfRi|N(3bNeqD&-!%99S>INY*VQ7Hf1O*60Mx zVNZzdlY%0s0v%Z(+TIWSp)KlFd`^_WpA)6qvvj0C9%)O@&!lzMrL#Ti-x2kXwG6s+ zUru9~+8_mOAl5DVzHy*bryl~zo#1|zyREo~Qa+R8&o~9D7mXVX2!qV-M-(!#PsB;j z#ph6;=bSM7|owF5r#;Stc9IsGW*i}c9RUld!!^+o1=quNz^7B2S< z(yxR}_7m2_U*RIj?g7bl$DB^_js=oS1(I$xkmjIp9tXuwPUYSL<;Q%AwO?J1G13?J zBL+ux&j1Itv&vRY<3y{4oaRJc&Ppn0iiXA92v85J>!%)E6Q~Y6&|mFq2vT>+7@+PL zFc8;1rjGT%?^@7Z&{@ipvb=jRPtbfwMDq`YZGub(lwHM`roRWoav7CL0B`9?UI00j zm7I*m1gRb-jFQrN7f5bGk|b}1#hUV>2hugmfE3qW?oS>q`6+#J9zocT7+z!E87r`F zTglo7tU_O2&8W=BQ09*i8C|bKy5v%Tu_Gke>p*fJbN@l^pC2vd?Qr>Z;^{i>jy5e5!5j;2Tl;OcV6WU|m>V&*| zig{;ID)uVU67wD@Cd*QQ^`Vk%LzpDn3?!XB+`na*l=qzBQuy}~QaGBPRfaIuekh)$ zPo}vF>&Ok_d5Jr0)#G}04V~7JA zQs=1df52JYCqbj`8qfxP(M9aXI<0v>?uN2@3~*vyYhJ~3mIbVnVIlL(ScLjmjQUt2 z)(7c4i?*~vIf$rlP+v_bG4HEJlo3Ui>J2=(6d>u6lTkB7(n$xBD+E&5AKc$sCxv?f zDZPn63O@@Z_q$FCr}W5qSo~HOOJ!2*Uqt^yeygK!*~w)~E>$%tZy01cSrJ(4*K}-} zAPYj6AV_(96G%=CIrS9^C-)YRQr!upGJeYCSAdiUFMs@jQw2D(0L=MbSaaH8Eu(eE znVv5UK1{6*Yf%EM;>=~{}PoU)Bflz(5xhvuDhWJes) zF^jyLkSD5tV|OX7qd;<9cwQ--oQEIo|8S4snc;@M?t#AEM(pbck;YtvQ$DLaMO9YI zk$ItAJ*2SBKynM)OZnIYBv%Kdvft+ZR9s7OiDT?Q9Oj&O%sB~|b4DZGWTcxYrdyA6 z%W)y;GIud5rUg&Q?0AM`T{HCdwszRRIAd>xdv=UP z`fY*sRTM5e;)pVkKb4A`wpTfyC_dBu<@smzYkqGE9J_umPKXj>&W_Io_Nsv3#21ExqM-Ge_tmHfx0eI z`RaY7{3Sdp1ug?pekq)s^xQCnX)%6`9T|HO@pzoluv0f4W8c;Vvm-Tw*e3@Dv%MKQ z{2ns|d*Y!O7op;wxC)7PMjToVV>3XSnbZf+ST(l%`4spBN8F1!nd^8sFc0Xsp)Ois zU+eNW|H_AOZZIvYH=#Qv>B!W8^A zZRu#>F6u~Ii;R9-CT>x>0Z`+IjhnnT^+*z%0)casADx-#k7y$%s_dg ztQ+jd$7=B`PNDZAWIE_|Q|JZ0fNP+atk4?|nE*YLLgqFX@k3^(kadKt*1IuHWuE`@ zod~I3{_~v(sUH6God|Js809hYzvVj-w^WJ6*%`xNQ$1e%Qb7`niw%uS2$1aazQ)4I ze!YcBU#ws%9GQ*I&nV8(4}a!aH-;@p?n}WSlo-Y_WAxYPMlmeqlU}V&>>2 z+56eYzl zJfCNfv?4QLI@vl0rXtf}hdqgnwT{ox!@kR-Ru8mD%x1v~4ViGYELOBtls9~H}yqt63BtFeZq+JdZzWMuVNG$M`PPp#rovy1fMjh|jv zZY^ghA-^G)>;PRCKLzHzbHlR9W`BO+lqB|5qckbMBrre`#MV+6eTyI@Bco9K9>EjJ z+#)Xx-!l;HINMvr!eGACBHZFKbb2wWnizelA&FWZd}0C2gAOg8I1!;bN~1w}EenGo z*i=J$R)dIfTg_q$M^$n9OsUyM=#l$>kYDUf@Um;2haHugQ;a%9j=mP-6uTtXIZhHORZ%U8eJSeX=jEXq5rzY|RF@%P zqe5aMWvkYou=oh7ahPq#CkTe+=VZ{ybvj=j9}yl!AAz7E4Pl}AjeQioUnPw|8jHgd zBg6bzIUf&^XgC-L!q*52aaJ2K!DFAc#B9{eGpv3MJTxG3?X1=Ju2I!O|#gGh4L+A0Ee@1-QXL_SV0`P@aHm_fFI zuA`oaUP$_QbAu!>6AnxM1r&J_J7pDT$VtpA!SD(%Wyi@Eo1TzQGZQXB<+GzCi^|WR zR9rBOf1d#p8(E3UuuhOI+VfQK?3+>um1Y@PXs}Mq!{-w)Z6S?x=~E|20Fxv3iZt&% zFu0#pWKozN-G3q>XO#3Y0x9Eo(m=A%)B@O@(ud+p8W=XLjB+B)v(hYp zn!Lh>Ap0ZBJDH1F0GRZ~GmvX0=H7-#IZ`qDwP1DT9*dC_*0LfheV)ESchL z8o+*kz!gbsO!HS@9J^A8V%-Q~J*W<(>~ll(*`!0cCp+wHH~AEODuk`J5~q_`eIbmM zV*yG>o4|rSn)?URO~_84#A6yJre@Y#uqYiCV-)Ay1bnw8q)1E)9DZ%4+{IGY#UW|% zBg3O<%)}^XSk&hpF$Qr_raVHj-&{g-s8v*GbZUWAi_i#B`Vs!VRbpPDI7?v>Cqwqo zdAQRWbdtgduF5gCi}|I#LqbO76=l{-{8BJSbjIanSubA>C`zePIibGsp&H55f}`<^;kM1QAI_emrpz!|>FlA&las zYYAI{C|*3S5oIpG)|^P*naleD$xpRU*M@RGIt-(0;y@(FPdFl?(Z%>j11aqsF3$yO zL6|`45v^!@itTE+cqfRw-WAWH9b5b3=K zqWs}CLNWX(kizjZs#rgAol*TN9mPfNLN6+@RCk2CxS#SwZVvZTp2^ksl=P`S$?f8P z$^*GM+)s5(E`|GDB`*`WUwrle+3g-ueEbnMtLA?G$eJzXe)+L?3ingpk_+Pgj*^$T zbAKo9uk0?xujT$y?(fX~#%@x$H}}_emHegLU(NmUW1%YUmmkYia{pbfzlr-Q{R`}%NG9m7XAtgKl+o|^{-m^7g+eIztEU7 zfvD}JQH5LG1(G-;|+$bF>dOMlEIJ!N!pP z%^Ce0lY3wn;7juZyMXp@%+&wAsQ;ID33=X7S*gWs(RyrHQp%^4cjh&^@r=Z**&t!r z>RNG&rkiOLaTD}ETz6ufmg`$W**!_32I$01R#h=45 zi(>}I6pmv#CUcDC7{O7;QQ)ZM=*H2Gqnab*cvmN-f1BeCj`bWbalF8>j$pC3pvi=XyjPHF@<9?#{`ZM90iVAj`rB(s}!wk;_IWYLPo5{ zB$dDQuKyW)hC6xvzK0Dxr9*k4w3T@xxv@Z!)nAqLV&fA?{9kslVgJ4BD|vm?bENwb zWoDZ5cZ9-YpfMo2pIZXLu~jlVy_S;0uWROhCNYvfxK1r3^N~6oE^YR?O(^uFXUw{ggs2DW4e<%Z(>8i$iLcq} zGx#N=Lb<`oL_>B?kxthb$Ai+7;t9!=6Ma|=&6Z342?1GcHrzZzl#S-}Mh)?alw*p- z$02ozk>(fr_zj7S44Ysf?VC7(9^315LlGVoIg~Ww!()aA2H-ayovv?UUxWyPj}W38 zMfF7w_2?mBg!ubFU_i6g^nmwP3l=^~*hRQ!?kWE6Hbucx@=Ut%kG zeoP$swEdTHG+Pg-?S>zx9@2izJtzN%5Io^?pk3hUT+thNh@ORWNp$Y$AShzIiqW~D%b;Y)>w%7Ll3aOCiq1>r zfWn|dI1>~Ap5EWS(GK4wor=+b2lDP9ic<>=;=B%+%=r{xDd#JIH$lA+55vRzo*?4s zo%9dzu-*xA(mU(NKolpvw|<-R^uvfdNK6YTzlTfs$|Fbv<*fp?_mSe%0*8ah&O$CMCU09^Sj|56FlJwkPdu3Fb+S|xTT{$feU*epHuM8A8;?I0z92f_^Bt(XyD8S zon5f&#oGwji}Q32AsSQ-omgNBHsw3O7XX)ns4OO63%qYlJiUi~7_=1mr1!Effv7&~ zfn5bjht7R0@I#&8Yz&?Cr~zF9PiIAZaEo~iya0R!6oj(SyW!LOVo!`X>3#5(AT4+k z@KX@IqpN)XUHP6ny#s#}RD<{63EScawFBS@pXv|W3g9b%X+davaAwH1UmwaGr|rThJ!(gq5NA4Glcuub@)!bk=KdB+6Wjbb-krFV(d<4M@NmPWr%Pkf;xw#(6q_*JTWJaK?|$?TrAD4xOjV1?eECb9?i+yaMnQ0z>V zh#SG{z!TP`qECX?rZKh}R&$KtbbFBHEXt-oTSR$yK0a@Fw6c5cQ=h;4#kE0?BsdQs@w7fk=nW8vFvP zhP)nVH&v38&Bs+BJLs5zySSX}K_25g*>fB-4e>&U>^qi%C{81A^bGJ>kORlh#C$?J zz#SkHc+E4I^Ffv1$yVbL5M5gh3^Zblf!6__0f}(}Rb^P?Cg57&KoH4wz!yN&E)~FK z<>-^pF#&ggNT&*T3`G627HE7HYYgcCyU)U$0G`eO$o3WqkAU_-PIw8l2|S_AbEre` z8lXRj;#AsGBwLG1K=sfe+ybfvUkU6#TiQS9fRjOVtr58Vc}cFcu}C%;G4{a|js;PDrT_~;V*cl&eP2P|QXvO^0usk8u>Y%)jt=Os06cUwK-pd* zq0K_{AIJ%PK|1gPFdRhj#{%`7F96O1iERyhlk=58*={1?n~ShFLp+4-7o+cir!#8X zK-J(YffJU{JdQjAcY)Mts2{?mn7biY+BYOShdV$K&>_rOhP?~;0^oKK<);d$S}yS# z;B%l-=u`mbyapm3cwz=zQA00m&LNcbzr2YfxS^IBXBp6nGy5|4Pu zR$(^h3xK}sq;v(~MvxKumB5ho=vUxlfoC~i4;->V>W4aDE{O760Nld)YGCV)s9#*G z1!jY&-xdJ(alQ(;@^$Rxpko5Qz6pCgN*DMgi1Mj<1M4Y>;;#UH%K2(w@n$K`+P83K zZY$b21AQB~a2xt9_6% zKu*{ZltVheGSEWs6+rb)^iS|)%dk6$@~^a8NHz`ozenr6N<^5%WP89X?G2K>!qL0X zj(W5yu;*^HHF&~s&<*Iv0_{J*x&XNbID0SVeeg!I3z`mI zX%nz>71{`7H&G?x9`Ki-LwEvI4ZarG>HyjTI%ET|2S^KE02YD7`xM~EoUaBh{sei0 zP9?AgR0`hoDeQ-UjNr*8pz1T;)xw1&}y4fwH|n!o#5H z&>{Q*lm)&XIOHEv-gLk}52HMglTAN25cLhR=NHNOSm0d{#ZNEXg@bCLPd5EBL8Na2 zUIUR$Kf>B-^mFipR$nnBjIsdNfM|`b1m6AzeH}dgFrfvB=>jW3DWn7Z`8)JO@b$ng zN72Vf4wUWVDQ)9TK8C&L35=I)*w_O4fdue`@gOaDrF}cHeYfNc<`BpUuh(ME1kZlJ zyab~13czt^(Z?V!0CuWF+kscwrt^iY0^|jIaD;n6PT*^S|M&^z0#A16E)kEqss{$2 zllr964jtK}I}9p?zV>I_vw$cMM&M1533B!e#yd!?E1+zLj?j1!`GgK(%q8qU!N&sK zE~EY@Ax_``5M8UZ7e{vGHh{vQLr8Yvx`9{Pha>xO@z; z2)ne#8BXwo{Xy>Fb-)cE1L**tY@=ecz$@*Vk^Qsd?kaWwa>9Dh4)BCMJ<$GCS3vn( zGvR9>H}nC*??E?aLLb<#Ja$_QXz|U0;UiF!`KG? z2%rX-0(1wK0s*2UeY%2LsG=FUE##Y;k&}Ma1LRmPj0hH;9KSu7dRYim%EiQam{N`* z*x;0ME#$f%uogLE-!BEQu~$@VFtla=3ixxZ8~t|IRBV(Y+?LT-yXo8LQTS@>P!=6O zEWwIrgz`!*1SDs{3cT{2fX?vW0H=4{|98K-R_lkd7Re%u_w8$)j+j6X1<`pVB}FKL`am z4Rnbn4*eH%IQA?&q-h$lVj7edtfPxsq$4|w3o&2hr?_M}VTy%c87A`>Z)VrX@(9S~ zc93NdiMo_m%WtOBJ2vF>@0XmO{=`={Q>ff2gohI!QPOznp#Ba zV}N1gqcoU>oa&3@mfw2M;BrD)N4%b?#Ac%Uq&gu-arb68g@nV3{=SBsw4|gY(p5Sd zKT5xnUy2B1e>Hd?g`ecObz)l{a{Vl>KMVPg6zkD=SpS=vk--FT;y_5TVN^7u#( zOFNrx5oc60d3acy#}xY1Uo3S?kzTSzeOT%|$iK9i_(*q;g&bQ%G2JSQvdHmT_HT`% z4rCn}a}d`aMSk)1A-sYjzlxKTgkUi(r=aVl%6Dhv{^lGM9c%V-5BicE=F0Y!;I*hY zeR^?Wk-qUjvYfU9oB3!KP7lYX(i!!}K4`;Mdf==uLK@?0!&1Y=xH9qXl-Yse#_Kff z{1><`PM@1^&_}1HXVDv0JpbXo% zh_IX-WRs3ciyzf)7?-x}(bENnEJ{QnTey_6gj2c=adcpp=Y&NLD>eIOHx6`$6o?0a zsYngiYuIb|5hsFjveU)nA~WQ+Y02hIMHs!?m6JL}G+NMbT}w8<7-6WYjN){Ic^JO@ z(h*_N6Eh{bT;>k!8;>UWYWy~NL%uGdPusB9Zd2M(QBq!El907yj&n(-{IogV2osNr z%Xzk8_c!GX%Sp{FYHXkO?B#Eoq|3i~Zr;8={nA2;it=#`-JqA!#eNQZhLRBlX)$^| ztP!N)jVUUR4*Bt7n-4dMx8a-VfdO*4+q1PDn&{ymD`i}nek=C%s|8d*eGwfBHY-cBrcKdCM}|dd@kw|( ze69`j6$D?QZ(x8n)u2t%XJ|tT3blSg_&=~;;K06tT7N<4@8HV%RdyMcl;lb`u{KFb zG^dcGx~6$AO!SHSTCqUG(X`&-wPb0?@B$mrotOqI=t!r{U&^k$c1ZqXr4`v3G3pT_c zCw&?dvObLknWuGE=BZB-AI$6<;?ZFzY_GOQ&G0%`=+hcb`c$_x{}T_(!421ju@{+r z7{1f;PhLy?kJfA{KiEqnQL6II(-a8>oCm`Q6Sp$(B7g7 zMC(88i)gPx`x$aHE>b|HpcSAhP#p-5R9Fzm2-*YE;JOUT6nD0`Q;NsEQaB^KAOXmi z)D`csgbRQU8_^wHqc5pO=5j5v!x`OwjdR}|uke1xSUWl4_rtXLPsC#N5V zSc=5!v!UClh3CJBr3jK#g0jUU_=bdG`MTk~rzYgn#dsh()=wX9by zdRsASPHNv6@VRJLYA15kCjEHJguzcwDN+$8*Dl2-^R=d)(C4P*OwpF+=HwL(@-8mS8(5T{rO!<*>YbaNUYK8$Khe-TJwJC~YEiE5WIt~$ ztYleU18xk8578V&ZJUN*&|MCC7RUcKZ=o(g5OelBV zVPoH8cEs#kFz;?Y}x^Qg+!cA4`2hXeGVZJty3 z@@ulmTj>OGUSmCDLW9RH(1n5>T|0&93k}&5`MrfUUSBvl8@7qGVcCaiXbBzLISYM-AR$l?-I#XHe&p@v-?!g@ zegnn`iRR^fRCq)xgjdr-bc;1i>8_13Wcd1Z5;{m(Y}=rgq1VP|XOdAVWKbwut*lv9 z3uayR5^DDatFkio>8{;fQ?@yteI;A}{mhpxzjAK#)qUSyzL#6m>zS_#O8)4wENRE7 zA;PYcoqx%CsqEFez9U}gH%oi%#N+SpxO?uzoNL-oI=^Z^e38lCYvYuCZ%1{wdv$JJ z!q?eru0|~w7;v?eG<}YLZ@+*5Wu>CKTB9~6zq8_s>uS&6dI!9^FuW+> z2rj?G~P+>umSqxZ=qZg^oAQl+W$6_xf6={T;qv?Y4G#VgKmL zl86hB53&Cu(WBR|=WKm`*memc>Hw&>G@>-a_j@cl^HSWf&|BZr4zn)?nqRG7F04*h@g+VAO zt%gyKu~Dw_R@Mp)j&fBi%$N8=ZMjOt-Z=Em`ol-G+Z<-Ru;uyU`W-P>&wSWwe`f05 zbs1hKKDcwJ@0+uP7m{bb`2D0)fvZ~W|LRidwUUi9^Mm&<*yj9x){UHnhxW$xeludw z&3C^YH^I|t_3wQqbzFaI-SUm?4_f{3OjO+2mMNEXUNd()pC0nrjx*2ioiOz&KVR!* zWv-isYrpU-a!%@fq%@%KqSnh=?>?Q?XY;wUAI*KS$H((JKRWW>CRL_6w@n?tED0rxz9YV(?-1%*+!fz2-)B2o17M>VY&DngUGzvjxSd zR$k4=wX&=5VNFW`hP9L6Am_r`uE}8bAte_zR)h5(LOXc@v37Mzhz~(W3+nCHyI)^r z`}1-9_@q0(B!3j<<@dsrWjz<~FW;j2&MWFj<=o`FGj`qAjX!v3f$Mp7ob#{4yY^v0 zm35ylh*@6aoz~{okp7)V7Wf&j&I@{e`-KZj*u5_k7svQ~{YKZAsaxMm4Y}Uqi}Rl! zAAjnDp3e>5xpL?6ACm6x+wsZFn_oJus$X)i=QoeVd3pwQy*1=T5(~fpH}EdLI>A&cmi6OFRip#p$iN0rALZ>e8zEf zb;M)d$e8f(IBYWI>#QGm-CvI8FE_MNfBb%n9xv@Za>=^;P7j|?w!iQ5j4AWGT1WOv z*JrN0cPHaObdR~mx@~?U^~b)8H6^1SIrH>(-x-0pNe<#Do4%j5`V)kv;OlVfuGKw{Px8; znpgWJ|M|)0U$=b__VnIQ1}z`G=;*wc58Zt6*6A58yUskBo4&_?PA7+c+x+LASocO- z7tbLp4%mf1lW<|1-MUF%hinbgrk{JH?vv8Ci>}An2G%TEJ89ns^Oj#*9QVDrDOAoRK;1>fVp}Xg)5KeJ424 z*brA+E8Is7CSNBtR#^e7tf|lJ-ii^~WStGgaZ$d(;KPx2Nf?gqLfeMnXsy^ewiTPa zgIe8Aa1&Z0?Z$0pTWc#@BMykj*I{zO)FODxeoQWHm6J6CN8j{|JNuH$ z>GrY?!mP@ft!v)+;{KSgHy%5&Ts3IxW0#BnF}=s?lV5~k9N)(-_dFlV z&Oi68uQ}Fzj=O&g`|-;s&#}m{@VBgTO_x?7NV&8onGfU#F0Flp-ZXNpUAz3%(n`HU zU-*{;@}1aj5vRV%nmWrpY+~`anFn^QPVaJmQ0R*3Ee8;iVC-$4rVs7}o$uVc*jcd!aE4R)W zyVma3Pr{um-uTP$j-QRy*8_+UR%5QrGEETpBwj7i`9cBo!!5< z>fYg$JG%3>rm%};PvmXraqZo?nr@fppR_T}j$Jx9pv6 z7v{I!5_~p3f5bQaR_@Ht=&*fpuMY;DpK>vG>YcXdy1cdR*JbhV>3S{NHD&X?nz%Q+ z8)go@G@#?!r`nzy{ee%`F=h=(GdicKBBhQ{UwtM#Vt_w0< zhy8JA*U}K{!>>K@WQ%#vY|6jx8SCledoBB=9Pe8n9BRAhvXh}ItK|5_WogfUSX6QQ z1;f-w-dwkI+LE_#&F}tnv~RIzM97KyozB{X?@CNd%G0y|wEuE$eennOuN}YRlGtT= zs{g*JR+ZCc?_2xvJnvqmU-g^3=hdRIcXpqPYUA+8;kvJD0(>KNZGu~+O!fJ6!^B?~ ze_3#G@cA3gGf#dsecj}zvp-xha=6g1^V@5;wNDG~dHm(gJ#42PbKgF8+K($YALyW#V(`j)E8fW=KPlf_f`gO zt?jX9b^Y9!n(h^cuBNxDUFy~8@axHI2JSvOBBXH0tv7~mtXQ|g*DYld#y|Gx3i$cQs{bH2(xGp{Hi|NOESoJR)78gB;7S@_N?U!6Xm zR{hnyIkQ$3F1hJFhHvDFI&I!`e$9*?~V(9 zWAYZ;O*`#0Cg-s8eV5w3wCs%zKg2xebfou+uRohKW9YkUx}O+2H)KxG;?`%Y291BS zZDz2|m&3xWD4eO`X;9&-@=RKUMeQo9Eu~8$R&J<~8LitQ@L88tdQ2 zuUv(jJk0tgt;cjm8~uLx-^Tb8PU~s?d=dLR$E>!hW&8 z5a8e6FHqCa=FEEUw}iK* zXRoUq99@z%?dRB27iP46<){5G_WR-P_1^}?1l~FN!`NM?S`M7}2mAfm4Z@V%F}G*- zJJxGS_BpF;Vc;(w^%+bwh~#(75Qg+r|Gh+ri_DvJp8Sm4|;ceep`?KYv~8 z{&m{7EoNRb?Xg{SclEs#cecdo=D6?U9oKFC{qUl?k{R9y{~WXH^vw<y;Lp^}3@|_nqw$Zj~$_{j|f5>zOlO`_%QofpIgRDfb`gH+8|j Q*tHvvXHWB-a@gnp03#0BEC2ui literal 0 HcmV?d00001 diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/License.txt b/PL2303-Prolific-DriverInstaller-v1.5.0/License.txt new file mode 100644 index 0000000..c75f9e3 --- /dev/null +++ b/PL2303-Prolific-DriverInstaller-v1.5.0/License.txt @@ -0,0 +1,32 @@ +End User License Agreement ("EULA") + +Do not install or use the software until you have read and accepted all of the license terms. Permission to use the software is conditional upon your agreeing to the license terms. Installation or use of the software by you will be deemed to be acceptance of the license terms. Acceptance will bind you to the license terms in a legally enforceable contract with Prolific Technology Inc. + +* SOFTWARE LICENSE AND LIMITED WARRANTY +This is an agreement between you, the end user, and Prolific Technology Inc. ("Prolific"). By using this software, you agree to become bound by the terms of this agreement. + +IF YOU DO NOT AGREE TO THE TERMS OF THIS AGREEMENT, DO NOT USE THIS SOFTWARE AND PLEASE PROMPTLY REMOVE IT FROM YOUR COMPUTER. + +* GRANT OF LICENSE +Prolific, as licensor, grants to you, the licensee, a non-exclusive right to install One Button Utility (hereinafter the "SOFTWARE") on one computer and use the SOFTWARE in accordance with the terms contained in this license. You may not rent, lease, sublicense, modify, alter, reverse engineer, disassemble, decompile, or create any derivative work of the SOFTWARE, or remove any copyright notice or proprietary legend contained in the Software. You may also not reproduce the SOFTWARE unless for backup purpose and limited to one copy only. Except for the Software marked "Not for Resale" or the like, you may transfer the Software on a permanent basis to another person or entity accompanying the Documentation and the license agreement, provided that you retain no copies of the Software and the transferee agrees to the terms of this agreement. Such transfer will cause an automatic termination of this Agreement between you and Prolific. + +* OWNERSHIP OF SOFTWARE +The Software is protected by copyright and other intellectual property laws and treaties. Prolific retains the copyright, title and ownership of the SOFTWARE and the written materials ("Documentation") regardless of the form or media in or on which the original and other copies may exist. + +* LIMITED WARRANTY +Prolific warrants the media on which the SOFTWARE is furnished to be free of defects in material and workmanship, under normal use, for a period of fifteen (15) days following the date of delivery to you. If there is defect in the media, Prolific's sole liability shall be to replace the defective media which has been returned to Prolific or the supplier. In the event that Prolific is unable to replace defective media, Prolific shall at its sole discretion replace with the newer version of the same software. + +THIS SOFTWARE AND ACCOMPANYING DOCUMENTATAION (INCLUDING INSTRUCTIONS FOR USE) ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. FURTHER, PROLIFIC DOES NOT WARRANT, GUARANTEE, OR MAKE ANY REPRESENTATIONS REGARDING THE USE, OR THE RESULTS OF USE, OF THE SOFTWARE OR DOCUMENTATION IN TERMS OF CORRECTNESS, ACCURACY, RELIABILITY, CURRENTNESS, OR OTHERWISE. THE ENTIRE RISK AS TO THE RESULTS AND PERFORMANCE OF THE SOFTWARE IS ASSUMED BY YOU. IF THE SOFTWARE OR DOCUMENTATION IS DEFECTIVE, YOU, NOT PROLIFIC OR ITS DEALERS, DISTRIBUTORS, AGENTS, OR EMPLOYEES, SHALL ASSUME THE ENTIRE COST OF ALL NECESSARY SERVICE, REPAIR OR CORRECTION. + +PROLIFIC DISCLAIMS ALL OTHER WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT, REGARDLESS OF WHETHER IT IS MADE BY PROLIFIC, ON THIS PROLIFIC PRODUCT. PROLIFIC DOES NOT WARRANT THAT THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE. NO ORAL OR WRITTEN INFORMATION OR ADVICE GIVEN BY PROLIFIC, ITS DEALERS, DISTRIBUTORS, AGENTS OR EMPLOYEES SHALL CREATE A WARRANTY OR IN ANY WAY INCREASE THE SCOPE OF THIS WARRANTY AND YOU MAY NOT RELY ON ANY SUCH INFORMATION OR ADVICE. + +NEITHER PROLIFIC NOR ANYONE ELSE WHO HAS BEEN INVOLVED IN THE CREATION, PRODUCTION OR DELIVERY OF THIS PRODUCT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL OR INCIDENTAL DAMAGES (INCLUDING DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF DATA, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OR INABILITY TO USE SUCH PRODUCT EVEN IF PROLIFIC HAS BEEN ADVISED OF THE POSSBILITY OF SUCH DAMAGES. + +Should any other warranties be found to exist, such warranties shall be limited in duration to fifteen (15) days following the date of delivery to you. In no event will Prolific's liability for any damages to you or any other person exceed the amount paid for the license to use the SOFTWARE. + +Upon termination of this Agreement, you should destroy the Software and the Documentation and all the copies thereof and remove and delete the Software from your hard-disk or other storage device. + +This agreement constitutes the entire agreement between you and Prolific Technology Inc. This agreement shall be governed and construed in accordance with the laws of Taiwan and shall benefit Prolific, its successors and assigns. + +Any claim or dispute between you and Prolific or against any agent, employee, successor or assign of Prolific, whether related to this agreement or otherwise, and any claim or dispute related to this agreement or the relationship or duties contemplated under this agreement, including the validity of this arbitration clause, shall be resolved in Taipei, Taiwan, pursuant to the Taiwan Arbitration Act. + diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/SetupEx.dll b/PL2303-Prolific-DriverInstaller-v1.5.0/SetupEx.dll new file mode 100644 index 0000000000000000000000000000000000000000..32500a5d437a29dff90d3b22b51b87f29625cf80 GIT binary patch literal 73728 zcmeFae|%KcwKqJInItD+k{Kj{paG%`hz1lL(1alxNG1eGaKexYBP3u8I7Czo=K!`O zOgstA$zhbIwY~P1w$j*M`{>i_Z7pJJal*s|6gB)%v7kmxb;qF^Bu#>eInQ_PGx-6w z_r34?&-;(?nX`Ydz4qFBt-bf!Ywr}_z0Y7W7z}3oG|gZ*1egBh^6!8DVMtD%_NQdS z^9iqCd&pSy`n9Y4o3~|bt$Og@s(bFw`0hOqJn*2H@tutsRnh|)n;*!?zsr+x|AQMg z-jtM-Xpe%P+B4ymyMJ8$li^>r$MBOvgsVNapBUl(^xrdn;^FDLesU*|pYW6KaX0=a zYq)ESy0P3{x%s<(f^{Y4ZkNGOWQ;WoCQe*FoYrB8xptgUFc_Xh%vL?Ndm3CDe$Vl+ zjr$QM`p~~&*D%+}^S$|n(GbH^kcrCChr3ay-C+0*Vqa=A7&h=^qoHsF2t`EyWf%?p zK;{4G-_h_Dee;~bum!06tA96%8+VFG{Na9l2(KrjE}Y?i83x1po2oY4Bi;jC5#Vi~ z8+G9f|I0t78DgT&%xdy}HF~M)W-%{XP3Vcg}Zz=FC1-_-gw-or60^d^LTMB$jfp01B z|A7LBXsdO^VmKcCS9|^mL>$1@&gN)Q>g!5<2d`%ID?_Kg-VBqfx)dkFQA4|cxHsW>hpHm;<3jxO{)({X%&D+34kJUC{*T% z+2E(hV7^_bG`Lw6QYzPa+20ck2Dv4rJ|vo24F>;n|7EawgGF|W|7rM2wA2l7yAl1Y7TbJHsEV<`zJ#yP-y^Ovr7EX4+OM#fbisXj!-!eAfTwfA(1FX z^@TlzV){xIpmnqXCBu#4StXT*l_36H+B<8hW+MI+fxg}Kz0xuiNI}-LF%`}&S*g9l zQ)d%6AU}_gF0$K7O1)nHOQ69@CEq?vOSNz?DizmGsYUjb5;%K#8y%tg-ikHr(6i-0 z^aGGQifHY53!shChiHj1)Sak_8s<^=b8>luqTQBxp>cdeO0wK+tUD?7lm&O$Q{*MkMRqq$V8)LYow;dNg7RE;TgTh?pm(KFXTetX{Y*yLz;_E9T;_K`YBjPGa>a zh)krCKQwVVUwleSrCz8HtrI6#I6`ZH9N~yoOy;d1^uuVg5N#=kKTc?MVUvw zNnQ2Ji@#Qnf}8~U;#2DUbX4Qk-Uf0-l{b~J2jYnR1dQg{V83tHpW2R!8eqgw#6wYB(McrpRP4WVU-9XNUQ2 z!D~_vkPvhR@C5hT*CI=l=lDoayPX$Dh5~^@^~tKu|(C_0bWKE>nl0K!5yTCf4hC1u3*MFdLcdJLQT572?ZI=dT@ zly5bSvGm`Q)O!nfq!Ze!>~@_qJjl2n8Qc(w#1KRVYyHmw0a@+Hheja>RFQ6v$8RGj zsBoTMA(spUO6}HCN!mCsN*jS5MABYf#xGC-G;%h3i4O=2>zcd+8@iD-jOY~cw(Kc> zgv6V&r)(j2CaO$XskMU~DbBDs30P#5U=&j(YCps?<%3*s?y{#@ANd$VzkD5X3&_L; z9vV!&7jj;#fLx+cv;^VW7T%3f@s0T=AJiG;$6SQeI(s1;YIA1$@W3H~?d46wCpH zYEC}<{^t?x)!y+xNp2JMCIXN10QHmhP80Q!nnNSkA3!{Y5Q%>OYWUsSI~W}_ot3b^ zeWhu7hR5xs)#Vv5FCqUd1l=rUFq(laLr2Rkc3=^YM%jS|+tEks0&D$mX|&EKIj74# zqCX@N#sp+ubp9Qce5v_BLQN{9Zw^T<#iphfA*2+V)g(80+(KjODjs8LaFg)F;Cknu zz#bz{Q|A%9q%0~0cnf)Hz{@3%TR_JME0sbErd-T|AnrQqiQmD4Spr|0YRvT^uX>@i zz+#ZT%PJ;7I1~tK;T9!XE%YlZ%xbbTDeV)m$W?06yuV@UD%>i?vt}s7l{mG)?2OIo zMB+phg+|f^_8m+_N`V=%y}4Usq!hVuYYeI|MiNy4kaNwH*jj;ARH=GiKA+<8YLd-y zHduUKDIa8;u<}x+?(7Odnx;t>O%m9zCK(J_<^4XNwQdj5y|_odXY1FIYPDE!z9!9L zbCC`q%sos{M)CP#cLNej$d#} zOtl{Ts<}fL*Ou+FNU6a^n&KLaBxRQmMobiAQi=x`EjT5G0d3s~IMp>+vF2E~(x8cU z3;ozFKpRpn%$tH3`fE{iiP zWwHviU~G%NNR76rhfwI&Th#RuN@S%;Xy|CP>Jqx1LcCX%1c=62Y{C_wp898?BHPN` z>JZzEyo%I+gR9@m%HcP;`m?6`d}2YSWO4TIxU+H6f>Ua-rJ+<4$8+N4W~C%caf`Cj zlcg`RCX2UN4;E``>G{T@@lygHnwJ#R9TVfSripP&3bLk2e;JFXBeaevI5tXci$umy z^!J?mEMaF7E%~LGi{Y*hfYY!zJr2=qfv7gupAJVch(ix?rh zoy~2o^Gne`io_JDLn-duVNzV3nv@cBbzsn7h`6;<0qd%D$HHD!vu1R0RqoKY zO5puUgEWrkT7_JZ_tgTMT4PaM7BIKsvVnua47HzXyJ_M8EXu`e1bu4XGz5qj2b+W* zinXcj%^wM-6O~3K)rOd+6nvDVH2UUP@MT3fxT_Cg)Nexz*bi~!hxsCrJ%;G6^%T`` zGc76HsH7jzKl(QMD;mBxx^CK@m5;=b6Wsw(=Dj! zlKQ1uE+7%Z1p6vWb}Da0-79FGym8Rr>=t9?p&03=1IHovQLj+u^=R$LEmwCMtaU%3 zvEcQvH?YPh5Ln~O(Wrm#=27yHQL>{eGRm+O*n>C>9S{2j@(+WIqZl-*m#Q*JGYMV| z(ox8CtzMBhemL_;{cWy6qO|Jjj7)(LR0TD`UBb4ZyM4Z}x{*cG9U*oEabaxO1ta>R z@>Yxj(QXEB)AGy0{thTUkY&zOSU-!`$;>QHl39{yDHKhPQ23A;i;M7~tN7Q9xhH&R zJo!DP-m=@(F&<=T}AntaB1*a`vw51J)e#hp1yc_MX7%R6?)2ot~$52 z-HeqJy1PE~G8MPheF17aLJf7XPXPT~XIoWIqpPtl)LKvB3^6lUu38TswH`D%kM5Y5 z*_`VRKAuELl^H8p8maFt)F>j_liE(>x1?n)!Z{v)@ej~F{sVlCvSh0`Mc%!|fQ9@HKR8CH%wPf7PWaST=0oOiWfBvz z5GL+H7DeiG&gTo6+c3bd#!Ao6yHB##4$;WK;*Tx74*3sICS{3V<+)J|SvMeSbR07b z2t(viRq8|qZ{CIi`b1&#pl5=`-E40!I&)}9nXQyF+txy5X(*v{qwZ z(}>=LoV8jP_umb_^@TP}4k8dF>B2WOF6J&9<^yZp4anptRt)B)d);htKPo)A7y~=I zlquggE88sAJ^iR6Q2jZ;zX@MZ`l2zp?wGai2m;oF1)BBXv9901KL*SI*5Yb$C&1iy zY%V6#;D5QPgQU*Ljg1Ayx{x@_dhibG!B7MQ>u3xtM52)IoC0XZCC>ispQ+VCK|$aS zgLDFYrnx%gRza@rFatnUm)Zur+VV(0V_-74urf}`vjp>OK_wq>?%t%{vS^bscTsNc zGU=jvk#!mg?o#QJnrCJ=p#(rG z9wA~8C|Wp(g*yg+4~7qheTsi;3x@r&OmK8@hsK_U zRzU4ns?V{{(2wdmKYE$TT-XcFJhQc~jEJ8B24?0A;({}zu_-|0iw(dC3_vO#c{&6< z3bvr2&!@OLXp=KY>C!oEyMKfy#;XPX9GxrNY$kD)QsMVt+l9{8-svsa8e^^h48?k5 zi5HF5`u7k3Km6M~WaSK(XKvb$_NjS7)05n_G(82^5uzEZKeiegqM|&g-7Kzsh|Y~L zo{~eOr#h*zC@sCAVeUti(4{AkkgbM{N+aRY(2(^prG27t9vwk@0_WWk#P6RUzj?9qzH7TQZKyR*x-A<)g7@|gB;zi8z#ttmmJ6H@B4PiNF zHmx|Nt17={UYfGnVkrVxLHyHfgw>o)-9w9Z$KRc=l!*`Ktp5z+#joyp4sp&`#ER@$ z(%tHwLwaZuLKEDqc?!7jAeCYs2xy;A-Shlq8J--?@Fh{%ryV4CtYI|18eS?G(hKGT za<00k1)(`KD&1@?GN^lw!~b#spUgHlTgs!_qah~;7D9;4g%|77;NjB`T(vczi!9i>;mzYPR zPf)bnW?L>D^RgBS@QF7{zcPKOK@*@;4eK2fHp)8DMgoM&NFX#C05%ow^4jm~*d(Z? zXeRmlg9b4XTsa&L+lr+#>K<&|tw9HHXv$Y%?ka z8(+py&B)q(GZmFO`Ie=`<8|}~U4sRVvu>SbH8*Yh^fJHu52)z5d3>$!6O)k?mnXN)a-OOBm>9Aj4B5}OmROh1 z22$$$T>z!M4N_fufEMcDYH^ZVPt@M#OLajF^n*_$GyQ%*k5*3Fr|E1NnuMZP`&T0c z6MjB`A)JU6s(@8CHifh?tbi(jsmSUJ|G%qt@LyDWih7c&-TB{FtEC2j5L7AAYPD2q zE#L25qs?#c2CeQRwAAjA40V(N<7b2z6G4nKlyec~)Y|1FzMnZj)FWagV{&gmAvuX+ zw60%Z^M&E_91Wka9h1u_(a`yre%cDwc7Fh~au`udu#nT|6PHCP*n*9SaDav& z{Mz;{>7vfV~e4d(&kff)`!l}GjL4Vr#wux@|xH?JWOacQ6y_a z7?V4%jBUArPoo?Ck=ev59N-k&j3^BmTQPxnhC;X z+ydoBB%W)4vk0UN&CUX4ks_WUeNMZ>$9`lql`^D6bUd{u&V^!;&wzU8|V zX{S;xZrc0fClTJXH~2Vr%C~OX>)Ntu??(Toz4vd}|5*JKh*tmjEWiZo>8sT5M@*aR zj1j9z<&XO)Id`zqt<>*@H|Pq`DgWLG*72@@;%X1NaPVot_7=*hkRt6>T&K0vr=Ft& z6*`rA6273T9YbnAeCS#WpFv~T0<4UDek!D;K7l0UcpQ!zqy{-&uVCX*MeQq3BgA)b z+I*q{``_60La`;9%C(Nl7}f)=kgvR}14EcJ_>N;v^Xqe|E3R53Uz$^OAz1i#`O^3u zmdd2nVb%QlJS2r<^Dzu6lYP#k*Mz1w%ON4mE}>U|Til^1APvGi>XYH9{d$xI0_#%} zSVeZBL=jjJe#|5+1Xr0`F?y84b+XuUmSIZ;%Zp>$m%qcgI+U$n7#m%duMui9X2pwU zXyIejwn3;iQG#^0ea+}sgJ^Fw(m8xcT%kuuU(jCK5Iq=BO*MQ;PErpKO=;&&>~ZeQILe(lEpYZf7TXU; zbs3t@bJyI|4L9f#ng%Ic-vJ@l7Mle>vA_XJY&ws@*B0A>Z-UtnYK!fJk0d?kL#6%< ziX1Rwc2Mfi!K-sX(_EBX7E1`fv9tXoI@E55bZ{mNqPJP`!aTjDlg1R z^&o~5jvJc0;x}2p2t|bGK-jm*x*IXOm)Pi&L7%zw$)%5*KI`eTHOTieOQm)dkp5O4 z)y5E5m+(`lK)%ZSO8(SJ4&?kowb-VfkU!e3l=e7Z6|c&CwZzRxQ7yL!$gh_6;5fi# za@jJED6W1-NUiS2In>4fjkL&3eIH=MqEvTNG%)U_=x&@&siij4(aiRhl{j~-;jkaf8kY^0mI_s?6Qi**#x2cekJ|LLt`aYix)VHaX`@ZALA#Bg zKHbi4#r6{dDPk>QJ;)3%Cj8S%{E3;6tYK}Ld1r!}Xgz3Lq$Gw{vcnj1zOV{6TT(ZgIJ4c zSkMyPFLb#8BXH*oYkg+|X$}we6=H;VVj0|nN) zAMnspF;N~UlD;$K`ZBT;rci-Px8X>1NlYMXo|L4y4nfZ(9ap6G$eO?inj$Wt(GQ6ZXR-7jNB*>_{C}Rz!s`uhiDsenIaQ| zON@c6E#hxb-H>Y_5;s)*DK=gR}%6(`68-xrfXa_R#UZGt1? za7wAU%|`UX~vO)Jn*3PF_W2;pR=%?08ne) zCzz%yH>`G^vDT#^&iZH)(&d4BYqI2l&Ehpcz*_$mrZ;MZS`9@UgQl*_1ZYsNspW(6 zz#MBmc5a4NSC_HtFg%X4*aXj!5>(f@R>PdUNF0Kh(s-@7CyMPYz!s>=)u#=TSuXB@ zRuqTTOQ@TRd%*LBjjlnp_#BkB4d!t{*Gq12qC3wMtUec%o@c-0doqR2I22i*W+s7C5#Ex&}dlT8pNoJTIfWpverFDsX7t=9UxFGpfqB1{*#(# zjMn@!5aCL!(cZ@5LBiT%`Ucird_~H!UWc;LDz6`d_3IFS9Bci+tCxmy_25S8zd@I^ z{u4rU1no0CbgtEG+W3vCYDTN-L61hOdWmBD=b&}cbm|$iY0hX#wrsRa2xX#uhVw4H zOQhIqT|JTHD5!^!nbZ36UiVfd{EIQGR<2(Zrrh z<$-O|1i3$9SAyK1WPNl8#rJ1Ow}5S}^_vm09xi8&lVtlBzxdQgII6#7vL4=>t2G@TDU5~pl+S^=D-HEno z&pnH8(DfWR=P5Tkf#z&dT~C1!o0PbMg044EqZ*dkRvos?OxC*d5bA}6);cRH;}IDo zQ9lIC=RM$Spv93NY9fqm7ByeYi+9$;acNkk;OsmWY)>8v% z>oNWVJ_Z7JluMT1mlw3wZ$m;x(%_m?W=fVlze2V9bQ9+G-ojJ z%L8+*^`xVZCT!#hfq|V!6PE-AR*Q>q`m(dl)rmX?@oExsqCh}Rm@L{{9Sl}3w zhB?+NG>3Ya4TB$Q=DBOS4kIZFI{~n%Jg*qr?E8CSAj^%_QAj%p(hu=zh%3NE(p7{e zEa@u1mq0_~rBBa)oJF9WL%OKfdoLfI49?*bKvr~|sjj19!X`Px&@~e=t$;n1TujTl zl$St}E@LG2zoF78qI{@7HG+0j?d?Jf@7rtA?rF?!rH-j_0weDwn>Vpzy zn=EUPHmje*(*r_Q-M=4<>3-yCxlH#~>-yZl$z6GT(Y|pp4mOazLVY zq?Ea=`4h~s?QCbXj>BiAIQiob;`Y8X@(DxVyNc_$QrzCv6m2?Xs(*C2^*8X= zPv@xHl58@t_u$;)M_BMZNip;rBON`*i@1mDw>Bx(BAi>Q3k6yrfWmBjH!ClkZ z^(M@SHsST2XcHp!m*M{(pp}ll7=!hGbw>fF;EkQ=9kQ}$;b>npNHZ}yz!oz4QA|Pu zVJPQnhrwGUDNy|-G(E~45z{8+4lFW;T#+SM-9#2gD_+GbhRj$3JJs?*TKKHv4SojW zkd||kqZu=i(R$Fj#CeqRWD=H;`jQQcM(Iw~btbUW_<(eq+D~g!YyDPqNn{q~h(N{; zkL`CsAxsTmqv6S-O^>O5$tWdg(mA#iERMMYfTyai7HA5DELTJ_;Y2b}{iFfN6z}IJ z)ixf);q!ie_>9&EX@8)fS?2zg6dHRGJ{D%vF#5=_gKbBHwE0hBdCuNoFt*e{JgAgl zJ?B5pcZ#I^$8u((|0M*WB_X{V!f{kuYY%fECosNzJR~0$NxytAZ-RibjoBlOeKVv=e%|r7BVpCZzz5D4cJ=s_U)K zVcND&`)8`_Ui;geRuX!cjdh)GAO z!&{K1w!XX-jQ;i<_X#a@I<@(B3Uwib zQvt~pQ0>&F~!b`oeS zaXz*hAaMHO=;bYs%>p{ma{Hv~vtx_Uhuf#&i0fH^2<~Cvf2STvOb^kac1y?9wsl}2 zlt+!CJ%xVk5e|jcsM`M&PV)#HK(Nt|-JKo9#V5_l&bQmd{~=0;$AaPrainHC37n1; z!Atp{!h4a!t6b&Jq7M6*_TV(^gRcD$M1>$tblg?uR%TRqSvL(upR)~{Kur2gq=``G z3-|^b4A^8v=C`Duv{-Vr6Ks-@YF2QyIcRoba2)0thjzuNLs%HmdMUDo@L^;#;`3qbc-7*L zpe4xBG0L%oP)2Yc$LPi}7|H7eLtwoG?L1O-5{5C^IaGev&m(av z_mSB{y;gHSEc;YJzNCp>`O=VB(r9|xC@z0mkjCL+$00rr#f2&~Nv%-R$e&DW{v^&c zkLzlvAWX;`O$`NR|C3g%xC<<9mc^HHv^_nB7HI_ns?L*Lo#yQ7j$J=;oK-Ipg!$Aa zHI7eZa{rJR7g%8qM5ooJESY!`l-vmRA128RuP}<$uP|A0lHLxCB8il*Ee>SX^5g-Nb??3KX}rU= z)aOtW=9TfJbsM#B1oN;Dv2z969Ok&+0W@w2{(yJJ)$(ourU$_#F#Amn5vFl+TW&1x z-~OtPwA=V`i98eHq19YFlmT(N>o8alHf7mU$h^c`29wF!_rUA($x;@Ut{0^=RM|yq z!-YAbafz4x5RM*6oNMyfN{C9*;kB7f|Hzsuy`*t$n3=Ze zQwT9-T3ak(PlMGF@|EL=K8(o%HM0+BFFS?2z&p~(&6pj#YlvB_lv*06(h918eRR9N zgqonm%heXL^(eM9#%V4~gR!9QEZ{@?E8dFLjzRiuU?4+`4GbhmzXT+6>tcpz*#p*c{S25yul~p58buezc{LB=*;67E^&1kEBvdL6;Zf z7j?zA#u$iVRKV7ij7YSk9;XzdNzO26#;8`_a{0g$&SLpyM%Ns6qx-y`hAFG~EYyOL ze1L4Yv6P*kMZ+sTD-CVKbqZ-vErm4g$K9@Abq`AhE0N)1izNqj-nnfV-R`)gZCkAN zH-8!vG+QALZ-X@w^agZK%qQLuEp8er^Adp9F~#cu3Y*eVlQKU8U$7y~THFw%q~ySA zU`6)8YR(y8<~WOGTDUT%T$%&ZA-aTTX^W*SG{z#=>2s#szZ06cSDGk363ZdL(%xEM zhdkght6owft9lYwo3f{>tzxq2l}*`c(k0#bQq4Jy>cAnHt)3J8xo)q=1B;P)D9W4> z@zzpS1tkRd3XwK(y2n%M#@uB`F1nK|CG&Z)8GBhD?ycEW{4hJW1ELy^tcJyu8Fxhj zTIz9%p*wVSTS3CCsbXR-ZiNicr#G`TS7qQ|)Wf-5vH-+U6zC##HYmdWF`lz>G@2&A z@-?u}_Ld#W!20iH`Z(Lv?r*Fl`8wdxEXqTlf0c*0xx@=|A4e~&eFkCh!}eqU!pA9J zShGn`qeFDikYI-{Pa6DCmnzkRF%{A{xw=2LDi*>OR*Tc^!A-z&3uIDbX2z z2U=DiYNDkOKP+L@XeESt6Rou*yT2cc8rD3W^NEx?ykxzfgu2cM{c$G4FO!2)V2?5sh!B9-Bua}c}i|gS>nv0{JZ{I zq4E49Y3r~`))#A3u`-AJdDTAUhT|%XDxEG z#q?L_YgM1$7qXa+IFD`?Hzk|jL4l=O)bF&~{Dv>E1PJjLFZi8)uHXpDIIAF6WTkN(V zewiJ(TEox1ZovqC#jR{)n$(ZmU(rP%jsk;E{ub}4N4Mued{22aO7Ar_K2Kr zx`Br?U~#t+7u0vUEGQ^{-va%e8&V(&@wGqE z+Ko*|T30HGK)Qlx<6TU~gR}|rl)b#-liWW$+y0D^1qDfcSWM_^Z!)99BI_Z_`XOj~ zz`3e4=#cug)Nc44-TEaTa?kTH#s%^*%IE5FxVjysawu0Mb#!)1Y>TBRY+DT3bY#g%e^@?*Jdt$PN*>FRhBTs|$n22XZ*hEm=y32Gc& z@^odW^9P9(q3m)yrZg$V`r{DYi!{H2ypYyX1}@)Y32Lo-6cIIfl^u?gtNZ!@zv}j2 z{+&XO!E7+>n81ES1E2*rv(wvf`wydRyqhh@UI7!Qn9yb*0>OL*$D1&uFYn1N@3Ge9 z0AQIW^`KJJh&t)-~#T&BA)2(&S zA;MXlZhh=O;L)UXO-dVEunU6C;C!vdrDK1Au+I+WCq%KI$ljWZ8hfzDsBDWP>~YH= za0+MTl7_{dt4BPo&hJO1(dGIk^4J# zWTBVzKAp&3z8O>*bPkB`wZ(I)v~jA4*MEa5{h*45jL)O7o-!8KN=pJ%(hmxubBBra zwqB#z(Hofo;($xhQMiKw;z;M&51~dO{Zluv?tA~5-svdLevD0xFLL!TDFMtjOmS+E z+Kr(kLKoV@a-hER!K4FY(30&+BiqRvc~om~V+V=);z7sj%<~Fe(9i`62ufFeetHBV zMw$h$CfPYIG=B6^iMrSvIx1?(2+)oI3vYh+hl9YHl_a3!6)c($Yyj60qdUX6$0{u# z3FPQ4@NzcCx=k47@cEQ6GH(orSH`Sv;*qf&2xr|lX~2SY+u(B6W$pZ)o^Wa_l|jE+4daK{0g>x97^UZMm?^hh?|4vJ8{R= z!)CSc-h}};?+apF)CBQ09yD_!R?wS^!R29ZVc$rzd_;2ef;BLjfjowGIvS$~AcR2d zbXJt94{eDo(3UvSgHvfh<8=zUZY!m+DrCUJ3K-HbK2c~4j~NZ%`BXD#?7XPrLb;dS z49yzM=z|;2k97U&@He{t7i1+T*?HGv3|`*vS7Q>AThg!Schal9>?aYs@E^OdtTIYd zgXVwigip!h3JGnl+?K{{m}^P%D_RQVA^WbASkYlIF57udtnVThux2G)g7+|$EmKM1 zFhQ;{8^xqD?Nk|i0LnmJr6AM}J%Q^RyUy{P>$tKwfpSW?Re?q9aQY|Mtz%$gOQ_9z zg@EE68c?L16q~C_PxfaVV3ECdbtlb7eEprqZn_G(osn@kXo118Oi9C<;sk(!>WO)PY#3l~L=W*P747l{^@c$qO}B3B zNCJ&vr#7DD!3NR?W2;mfnp{z?pC8Zyy%rJ@S1#F9RHAJc*hKDHSTc8QERMS=Y^aOU z(^xOLx3MpHFoS){T|4`LyR+Ck+?~zd-L-53ch|GE+}*%dao5j^xVwerb9XCS z$X$`mL?tO~9f8gGy$@?_Ca?9-Kc@9+S^VK+KEWc6(`P_(97{cR? ziVbwh3Nbr*%yz*!-_K*bY!k(dmakC@EY8?1(d;+B#2Bvr}+SCI{zO5LlAAAuaN*+Mac_XkL7m1QrrMZ%l4TTwJi= zHPLjJbP+sdYe-{>1m`-RBB&Q4&-3RO#_mpz9|wPX9U*u0A9O?X=2c80&LQL@M(Zp%2UcD2u;bBU2c)C;x(3s zAz*ko^Q#H5M!gkCJ*a`{fw$pxW^>fVC5_yF(-CPCso+Shxc6*I?;hwvci2wAbJci zDULzk0L-W85EMGscZ62+;!~ScBoO>J5Zg-dUjh8T!2CGUz>S^pK~I&Tr%3fl%7td^ z@mrlk;E#UmBToT*?IqelR81RxNn>J}7v{3^CsyZB#X3o-SXbWlERH1m+IVwP@n{B~ z&Vcry>c)$|*6cq%z20Ekr?&lxQspjll|}9_nT~4qdbSSJhdtOy>2Uqz_9M;?Pa%HO ziKOwk!P~IJ*jNw)xD88Ukco(BfogdraN zKx)HCDqy^ZIuGIZ9DYyZ_auH#;I|LI2K?0gM?01L$2#FMxD4)jxaZ+^!|jIK1Gfim zKiqz}gK!6fX6P_*-@V(^A0>yXQKQe}*N>m&9@-j$j>p3LsKsObdh4Sx#D`-k0&)!J z4T`r626tr-Mmxbi+6hTtU;OnT>fQPs)S~sh3rc6e3s}Q_a!K!#OzIQ7uTOnKnfKMf z|1^H>_%#-ork`k7Vv;}S)cb-{@AqRs6K>HwqkZ*xjQj=fg@!RX_l?Pi7NCXEKKtAx ze?dKKeS}oeV@d$F9SF_FZytUN@yo}r2)|YM-HRV+4V}kh>2TBFrol~tn*!Gcm(ne8 zEpP?6xU2W587_{|#`cX)qX6JF;P(W6&l2q6z9}$)0%Q7uhtb+G{eZS1j~;hf-wiXH z&Tsz%`KoGMuv#!)xnR8zEP&i0$tuqnggSBb0j=O-ZB2Oiio^yx)=G`IiRe+!;5{2M z?$+gunA(^~GU7GyO+3a^5*0p?ac9cZaP!AD@3=E+;>&ce0s^4V@ft?!CHaCzS1jIi zv_kgOen_`0r1Tm5vc)NKjFM3M2}X86YJs|fOwtz*LjK)`B9JG-cPIQe&%R3Pu^lez0Bjmvb3cFO=FzjEg9)*T4!{Gk; z{<||zh|@}bj<+s;MXBXXDLt0i_58br`6CbJ5ROzc8P`AiyC=xEr_ z5Y_QYewInV>!2ub-!FNw<9HSrj(bOdv&2rI~iv4_!ywW(#cN0!NXC3j)@I z=0dr{e8oOM&Uw0^Lsj=) zt5<#1WmV6h-;36LWwV8UQS&#NEezMI z>h*F19(u5_52iK_s7S}YyVUY3pQyVoplMjpJuSn058kJ9t@WhsemX`RCm+pF3M^f; z5tfe{H~rRPL{P$&&HP!|R77Iw-J>`x*s-Sfvb!;X`P^*w^_+mtHrR4m>u8NjC(yfb zQQ;BkE-#yhT%!xG0Sik89*3%Uw)ZFgnula8z^lQ&lok#Z&EDsvSm6H0&wRT0FEmF zO#f#90^+p{3rOq~$M)D&h@qv`EBuN*ROBhn_rwd-c1W7K(8HfR9V2~&Vzj^?7TlBuC;oR|RRWjrDxzi&tb0Ik3*cYJ|9M*pf|e%K%RcYV~- zBGrOL-$ijkcDYSV#-TMyd}w%Jo(H)>kCQ6z6;NYPt#3K%zjtWUQHyU2NNx;W!C>ob|^?R)RZ9yp;*sRv3Aa zs3&25+4 z+I_`Uee{AF^5w#cYRqH`FN)H^fo zR6-{(7SgjodZd5dPW!L8C9*aNmT}r7tGvUA^SnwE>mY9LH{yjadK(oHZz6*90l2c; z0NISAGdiuQ9iR!qT6ZV>{zFF$wm+wUzde5m^%`uY?5T@1uDOwfe$qJy3PKEY{lNTP zEK4{C)t*Jc=u9TfXFVk_yeytE2H79Rz8c{ZAmDr<6T{!-dOGeMHZr z&HMT^XoMW=ugtMt&*8Ua7!Cfd08`5TZU@yczd0&Brvw0Yyx=QIr_%O^$ z=yX47eE7Y?7<%0D5Gr46k=bTMK(#c47uy~o$*q2n`F`*|v;4KWYNwYiKpi+f|A%ke zvP0bNrh8kA+KRnUYZbKJWZ<^yU9JrBNt1#FF!-#>)1z~u(W0YyAjTbB_ykk_0%V%V z0utrY*!K`r@X(;Sj6KLx$Qlv@Gu=mv2!7BG(>*inw*L1SUB4d~_?EQ7K**}9eG;8#o z@fBXqP_zx+RGVFVH(y$*ix!%iYqRK&lS$o1V7`#HeJZIh)Iy8%QdI)ZqD}8Q2e1P?Vw6L(oNrfsGQ1}q%h8ZF zl|%kRXq|ogTNre?g8i`SG){g=m?~&lgJ}rJ;O=>9C%% zlBd9$MRcmU_GUJ%uU+mi4zC!;oZ9k3+pzvtozZcUuQ#oaA5o8tG3UY^&u^5#`weHP zSN;fl1vZIBTkcNOHj#HudjvKjV-3RCec%)J2J(je&pd!)E72*wCgNKz51Y=w*L03P z9rWoOPEeD`6u_J9Hsc8O!hO9K+%ds>vla}=2u|irP%czBo43VM1`IIRS5bLZN#Mhk z8UB94aXjiJi^fhEkCQdkz_{H-xG4y87++?ycpZKMej75IrF{0*OT;+H2+K~A!(I14 z&>bf94$vpEUfZ!&J;m08zR;ex;@~fGH(ighiVI~HCuSDn5t$z~(*yz)G$TJdy~@dr03ifS2v+km4aE z92nf$u1?bN&4tDld9db}2LxOI8yJTd3kS^7HR@e3ayYFlS&w+UeRS6b+%;%hvSBa4 zP|Qubv4c{4PEF$W4yk0^V0tyX_*^wC-OrKTL)ls-e>`jw&qdC%WI`uynAc#v%b`ru zc5Luyr5(P=WKb3+{&Y70cE<)5A|+s$r(KTNconxgb*%VBfh8O89O557z|bJ}YB~=Z z=)V3D-yr!QU$ACKhv3B6IwBYMgVtxxg0aROmy z8x8{KANv``D!KxA8gWcN2q~^VeuErW`A;K=BkX)kOdLY&;VBPc__3x#fYC(YVHX=c zF?$=G6S+CMPs6oe$FUqJ=;@Jq2n=k|YOBvt82WUa;OqrNvLPMjK)j$8dVjddhOel3 z^T}b)p(cob(aM|KPF|eg5*SZ(k zX!Tg84rM-!jrw5o7gqJn&Bx4`vx9q$`9KU?Ni}&Xto`tMu(kda5EPs{pXP_6@Hd%f3R3umwW9~b3 z?b<{6LkYNpSS(ySIg%b+)-jT@|4<8ZBN2vw!nHm#9{W>0g1W|xgGp0yk8-z}OdRoD zDd4?1;G~|otk&{=`C}l{W37J-a57=xQr_P@V6MCqM`6n=obPXsQQtSgMu?Ykz6}6~ zdE5C{u>xj8>O*GdLxSX#2QugiR$$vC^|e!<_q~0s2z-l7X6af&>XyjW!Q~x1{&^i+ zO5*rF1T+CfP?wtN&1nu%T`DLm1Q0o5A|Zu~xOmR^uhzN%YJmI=T281wXuX386iU6O4$=uJWn|~-jAuVzP&twBx z$K>*v5&jdk>eOe!I*xY&wh4nuoRU8m?+A2jFqXQA^aC{5$iRRElbY0z;iS&*#Gv#W zag`MCQco556JyCwDfx1+Oi`b#UJUv69E%0!jK}wL< zn}>Leyc3)3jUKSVR*UvFkJ7f2Q)#qk9t{?aKVK3oOu;I#eJZeq zp7>lVA`>Ohh~KZfTwzvfUR-!BtYK z1#2?h)Xff2g-3Yl0CuOW^PgUd^Xz@SDJGuZ-?E7An+%sCwx%t&O>C<)`wbahr2sodO zm`tHOJT81m4Q~!{9c3mb6_i{vEEkqZJ(Xs4z)ySd=1;Arhb`RtFNz8d zA_bZte~vy2{+nSdcG_P-i?kz8eKqsV<}O^7w=I$j`!%`YycHUm;J!gP_$w6q265H4 zEqAb+f^KtLfWbq7SgL2K^ct*PamF3n4}^kuS@2%GvPcLngGW#nndJ??$j9}BCCW>` zpwZG;kk@#0sJRZiNTFdxo@7ecY32hA4Eb5#$!pyL{jH1P*FmB9CrL&dVVn_HThwJ7sx)&&n1c^9pZIpKrY zX})A$Dqp%2HZ|MhD)02cRo9uF>jWuJz7&;hR}&}p2aAkcxa}k1Hj_lfOb>jTte zX)v116F?m2T{M{tjZ7wQV9F5VhUuL=I+?8ClL=4x2C*@jfZjW}pxq$=D#=<2SC?ST zJB*KBVR28;azTBVNJ-DSg1*b~6{52m$Ql;tF1Ai)gdDUkII zA}i9+_>M7&51WHgvaT3IR+mkIabwybmIkB4JLLdp{bB*a$P`PmNN%1af7p$w8DrCf z!I|MLs~#u6p`H3%F7DSNNf>nUtD2+t)Mqq7C((*QeK#^*^_W%X^wR$6L*w4Tb<=Q) z6W5uAD&{;R?N+A{;D46qT|Ljc(wc}x{=Q(~B@u^r3cFGAmT1X@ku)bS(d~R!N@c(K z3JYo&#vng8#Y&(B1j`+uwcK)>VpQ{Na+W6kO_{=x%(JOB`6~_bModxn@?od$+Lu4Q zm~ehmx`DPKsy-SE^VRI(wj^tKE#iOGf%G_LjC@Lx=9_$9v@hSGO@9NrXdN(sR%Wb& z%sjTF{upE?-lkY}$*d-3V#RY|cyJc?*U-px_F3!b-iEr&>|7>DYr##Nf2wDyZxVas z=qd|iQ7Jz^eQiU&g5Qu;a;U}UG38%7E;1Xuqi5U8Cqq5=wUdXeC?SobC3f-oYnPj& zO9Z_9xJ*#LXI36IqeAt2Bo?f7bj|}LqvLX!pddpDWl&0lC|(u%xEu#|*T-e`^g#7E zyo}EWp8CeAFA|*U=nx%D*wv6v%LQaf8XcYq->219@FgA96&-vnbn5ej+abnqp<|qq zs1%JSmWL#ix=kmDs}Xf8n7W59p#~o|DtAa%JEzbL3vw3^I{7j}ijS^j5u*sf#b!Rl zp$EvK^?n|mndA5aC+^Pqw6@)G9c~5Q@E%4A^*ZjSk&)X!(F@##f?;Hxc@F8A7Pnw0 z`E`f&2fqZpU_L|>FR970`Sh)R4I8QTuy}(t&x<%+(N!-JG(bMz0Wz(J!bVDluE(st z62ZYtt~)Z7u2PLFWghGeovl!vI6sF)zP3bev&x@#w;7KF~phKv1icgO3OMi zsg!BZdXdtnHWJTD|A38F7F)p`dP8vy-f?2@A%~A;BXZbGNVh~HirjJ%yi+V-E%N5} zn<_h2J5KgpaJnqlgmR^6EN-NTzW@2R-}C(sgzj5txAi}<_Pn5glzqUp7Y~%el1Luv z*s*!|Ho$VZ6(`^@B&2tooUxqXw}Xm@&JvYrHzcqcV$(4cUq>Ubywmvs8L{DoF_!mp zs?_5AK)T0!`BFzcgUF)n93loDc4hzg5}>fEtgoUSwhK!k-IiHzb(agV4*anc3oxko zE3$@B9GA|KPmI&^sA0AdTRytZyOXFh0Rb=$Zpz_391DM!)7N#Jc$B|VhgaZBNH5p* z0-~agw${_j;CxdFT3CP3h!84#g(^goJ?uro68k^G?iXlmbRaJEdfe=X^b!NtfyRm|>R>q>SjzCG9VV=}vejXbZo%t(#)46xw3HsRXvO13SAjSn z8XDaXJsn=AtnRGWto0-wqJ1^n%a%ex%KPdhG;!?bI5WVtMQO|E72LZJ1+{l%9hH?) zmhIFtiGIDWA`fv)yx%|o+83|RA>uqQ>*(ec;Wee9j_t2|Sv!TA&;Q zK$nb&kE6#6+*0@oDQK7NG zJ-3r|(xIKeUadT=ex_bfoAL18Iw-7o>M^8i+9&7;5Q#3o`*+Lu<7q4j*7eaY!o0Au z1Vl|?&tqKk3IzS{Hd#h3l<}^%tH|~PfPhp}WIMc^N4fBlJ^pf9^bsR6@jb&H{y)SM zz5-`o&6?UF@X_ua_)~YcMXl6tW|OI!7D%eB=*@#UWw0nehoWSej2lN>F9vl~*9r8A zoBgpLlU>{8w-P#WE1|lR-aR-IG~Y%R>78s520KUzX2DW2%@!6{XW( z#_EK}q8s=lc|9IAi>%46KCMn6lYc3N=CP4n93OF^7k#`MM{Pib_D`!C!$BGVvyp z)zo~=v2o45t{W%d53CKx#t+A)AeOVbfY}1~|45j^-mKV$cO4^f`rk_1WPLCWzZH1V z@j)+MbbPRaUUZ~K9`8cb?lMH}UWcd$H|65+z}CiiCR+xBEfF?cRa7-MhC2 zxjE|a^N&p`>eQcHVF21lm=wJrfr@V9ZS_0ZbjCWS@3y)oAw6Kd~oa1G&Zc44L2C#DxdeQ>0&9Zw`o zmOmO&N})!y!1SoA7AWZn(zWbiy{>hGCvwp|hFmifaTSB{yG3feHZM*~oz15XYuzs7 z0OvSgv+jKeUT3k*`U5}3#T%gl&W|(q8UnEH0bZyVm(nJpUgvALw^-a0$WD}E0|NGj zfs6qteK6uoVcNK3nb>WW+fg+nP@{3-)z-S-A+QjCPO8C_w+N)=H@c9&5VvY41sCC# zexj7Ph*DZjiQo{dK9`Cs!aPoz^I5Ql%!;4li{V+Y-Y~PF!upr6iajjL@jS441&ST zG;>C!w7|gDj$WFV&I}k_UQ=Z$3&5pH7&x+>&YB z?U%(JZpmnCFlkx1RJ3eTw?#dd_YEd3E9f%>7IFTtX=v7n!z~w|I{W~xd(t5kF^Dw+ zN``ZKBW9d9$R=sD$`e?6(0fARV=yR!KXi`?B59FUC4!qVY>vCdQtT=;(+eXPHyW$c!)`F-d1>iMc zONLw})>dL^NbIVu+`!sOLAb39E5UX51mVw!us0g~^4!zZTu5^Unjyg+JF~kFO=!8A znokeOZ-BL*bA;s~pdbUwl6?;rM^;-K8bEC*HJDT<^pTzHPHm`9Y)gDekSnQ;%gREv zU{Gsbh1H(aj^}lo37J;?#l7po1EBaOw6%)nQd$w7u1H!s6&lcFns0;(*8Yt+t%?oj z8rpC^f*Wv{Nl;N3x_^UkG<4tI78MQML@6P;Ss1yQpc?O$;>|1paY~y%>Ew#|h%^rF zArX+>>IO3THjwS|*%ghSbr1GRdUm{C7WjLNunk;KytSB{eA%8%jNn&EvGruJ(Wu(8 z5v>X+nnuzn;!bAka5bu*bmfe&cl#Mi2BY(lmVV+}NK+d3#rL4CRRnU6U=_)pwiClQ ziegYo92bjcZ=+7z(b{c0cJPc^`s1xWW0MmR1pepeG-#fz zuvSBE;*A{~y3HGa10?*LTQWWebEMl^@?DFk;Tz?2zW2=bFL43vAM?)5gbzD>ObNb> zlYl|lQaNVPAVg#{iVL z;$QoqJ8LK{@f=R3k~lV;R(Ou`U_9m>Tz#${=`I)$e0>DfB^E@JL@$nR(hVATvv+fA#Fd z*4tZKM>LWwB8udiJ(MXa6y0T$n8s)5*lYaai$mU7w&FVbgb@B~pQO-iJt@cDN&F5Q zH@f-u3gOmv8q5*tzHQP{nq5ja?jX+kaIDy+3(u7_&`8foG{6bZNzjeVBG}r+Y(%w7 zmbRMg*HL_}Z`;LdCCe&ixjSSz0G8|a!@#yzHe`vd(n2D6wmrl;3wWooxHVTSC1V#q z!PW~4hINM!PDm*oAGUuD_S4oKfbClP0h!X+C{*fuGk-VZMjR5u8<*sCOzaN>gt6el zo=}MUMtPKf;ZnTdJ82%yKsQaoqK`zF2;EQGup8s)Sfuzq2oS`<4`ojt&fYPZw`X-O zrUg0IlFc+SuEn^P3Td>R7L<1JaVg8f(AEQV%lE8s`C2M9x#Fr`Fysn0=vjLA@@%Vy zuqOIK_Owh2ol+nV($Om{F{wu~F@K8&1qLdx)wjdBN(c z9tr>Kk8bo|#va{ZqwxW}yD^Vml?3@BBmC?}J^EDpV;eXPGz86zZBx-Xf9n0F{h;Y} zb-!uTy|^nAzDpB%ziIbsblJ4JSI8Y|4ylJ>Cxd1|?708Z<~MX#rqlf< zmWM9yH-+N(BcfUZSOr)Hr~)hmcmSmU+=)4YJ25};eiJ1YY^6f)2OI_*C7bXan*Z4S zCj0%AF1z2vK?|IP>m>4iQ^9?#PRR4BV(6CvHUh$TlD_wT6ZuAbVLunR-^AjL@b|;_ zn?iBRkVGON1uzhh1{euY1I7YSH~$Own<%kh>umg%0u};RkWIL5e&YQm^fSzWlNtGN zJL08f(0<5=qZ7SEk)Uz51HDs)DHdl#&+@xPc@3j?CI{`q^MdxYJQ3lraE(8Y+(|^- z?6l;`b{rAijYLASdP1~YJ08iFNvA^LYdFzviE7&_81Sg@$X1~{M8A%le+{U%!NjK_ z9|y-L5(A5#2Hm#5M7Pa;I$j)yq=Td(hE2<6%673N&L>2;<+m3Hd&7;Zu9Q(8Kogpj z7|cu5Pm1?fJ|2e!sq$^CGW3g6ghX79ja{?{ zziGEacG1!N<%2+=tGg{Gu!Zg##N5`u&UO^H86Z&CEt!#|e#3tmF05DrO|e4HY8*qsVt7GM6mg{9e|G*bF?e5V>q%Q`%r0&) zoCM$r5}6@9H#IHxBs-5Cw-aj@R4dRKTdRZDSRwAzjI$l84@b|ia|`)Vba2A0G?H_L zrh-c!-RJ@t_S>O_kH1H${8Kbbkm8;MZwAD#89Su=zxkko^x7ljg35;SZO(l9hG*q8 z<_%3avb={d47Z1`!c9b6n>Bpq?QZyZL2T@&hF#F@fNrOu2}0SLWBdpCJ%%Qs=N2HL z)f;>2uffI}=~inbu^9S7>h`_1`-h`b5H}_f^>sXSQR6t4FFSBuBN@cloutMc#IqK= zN#q^)F1Ws#7Jsn$;Cl!Eaqw`jJ^mA?z6u_r%N_86LE+S=aRs<*6S{uB=tg62qFws(gS1Zx9zTyN3Bg}6c+>=kKNR6B z5tonHCnS#(;>Y>>=FdCP5}!Zs>z26uc_&*h(b2lFMjR=-@ZDR5RoKS}aZr zLFb%?4oBtz?b2CgZ^4?xfI#%q5eR4vZ_E{_Km80`sb`Ug_poeBTbHdPVXL%Lq}!rn zkck}-F1whPz^Pji9os*iU&^}d7z)SsiXQja6Aa^n&F(BZbTsyY((`Zv22eJBr)|5rVnYW;|V7PRb6lnSmrz=}}1STZP1N&NM zAz+{cl!@*$>18OknFqTXmnM0jnxtrmccA;z29H>NGk27n8k5Ln2)L<~iX`mfdq`p0 zG`f01@6VzU;Kceaps*V2_0WBU_fY^B6#(-Pf09ImGjc{!9nsNP;p=1@^*Wq7mXHXh zmiW<^@IMW&iR1KB2!9)K@8o1-K)6;vIo^K}5RH5>L=OU@TQ1e(+4B^7${ux~2|3}Y zr0spADk78In3ftkRnZhe{zkk}$r9NSMmogWkhIqrG#?=jPpOEpC<9^tug@VR(p*9D zhN=O~OW+SP^g!{>RUK#ORG85*dhKW#jSGwcA-zz{Jcqs$JS-kZ%|bB9ZbDru^nq6} zF)Z$em~h%`%s@>033l;OP_!WQaA56iU}RBO#<8FbLh4B3)Pqii9VtX{Ao1{yv>Q^4 z+>zdQSGa4oB+?y90k=qTw&jR;En+~OjwLZyKn$cFQIR5!wSd*ZwfqIq7m6#$6WeAU z1!JW8=qk8{xw=b}VF)gj;}_$I{+TprYHbhJ`s-``YuMqo1F!*sahSLWdBNy02TJ5_ z`>U1VEH*z1ulaasY#>zDvFk$eq`ON!JZ{(WscEtA9r(8D+t^zFs%10oB1yg=Km_Y3 z-BSmNqcc?Oixkkl6yhmF9huZJDXC@!JYz_c3n?TM9}Kl;C`Iv&GnA9$kjac%L32;4 z(W4^=yPwSNAp090A*&(jjYVEZ9A6S74!z69z4}tC!sykNhsHBgPbo^qv=6x0Gz`Ew-eW8tvjV&;_Wcs_}@! zh<$MkIp7NzcPHIZh`8b1wjK=5PhO?+CSr_As@VpcLldAI+C&Ii70hi2I5%)3av!X-Z8S0uzG1=1 z4Xw6@}95g5w-`7tU%r>b})>37mBuYU0V*5?)VG5hO)OI;B4raJw7;j17SC5 z^TnB&B>`kHDPUU@Te6Gm&1GZ+Yz?slCAG;J8P$s$T2a&9SAQ_8X&ti4WTDzNv}HAE zi3bB#b38mrNKCpzMFDcdxuZU@2`SACp>QPfi2TL)H^jZpvY5cK7q>IU-++H)E^a3> zmxoBa`}vcFg{6N)jnvi2U@@t#j-ndT_`ryl4}!(hXfF)0v*?fpPW62tR7yAplWwQI zu0}(l?429F&@;}z+W5ikhgy0{OG&gZ7_o_JFBkQNC0Z1%MS&RcfLALUQd|8GwkpEa zC}0F%9dNG4kWn8IRbX*F=bsT+yq*(=fvKbSuLp1BL~VGfC!U42R?(uRRv(8EY+B0* zYHn;~!^D7gS*07mZg30|Uu3}sq5+7nLK~3N1`O{5*y=~v*37ywSVzM?J!xwZ=mnS* zm>5rJHqA~e!J7v4LE;JBAq5w2VliS&W$b*qM?st02%gXkc)(H6tTulVP4y5cgqTBH zI`V{$Nvlc56H-b%A-h=fwKSO#%SX|XP1B4DTa4^$>d_i8KC0C9es2Z_<&17<4B0g1t7k{Dd!!X$yg z)rS>kr(N89f(nD9AB?$-?Jdz=lw^rT>PR-n_j+Q>4<0Z%U!~`d7#zNxHBH&c&=H9+AK2$*LNZEe5;6bFuz`Co{6a zP6Lx<9lXwq!RzY3frbtv2?GnomC#cb)lwEi%yOKvgqTk}rH(_I=kJ+tlyE0%j1v;4 zh-Jw1G-_<@3N_)qp73sXtPSs%i7NO(lN9^67ZCVgd48Mf2@hyfUt;MhRk+lqs$l++ zZAwAK!2&7Vrf{+aHFGIo;*GH1feEZbRHU1{vcz|@%#Fi(Yg4i7_|LXp>!0X63D zUeX)GhNloRE!g}VkNNqM45=FC2Fw&T*8iT=WJvn`fm#+{VIgL9oZq9P4)Hifc8Li= z5RwgTy;%o z*++CQ4dWlzET!#cm=`=y%!6ZSkw&9~_%UdPs2tiuoWDs+dNw;o7HG<#JqDH|ariGq zpp4QNz~^eceo+iW zG4Qis;M`u0`vTAe*bnHlPfAt={b+z4PzqQExcd!ITLF&&HUVA%ybG8QxA@mMPJysv z08;_Q01sdZU?t!&z)OJLfJ1;!0p9@P_j6ndU@%}Lzyuf%m<dDDzXE6hqX82DvjH9eeJA#CTs>erAQ8A&0rhPFeNVys7@+gFaVVGEq~?+z zD&~?uEyt+2vVG*6xdD8$yV}hZc8G8K5Fb>Z)2s57k1BJOa9p;xY`)Wr3#_gZyF)1D zro(-deZm;>KYiSUF=WoK^a;+2=~;fS*Xa_n+%CcEF3)!g(?i+BNBF>taJER!? z?QX9y!BOF)IFM$xbADNoQ*L*7VJA4flm#j7Z14QC;)SE;l)2i>#SX#2Ea0chbZstw z#q`Pfqov|-h2yekDYWUMhuWc0@d~1IWw|S|M`xA0eaHpV=Q+!r4xf|qM(H!Vi5{m5 z`U;;1w!Trt<>lnW#l*(Rx^?dn-!q|CV(&gl$roMRH|3Ik{ZlU;aM{4i2VEh*a`07Y zLxv6;e)X?LjJ#&lwF;$*S8KHCI=#VYGFz+}nWM9^ZDYpfjJxjo@wpQw+9&1Z7vQA- z)M+=|IDN*ASkgw})c@u2odDW=w@#86<+0KscW6FJFyiO+v6}407DEBk{*a&@QdAYlY z!Zu;<)E(!Nv)o?W!ZN|`br(6Q4l8^`Zp6`s3-bHl{>iz{f5W-(UuT!^Gv}ZiUg)oe zJO8hv|7x!NFNXVZe~~dP;oARVaYF6K{Ds5I|J$n{~{>I>H( zsY_zo|6*f)++R5S`KA9?ZGNZ+P)aHI3#Uk?c6~C5GW{36&i;Q~Y1@4zbM1ObM|Y#K zZmC`ps9Ac)oy%&M2Upasyld63@4jdCz4zU}=7Hb*_QBsh^l<&!N7gkw`q=N+KmLb5 zZurv^f8O}yQ%`St=Go29ZFzp{3opL3ZF}R(J6?Hp=dRs*_U_yN+Usu|IQZsUhyL>R zJBR=J?tAb5?Sl`S{{GR&M?U%VGqL#}Ek{59;>%;l|M}I4uTP#jede2Q&wh8V^(RkE zT~9neYGV4O%l}KK|C90mLkokh-Pyw6mo9%!j-jH$K&u3-&GC(t=i-x-rV<~Qn|p0> z@wL$4v*&VLCID*`XT==0eBmaz=eOx6771>$&UbpSwv;?%`sez6Se;$xFK2OF=XbF+ zWTwYkMk}*ihqs7m1Y?|YyncsQ^5bwZEz+U*ImAnGa)^uK0k{yZl0zI6p2Bk1Ib2-6 zL-2cx;Xv_u%b2d9)bI6$?4~%2UCxl9z%S`?-7e;u?+>XCfx>bK$H6}be;oX9aOb>! zmrz#Wlsmm%w^z<_y%RXDVEn}Ve94B4T>iKTVQu(M^bya=m!M-f6IL`3Yvd~%=PL(5^g;B-{TOOW{rEC>+?v=uA|qgdvVf65=< zJK-96W_vdLKBqi4f82N^fGn1H-4#fp%qPbN0o7byDKGYW%UpBiE<`ooDfudMl?i2z z^0Hf4^a%yzzsyxk1$H8&e2#xE%<@XN-y50NQSxzu99}EjK0#hyc9RpaQ*pdbpTAs? zyG!Inj`DI!449%kT~p+)@RXH1i{-jqMBq0P`=P7y1@M`x66s$%(ZAZ zP~-v?u`ORpJ%wv8w;Q`Z>IXhI@KDS)sqKD4IC3uZpx>ay5N6tYCd0Fm;Rj<>*iQwT zU71kob)qMt72MR>f7f^k1)|L_vd~+q@`!H9I=$C^xM zj_RA5yWi#a5ds%D{ujGEaIauE{N8r&bfMPVt_qL{PzLhLaQMA`9p1Tq^5|m-C%>#e zm0%DPsKa__&)YTCcC zIFrZgo(tjw`Zq>ozw0KKdx6V>It-!EMq~7q2?^K)lQ)ALVaJ8XBxjZvqZ8U+J{khX z-%M9=zNgHUjf!4T+PkT0;#MfQ_Hx0yI+90ghBblXWxLoY+9dn(d-3v3h$@#XtFcl$d;)IEl3(_cQE{Fa8n?Frlaxz|* z1#^|d6P+ByHgGt4`@J7{F0JHnD5R44wJW&f4*+EUeePtxd2mPf{So2GeF5lUq;?g4 z_th76&mY;*{cxxFPvDquIBsrKyZ%5Ye>vG5MnH zH+1dZ3$(ytfD47czM`XhWH~D#=C%$H89vf|AKc#P#d`fo$fw^;Ch1!PyVQ-? z`$qWN4!ha#Cy($q7<70J{=V;v@&|rC{=jkUegwZK%k8P0Xv@V!feGUB7-pAUmW}0u z*Ig+QLbYK=3SggD4&J~Rtj;sJugF!Jw|v=Uv~h8J zD-p+O?6#cF@C08^zG$w@EH1{9AG^}L*zs5;gxul3jb6^?=67Nj_^^?52|&qEF00hx z9q(S?^uk|gK4iX5#pF5XPVzgwm5hE)ndA169pfcj@2uoLAQP1u268@1X5u7-%*Wee zAPmD2F=S>JqU_;S!WhbVh?`QtmW$)SHc4i-?urVB3uSNt5B*|uu6xvPU1d=EnRVwUDzTa8^yMTMIa)eC86~& zM#*)QMwiZdlq}ncJ>^`d*N%om$l1b0GC>OC^2?o|A*4|}QdvXGy)BfJe4$vf#BoD1 zQ==`Y^fw^#D|S*VFL3A5zGQTz;N+%!e>_vbKV|JJG(d0{GgB6JG6=*4;tHkx z7^}f`v8;R8onE#G#dyGw16t096njBg(M=(2Wsy15&O`NvhQ60ty9N5osMV2m8{;pXY$96SV9FhMue5QczRE|K(Wnr|7vKT< zeWeu3Xn#owLSXFy*7AfG6i-(y?IrUja`fNq8oso#W6KokQ}3`8*y#XuATQ4B;e5XHbRiGc~9W^8@((rwv4PacxH{G{~d zU4B1L{{GXcbbW|VO1bMpWdG@${e1Cv*#tmgqOZ#)AZO11zx@0kZwkpxV0y&L;u~;i zVD^&AC0B;(<*^SX&DuvLwff;E64JzF+*ZZZ_3+=g?%j2A$@#qB>T{A+Mo4|;NBYkU z`F|Gv-+1K6BLlck9uXh8vFrG6TgyUB>IMq)yEEUFbFzldc45Ux~ zNu|2RF#-0G9SQdh(};m?rk6oY1pu88H^6a_*TAI4_kfxRh!3efLn@B0NOq8V%aKGF0{ z450ksiWzf%2P(Oz0x5*AFwSO&&Z7|Wt0)8i<`=GL)X#QGhrY|9r+TCBz6gCC^i(JG zt&Gs$6`@}hp+}k9{NEj+zb8UZ?S$%kAs}3g80hH>tCFeR{6qF#xpx&$SN_BHVKp57 zmsF`geuS|m`9;XC1jGYm01j~W1upqC;21yzGyx6)b_2EpHUTyQHUQQG8UXcx2LWpU zs{yM3D*(#?HGo9`51T4NzQkmLs3RLQ&Vk4JKZO#sr`av30 z>U$@)bIBJ&Jpi>Y)CQ;RD zC0_~kH0o$D)TvOZz2`u!gsOvj3)JCIX);WMN{6pfph96^l}9S~F$l#a3wwTn5y)gQW=6x->G3w`18HbDqB=}C3zdSY-s<0HE>cegM6%aR~4g;370i1z-Z8 z0uT;kfE%ro767n5;5Gr?0{jy|gET#!n+qrhggHsZih(Ewq8Nx`;FrgM#0Q9FWGgw?9YhD!No)_6Imw-*S25m76|=-o z*q-+NrQhRU1`lnXBm5Jscood`ASBp9#5f{F#2xD!!xh3lY_`X#VJZawW)^;J;OFFX z40c{h6zj&(5^9Ct!hF44eRNPZ{Up<|4K-aD<$Q z*~OJ`ZiHRV{3tjz7lt{|5nt(2gw2AV3h;~^@L!4CIAC(J6zz!9jkwAXPZ?Ll$+-f! z6ahyrX75I7m9V9hiWs#U@(aO{iD}D2HvIeGMtSofk7WqwVsYogMd19fwSk@^=dux# zi={24G#-9k+)Z#H-5kW=01yQlG7Q0GYEPpOF?o?nd)!KHB*G~={8Bg_I8rezw*m`8 z>6J&6xMQA1am8>Y-kJbeTQSIo6Xm54gfS2DLZzAuYzXjkzMY&?ArA_qDhDU;U&Ukw z%j?8Y8iWf%JU7Z9;9@Of#)LRasuKA*KNme{~G=c4F4VD?pzC9)j>A$ zOud6@GhCYXmI{6X>x~6)rS|AUnH|V^d)>-p8)c?8VJ-_R%3VJ5V87R8@D-IhD;&OS zD#F4UNZN|Q;j0)mUpW{8Yg}a|xP2PB^JyNe9Hkg+>78J@HXN4)w?i|tvmp{^>eP@X zYL4O~+8(0)AvzvN17mbNjE;xV@i00bM#sbGct{K7|5xS%+VG3mSM*n?6mu1gihYVV z6`w2mD<>%btb9g!TzOWRu3Dlxq)O!b^JDoX{8s)={;&LCb)I^v`hN8X>Y18FnnyK_ znol%6wEeVKX?5BO+UeS2ZMAlV_A%`{+HUE6(}$$bOs`H~m%cUqv-DHx-=+7|_0jdy z4b)wwyIQBvX>~^3Slx78scx}um2RDGzwS-lVO^81S@%!fVEu5tLa*1~slQ9#p#QTz z!IWX@Yu1{_nrE0R%=efdH*Ym>H}5p>H=j0tXYOG!TJkNkEKbWGEl*nZTfVbgYE@cm ztWR1|KsnBZ#o$RZMT26iVz7!=Rj6)J)u`@P{Z{p;>Rr`Gs-voId=fvH&*pFCH}X4p zUTs&eQGcVpRI^g^8_l0I+cfWLKGOU{6QdoV)oQI;8%mn5oujSQKBe8E{aCv`{q^)z zl;aWIr@HI(4!u|Zg#Mhqzah&o&QM^OZSWgzHQZ&m&+xoqyJ4T<9m7$>KMmcDy^X_+ zN@Kb)%a~`JYIGPYjJF!AjdjL*jP=Gp7&jVUH2%f-fw9GyXzFKDnr53yOsh=ynVvH3 zHGN^a!Mxafr+J%sm${GSO3N?{Z_!(FEE6nqEFQ}O%VNttmNk}o%VU;5S)R5$Z`p3y zZF$3T$nw7B6U%YSNz1pE7;86cFKe>3pLLM+SJn*c^;Wy}M(b?rO;(R}u{CJ@wRNra zCF?8JChIvX5j|)>f3f1viYJ*OqFlw5zqx zXt!!V*Jh`WPhXLKU;0bw@1P!YbT{ZW=$_IYLMu$s57sO7^H8JP^n3Mh>W}EZ)c@A_ zgz;J93&uv{9wTqko5q_8O>WbzraMh5O|P2zo3A$CV7}R0ZN9_&sQC|OHCkq_rPwkL zHB)6-j+%MU@`PoxWd~a6Tb93BKDIPldRmuQmjUCyx6wjf*J%EzS)}FC6VeB# zU!BgU8`E>rC#K(yQq}2B>CWlm^(wtZpRJ#(ccEuJpnq7uUcXiUq26n_+n_b&m~JpF zFx8rVYx9T$OuIKE>~nJ9Ews!xx%9m6bluL z6jh2E#p{Ygio=Tc6-|mU%1O#{rBAs~xky>1T#IsihuVx+C90BDDXLV}K$ToIPvubw zs)edWs*CyKe1rO|x+iMt4$W5@PJ2N6sdifW!t^caU+QM)_v?!cYYZC=TMZu?M8lVc z(*~Ww849OxqcpdnefLqODz8#1lo?7dN>Qy` zro2b_u<~8yDb&X>)io-$DpQrCnxHCFO;?qoex6Xjpnh5XK3d%|^%-?{%|)84(E2jb z{&F>Wnj19>HMePMF`nF~c~J8h#*{|QZq4hO_cb4DM9p!{IgLy^NPDeTqaCAtT$^dg zHB=cMGc*~77*C@-z07j6iuL&Q<|gwOW|d{7WgXhhm*~lMYrwkIN`zJvfg7qAsaUKC zD1NWlt2l>JBrB&VXQ;|le*O`D8{dr4TdD4&k!y^)n|0slpEA5)@EC75o;1dpJ}`-< z8grxhYjc|AMGI#gU>#xAGF(lwmRbdCwe?Z!X6vigw=pIlp;b8Z3Z=V3qp&J+6gMgE zRXn5Ej~V16#b=6EMK@)Na)5Fe=8{>;5~W{xi}Ft8y~* zekxzW*YZQv3iUko!|LbM+tj<%`_%{3ht%JxuLAyZG~+dPO@U^rX1Zp!rdacYW)u4I z3!3ekp<1POJo@rf^yb-^b^fURoA!uS)E?Cy)1J_t)}BQ_xGvqEUXVUDeR}$)^hD`*cnzNdCjGM{Y6pWp6ZJM?|eU1J>eLd#o_4*C^jrvXc=kzb=x9eZg z??zuepg*KPtbbqMgwayeAJrezpU|JypVe~)nIYbgXh=4s7*Y)b4RS-8VYp$WL19oE zbOw_l!;o#rF-*mLS!^gZlp8z-!LZP<2tA?3u*y(xXfUidY``e6$?zQ7?RLW}hC_z; z4M#AWo-mv>$c%}`6yrc+nsFq +IDS__DialogId_12053_ControlId_12=< &Back +IDS__DialogId_12053_ControlId_1200=@10550,10551;1;0;;0,128,128 +IDS__DialogId_12053_ControlId_2=C +IDS__DialogId_12053_ControlId_301_1=&Modify +IDS__DialogId_12053_ControlId_301_2=R&epair +IDS__DialogId_12053_ControlId_301_3=&Remove +IDS__DialogId_12053_ControlId_50=Welcome +IDS__DialogId_12053_ControlId_51=Modify, repair, or remove the program. +IDS__DialogId_12053_ControlId_701=Select new program features to add or select currently installed features to remove. +IDS__DialogId_12053_ControlId_702=Reinstall all program features installed by the previous setup. +IDS__DialogId_12053_ControlId_703=Remove all installed features. +IDS__DialogId_12053_ControlId_710=Welcome to the %P Setup Maintenance program. This program lets you modify the current installation. Click one of the options below. +IDS__DialogId_12053_ControlId_9=Cancel +PRODUCT_KEY=PL-2303 Driver Installer.exe +PRODUCT_NAME=PL-2303 USB-to-Serial +PRODUCT_VERSION=1.00.000 +TITLE_CAPTIONBAR=PL-2303 Driver Installer Program +TITLE_MAIN=PL-2303 Driver Setup +UninstFinishMesg=Setup has uninstalled the PL-2303 USB-to-Serial driver. It is recommended to reboot the system before reinstalling the driver. Or select to reboot later. +UninstFinshDlgTitle=PL-2303 Driver Uninstall Complete +UninstWarning=There was already the driver with the same VID&PID of Prolific in the system.\nIf you want to Install new driver, please remove old driver first. diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/Uninstall.ICO b/PL2303-Prolific-DriverInstaller-v1.5.0/Uninstall.ICO new file mode 100644 index 0000000000000000000000000000000000000000..2fb148fea7182a7668e7b96c40ff60c1f6bc4955 GIT binary patch literal 766 zcmZ`$u};G<5Pc<)Qq+ntu{I-r(F~Ew(2t1(k|Ti>Z?RN~j%D*~I9wX!QB<>fZjjjnk3XT^LkGb2Mca`8Nbw;bi~- literal 0 HcmV?d00001 diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/Uninstall.exe b/PL2303-Prolific-DriverInstaller-v1.5.0/Uninstall.exe new file mode 100644 index 0000000000000000000000000000000000000000..547da9a6ad38b547040146d06a84be9d6a1c564e GIT binary patch literal 143360 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

Zwm4BCJ<0>DiQT2qf&1= z3e=k@5WOiW#G8~tP-!Vd)tEw9y$!_Gn+k#TrVv?ga-sF6r(18r3H7F&5O2~6!KR%M zUE&Gh^_~!4ZztlirV-{-EvFG-KSqeX=`r>upxK*(8gCM61Zk)dWt2vky&7@$CIs4> zQiLD+XhgRVDuk7a zsHGyVRER7UflEbbsS#W%VwZ~OQYXGtgvU%5*%-0gFfisuM}=6h=MS?Z^!6gg6o|4H zLF`4Cy%A_H;@XQydjsXsgfRfC&rJFSjZR)Nd8lwY7X$K@H7xgXGA(A&iDg4H>UzIF15N z$WG8LVkgC}dNjlxx{Nb05hvXY07VF_LU<%C;`s*FB7!vq6^i084k9LYjtrDB!!GcZ zy06qD^j3_a!|b93DkI*Ne}Eal9U_^TwL?yX%!xTwHiYgZqoeKkaS$JUIV97*MEDMZGf$O@XT}ewVYcbTm#ds!TFA z2sK^af%LK<1D%wIX~w!7t^yscAsNIT#pWJbJ?w5 z#_j`{>CWyHBDC3k#EM9mPRVsFw(rz!C%55nWy{Kf#Jia| z10Y(ZM6`JZoViU$@WPKbv2Q6;gXqOXb@SnPqBOFwDisw+D%n#`$C)KRZU zT2c46S;ob{GF%kmiuv$AN+=Uxj6fdk`T-zY2p^0g)>hO}!GW>pf~=hAQv};{^hP^F zYnQ^R$VIkg#Vflq7QrmKEfK=#_aTnnbSP&{7_WuxxzlAltqiJKOd*oqszT{aQ7B@h z5i&w4?NaIY!Ij=b6{R;}pn8*4h&Nq@T1^wkr8E_K>8LDre#KP*r|6ynKyToT;O2tK z5Z+z793r(Y_1vxZIMWL#SFDdZ1h{rttS|{bJ=E`Sz+MkoX=B8k0SrA_DMHRCJJ z#4T5~J)uvQ2eY4Kf>kYaPkF8k=1~MzEe2yY-LYz^bFg#CFkQT|x*d61(nMW-eDhet zZl--b;~Ab72vu}7r~Mg$=WV=04SG!2N2}9RFE6EHcBt%&HZR41FPLGWkFqBV zoT^TC1vA87oMggRMXow6?^Y+D9@du-f`uf|Pq1fol{nOh@70Ni@8UjkY_@P$mI}sM zGLVyll+ePzSTVss>hJ5(#*Dt$liFbDzD1=w2wzmRnI`jcQMg&?6s{cZ>ify+!Z;bO zz*asp(ieBwS*v*X%-f*Us;|G;D(vqvvL;m^PO&h8GPOLTAyv~V-=YlimY#`?zSYKC z*+q#cP+bCnL$W(6$JOkoF=dcTQOWAOp)hWeG1xPqR6Gx%qNu}62$*7~l=TG01{=-v ztbCQky$$I>Hui`C=KuK@c1HqSM9^(A97HgJ(P?NAcQbFD$HYHXirobAadx^RMSrd@ zD%A1#9xMgjp<)<$T5d~Gx2I2souj6=l)sX0E5MkG+}O$LsoZ@sRIsxGP2*01^&FoM zjgr|r+CiA=2t2KX)j*vBJ4&I;OPetX8%;?P2zW;gdD?-9K4k0&3_vJi71GT*%>m-+ z2o_7ul!bsHd zDD%jJv32A~b}Lan7~RZ>Hz%7N=yswKGB7*%$E!2 zJ`>8J%0PQ;)%LZMV_gv~&}w5^><7{poC{K4Vp~Yz0vIwbuWnW??mSnPxfu}34l}7m z)Ij`}OP*SxqLZcagwV<9Th8YBk zHVsZ=tQpAv!uBc>K;Q&#o^W1{B4X^ zEfP@?H>gTN$P4lW`^eB$@X#LFHo5CYm@B4Y6j}586^_s7VTw9_YoZW9YB|J3)71hZ zd|C31*{g*>ax_Q*gOf_QD&B*)7K=rdC`DPEVBDT-CJ92*q{WG|4#e|x9_`a7J4V|ooh^Y9gNOcZN0@Ir^= zL{P^33lTvqU}26?7rUOD8m3fEqiXUUGzbIBs>=Raq#9HF#+vzxAIeoR4QNymsw}-7 z`>pGsEKli=VK^hwK$FUC{9e*a3|MS_JpgMU}GYQLQzfZkKYCNCPZblp4jpP1hT3ELQSiW5%FTo7R~?Lz9Y_ zV?u3|P(p=7(~(ZbqIzK#D3!8+&~hhfB*sCgPJ%SL)diJWa&yg2u35AYtPnwFVCIXS zYX@mr!M#rrt*)b0by$m8mo@ibxlmDDi3SAF_-_zwsD_c9LePSQ@&;{3lp`)w%1`9eb(i6S^6$&QIfzVSGlMpF^!qhyF#*gRT(YL43=s3z-c7)Fuah!F7&F; zE!$sMNaAja*ezYPajb(f>(o_x!mc?wsRB7yA#vvg>Rg52%8))r1oWMJk<8?vQMyq- zyh>kI9Vs9f6r2J?0|W>%2lU-CW7ecA!YH50IAYV*n24N)fF2Y5V~>Rrkxb($3!iAg zUq4j`-$0jFD|r&w2UaE4g$AvOBZR;2s@z@{P;k#zQ)};ajmg0m1CkiU?gA z`H!tC>wWx?ziZ^=qY?-nFXOn-hBjdUF#VB0(T)P^g|5@dDWGe@Mi(Z zGM9lDx*W^^r5R$Gy+PoK|9-?kbtJF^N<>idNu#VsO9l_j7ZW+}s4CX&@Ep>KpbByo z43lcKshz-*2#G93LC{hJ)4)t0orj36@c2E4P+$oZdVO`c8%79vDiU@vr$EAcOn6En)&h|&YsIjW3ysIUgky0UH}-}u+8{bZOaR%eK_6IRjs)GQ+3p!nA)9QEZV zLh!-KqXiocfQCo=gjz}(c61PLAIA$MbT+w9M+^Et@1@2d#egVJo}^sI(Az5qz|)|U>urp>NMu5=?DZA@~yjj!W^_nC2YDX+&i+_|EeG4YB& z_yq>^jg3B6saadb6=fEcRdVE&#W~))R307P($g6+&M@k6uSQkH_ynz$C2#RUeLw}RV>)Tl>TiYO zRZ-pLgYu+HF>kP_AA$~5WYpA~j@;m< z&U`T$T(?YSA7Fn%Yr$l6Q9dvYqpNrc^Y${!SvaX^=m zv!TFdFzGzbkwi@f<2Zs}Numif9Qx=ayM_b8n#s9HBOE*@V<`$KFpxq`sC*D(U3ifX z&|jf<5}754j&zirhismGWu_5UdCM(d)vZf~y$DQEQJx+B85&gfMpI&RAeCz{41;kD zOgC5xXl9@F^o`*9bxYh2=ub5hG|8yrG~Hkr#tKzKOI7m*fix76_8Fn}jthUjw`~b%2cn0oT8;s?E5j?s<$(CD zv*I43zO~T7`Bray<6(6iX0a=b)ZF}v3aic=W-$J!9I61bhs*#!pw}O~lpzySU&GYr zKO+T?yUJ>F9`$d9X`5JgByOyu0_AU{@kfSsMe#+db0$!+k~9EsUz1 z*<_{8JM3FYmnvx&lLt|Wt)N8|^2JDfTsfkCWi#eqg4VSf68PZqilJR{$Xmu6!oOQd z(v&JbXb|@-hCh}7hhx5y>EVY}4Utyx=*U|3S&0IIOfZ;_trTl&z6!`uRSfJvJ}Yy# zm2C9Gi~**25n=d7Fy)GHGTdl9p=W=MBC}ORAFYW49h8_31}N5=Eg!gYUfeIspdjJM z(B6@URFNnni01X)MPW7ovS~u?M@X=_>(ybPtszO6^-s@KtzNJUKn$hTijoG`99&o&g=16;W`y-|6Z&qc!&Vb4@?kc?KC1~n>QI?fpL z0L(%pkjpW8VOg~tMhZxmjctu#G|USw#`N!1Vcm;6{9i<23^)(;glVeo^Bld2WSHWnl24Rj`UGgKj3Y{EJNFV)h@p;KrIw0Igu!7| zoErgKLjdkjm>Y@wM?4lPLxqbGAZY|_4guI>A(2=>9r*$!;Q_Cs+%baI>>g2u=RDT& z2J4y7Q-jN@-d9!?)sxd8x^ZNgMJytH&ldbOst9++Ma>)Axo+jVl;~w&GE&X2I9Q=d z4TS<#KUGEw8ATqBMiDWO`#b{+NC`H3rb*bn-s3^uz(qo_F0p}?5b|n0l!Mx{0$V)B zkmqL^685nhP)JoY9rixPU5CdLVuVrrdSScoQYSV1RuZT|2r6qOt`~j%BeJ#EATi%SzURASPq?Mia~2v)|rt* zXI3`G@%xzzab1F5n=1*r7!Lq4L68?jcVec*2Dj6O=2eQQLPiW~(s z3I!sVb<6;Sbi9uM5e-vTqoG9~eQKa_2q~Sx1 z7uFWQc10XV5t2%D87hZ$Pd+lrAarH0oFRVYYlrM67v88GGvf}v+^Ps_?;V%4DqD5T@6%~hLqNVrgAJJvj;Ztl~#ShM!_+wQ3-JPo1tLaiR zc8beoFQSd|BFAjGjBd>ATlpVCC^_DvA(C4N81s-w)EomxB@*uls6+__l?YT4ymSGW z!axqNfDmjTk%AIIE})S?qEASK@F03`9J))_BVlV4lu8vN;PC8{HiJj2D8{%9uBhN@ z2v^dWR=y_NMaqr0k6nOG%z?_Z7c6v1m1R7b5!c3+{w{3MY*Jn)J&^45vf;%TP+jHM z)6QV#I|$yl7J^m4QTS-Frt(17apZlhVTTFEr%b`BSo&G<5GZ@;DmBWE#ADTZ#VZw6 zVT7?1mg1x&xa`mDF*H$uYd$4Ue?kQ&m7;W`>-!_myqT^t1kM`!RLtePYauC$-$A_^s886qJcq#KmxA`cT3~aBJY7ec z{2$L^C0i2 zE~MO1^lX(9e7VC;Ssit+mv`Lhmi0j1kunapx_@ERX~oWp7-cC}MMvb0Axr0kk;09b zvxMA?>6PV9V7a?A^=Mc-;6lmhsEQxcJI!)OEmu&2$Ixq#NkJtV1KY@keOD1-yWZJJ zd~s=pF4|x-{FEx$X=1n}{4h)0qIF~8LGo;`*c!G=&!apUPdqNnDeAQWrEEgF!w&wV61844A` z4lhA~nmx|qy#!W(Wz!vwGaBFxJaT;a%Ng{uUJS&RFfJ62Edpp{%@b2Qc!s5hXQ{GJQ`;!~Lcq6^*Ws+5J+ zmM!fW!sYpJN43tx($q0?Z3AX5Y`!FFv4L+VFi~>VHJm9gf7DYf*%~$ zWOK+uJIJpJP#2%^9Pb}DW6Am-o1BHt=cz{-B7_J$tr-H@IjQ_d+m-qU6UT84s$ZD& zKa-R&4(l!an{sqV;nRr)hIUy7PD|{OPZmZinV1!i#$j4PHCU$=vI6_=*3r5;$;att z7pQ2xV=F@9p<*!4jitFkmJT2cOZU2AOqP5l0T1bBAWtOQuzVa;}&< z_AT@vwi)d>cQR@(y3g9)%)>n3xsvs@e4>Slo7QkAMOl95@;=B-CGbN!-_5F|id`C@ z{+o(j5^BWTuoZ4w>y=c=JR0)QVM+WTNWkAgREbq;iTl8~JJN2Eci|WiBMsRq>MWtX zDQ#h&_3~~9UJ&$wBbmyk{q|>ORxpJT>s*ZR9Wq6d=@vP*2!xm;#$k&TTk|QxlkI?i z3vB0Nik`xFGBRqMQE6iX1V~3x1Raw}r3zXj7}~@XP9azF@Y~By$V>ZX06yb*2nt^* zpg|n?j?nzdK?*#>!i;{uf&PJFFcUagt_K^sJ_c(Essgt@%2W^b*D;txzrVhYK)D9D z=6Fh9yKF<<=Vx_o!4;brd3)5` zfjoiwgKssTAO5RKS>i}>bEO4dxMB1oYkVy>P&5oYm|e&NowQcs0eme+>1khB0Ep+D zJ-lw#EgKl#8}B{DRB&a2ir*qa42xn7u?63VHuvHM{5@&K=bBD&FesiFu@h~t8%BJs z7m+9j_N&Sv?DjuuOfirYp{0y3r5l|SI+6~kDjiTbMJzf8C5f@L#?aG_fudj%S;!$+ zeNYuSf~EhNEVkuYnN=_W9Y3s$U2<8^W%DpXTjGMCHq7Q*y}!@z&-=gUIrsgX z`<&-G*L9_y@ZUzx(0|Ioudgdf94a4%lyCNTNfy6%466|5Ng) zjWTzr3OuR&UxTu4g{!epn7Jhvar056B`YvD;807_SDkqg?YE&f9lH_#lqeqwJw#%= zN{>MKw!2HJ0(DjSmVYLM!p5IAizDYwCQjzrXsnHk-@ACrCg%Bui}jOCjuVObCaSgi z!%Svxy!FxRG0cvqY5()U5RY%(xc5bGyyNS{)~S{WarbkdA$(>ZXJ`HJYd$OG3s7x^wSutD_$Zl6_BZoRO7y`t;?^iecO~ zBv`6et#-Wj_=o3;CzpYV68EiayE{&%ID!?v>@+j{s*d{XPJmk)Dmha2{X=2hnA=+p z+AM(5TFcJCiLpB)A4awm-9kT~R`rI5?!QyTiZ96B zH-k%Ybq(Gpqbza{4Ij_Ean&sTuycXqjVx1h;aho|#&25^v(Y-ana%^DsFbe>ovBXbgDH$b(Ou$(ht;{dMSZ=oXHp%z&75d|p>@D;pt0E+SW;~TYe7i*C0C6~Tf2EWVUnVuy7B29SKb^l z;Z<*_rp4wUex+5IvOVw_4>RYybS+!#{TnQXb%}$2&)&zj9oc@k+alG*c!qUiuAacr za4oX8qo1drP+#)h^CcMua9%!=b2r*qpKF{6T1)-Yqj*T{n?2}3_Ls-aR>9u#2`iX) z9x3AszkEHcPXIi<4&DIzSd(2mtrzPT?3|AO%?Q1I2NWBRKK}06+oC&Lln9e=cNvpb zQ*>av-f?bRLTSTg^05$|T6>sQ!gKku!1$)?k3(QyamPI9NdfX6{xPE1@|o862QtoO z&MdR?wDrjsE{hfip3HDF(iT}6x3Z5fwPLnJQDOo`Ue=8-;0bd zxT9L!edZ&F|FdU^Pe5Lc_bhGhC-O~CWmbDXPGCkxsl_T3z zUL_rOtuOD?_ejMZP^;15Ou79yHZD4GBLg@QlIvIo=CsxPby&^Aj7~l5w@UAB#zK=d ziWj?E@KoR4s*=IfC=-P{l+=rfjp8Xcd^_%ht=Ik&LH`HF7+U>pc1HS+X?ZD?-luK- zuTkd-QS;Mvq$hq2r09D;>aeN~6u-9quff2>*u3hjxXYW{>LS>$*5u=%7aqp+dBcp_ z6tYfnZJ%8qy>=_byjHd2>T8Ue(WzS2X^}Ae%Jx@5u7Osi!H= z9U5WSA4jwI-TUq%W%$37?dRti36p6^kvt$_HS!@V3mK=rNqm_#AWK-KrLi6&lhwZy zx3ccbURjMwdxe53;aDokjN;qQ+ zq8qDH_KbR~)vS1Hhp|O?9BW1CocbVfPP|`NSgeZrSq|kyZ=-$PWAx zv76N=8>LROS`tU%2o^*ktJ0sZvF-ltf8eLz>azm0f}V9^eL9p8i1%{6g}oAH;FF!m zyOuD~V>ho}KFT=;TX<-~axO;R)qy0F5&r+!<;jHT%*!Op;Ony=d^LwXM*>7NKTCknT(`|?9S5!s2DjoLbYP(?@RAg5E;jR8 zPlgC=Kt6m5-C2bGpcTirJExjAN@yeZr9Hi&ZRh056S(%l%$5N2Sgh;yF4;TM4y~QqL%|NPO@DlBA=C0UYOWy5WI5aZ z#MSw?dn>@MJKZ?s_%)o|bU;#b)Gtx=c>EeDTYrEXOjhJNx->jg3!}!^6t zxhjP<$F)jQ!ugUW3Qz!s#z}*HVvl}u9aEtjlO{Gt47vhj1#H|M zVs&>xm{t-``Yd}H;ZXsDN>UdHUBTmhKKkgU@ki5P#RkSuYp7&x7|$8|gk9Gny)7`C zcww4U+Zy~8F8cS%Jg>9spB7&}ZoiE1p()UdFKCxCY||x4ki1BE!=TP!`Ins8aD9>Y zR-DI=2Lz`I!L;S*;lW*m{VD5w;}m-M6(uyoYySl%$;nIqzavr6K?*%vfm6Rm<~okW z>0Iogz4w;o^cGH-el?S0h{e8!9ZZyX{hmbXgA6r<(T&e=el)F<$ zePa_~mOG|>yrRiMe)Ya&!8Y3MnW@n$J$tWNT*CcdSS4q^r8)U0@wfYpFGXLe(E78j zkBq>aS1WxIlG=5{m7MJPZYyisRFNF98fK&XZ{g%qF^^+icjIg5y^5uqRRqIpTZs6X zM*IC*9r3B9pZJQ$#M-2ZbQgy^{(nZ8-pGQ>ZNHt)b(ZT0R*VqS{i=Au)-}5+5ezV66sM9_vW7yMZ;@r{cyZxK-5s;gr#Wbi!zN zfB0+g0e9Ua+Rv#q8ey&%vkgRoU14z3rGkDLkVdw@)Ub%A&Ze2%y=g-D-J{7e%!g({ zLBI54weGFhF%aN$#)kI#TGQPPr0X4_@(-0Bx#i%SEsq#Ui=19}^7=Mn9^j8lGwLVg z;XI_1>7UXny%kaVlWyH|JHSH+zE{A_J@HbqNvh^uQHKC)SE;n&UtJ)%&9lb2?Z z;`^<@=@mhCpIybqG-btfy(Ib7g^E;)e5Z0$F%>N&v5Fj*%mYNkfF z!_7!Ct#x{va7pvzkVazn@YrNnZNAs&*cAxY?JoLV?M-M z(saDMs;~KOV{IZ5xh8E}4NNo!D78P8*MbddLSC1FMI|3l2cEHd+@m$;Bpdzh|370i7$pe&$ELpK@#95E@nOa@#CI2&)Cei(T=)UIBlI8So z(C{aD>*1&KN8FO6Csp0m_tkV5hFx%H2Z@gM{G@c!w~v1x>W1o9)>mD^pE^Vvo!P>t-I zR_A9ZPD+87#bhaVQQ8?TceFMbx%H#vNlAby3UHv~4?XR*n!3$LDNX+9Y%A79>UZEY zWE==Ysvr=_wuodo8K@aKg>9S-F*?vFYiL4F5g$qQY!=-VNTe_~y$37R0h%Gh+Nv=v zpb-!kZkmMx)QO!1nyD^A?tdXQQdLNXxEURbW9U*`?l4#H| z7xMwGe{o1{KhDZxer28JpLv!?@d`sMxHl!wDaYZ_!LtvrvH zCK~OupEFdp4{Is_BHKr~++md!Dw2oL2jJ-z9_PQjo~}lJ<4ZS`+gcvJ2GqzXP+%zU z6|!IKLYyrEhOPwH z2aA2#90ng8k+}eofm%k5er(9%EOzuskQgU4t=oXtdZg#gSlc|(KmV+ZsyP~*()Ew_jH7I0VQOqm-Gmg4E6{5Lj zLVmjKQ+5Qxui+y06x*wCDTWZfcxNA@X4f@lXp3iCBNo3zsW$ z_5Y7vrCn9oRYFoOysQfNzL+e#T%u#{|DD_Sm*qW$tI@D7h9%q8IS zvQ*Uo3sHs|IPiwp?w6>?QEhcTffO;4m4Em_5f?hr&_qA?3-?MpOFs!e!mcktnEPL= ztU)(J;+|yz+sDQN-wZFE6=U`pWf{WN4K}%GmZH9-G~TeDq8u0`yG;BCJ>YhuhKnU& zy_{h>HekZhH!#Gn8_fWutA7yh6X!EsTn6j`&$kMQjq-R~jb2zC>*R6=|Hn*}wXHe! zwMj}`Tq*fcLhF3z)Z?q@eK}QXJ&7H}{KPnr%KNKA80yiwF)*jJ!WLL7qRF8biG_Jp z%L1mBf+Bnx)T)fd_#aIl^G@~}^nmLiB#{W`cJSGv6ad|nPh)Q#f`AQj;NW{ak)U@n)q zUw_^J(yHsOB=#HzzSt~lCZh`SkXltapdwMNQtBL>Libc$61!FHtX!$+JsRlsN2>A5 zNfpq)mQ}?G!M~M&S129KSJfJ7DWDo`!9-k*Aubb_imSmD;~wBTaEmyB!4KS9I@AE% z@ii9Wq9b8-HF>lfn5ug7I!pylFUWgRwYALZI&PZq!4ojn6`?j9*hGL8+{C@@(!{VW z3?x7#c2nTLRxvUcK%@Tl@r_#xCBq$1eFcLsL|oFj=RgE*RnbW5ydTJYpMS<;d}SQ_ z>T?=SQ&wwp^n*+p=*ABo?8=S%%oCK zw_QfCsn2k#Tp8HXQe9TG1GFj->sXZCoJQ6taUu4-bx_(V!CP2)t)ig;5_jz5>IU`l zi@!b)^;lJdy1f-4td~g0PuL<@&qq{d|)A zU9u<(;fw@^96o5uR>E+A!Cwv!hvm>un-8VTJkeOp;z=Y){A>R!+w0kEJlI0yyEqyF z;*GVO7JA%2c_Sz2*YM>D|7#SBSSiJ~0qt8@h18Gk$C!_Mb#F_714I!p%gvYCvifOI zQkAR4rEcf_qU*z0H2k}>brC2v4^W7%ceTaA+{9bW*X^YT*;$olY8KMf`ul`}2cKn74`@+7g znYRO5Y}Mn*548SuYjRVGQw6%-5=SIMhzo8Ht*gDb%6K`3NsZ*Y+aP^J zvyjs?Is2=l$$D4?u_P|^l4}sB^5^Lm)!9T_EOt)Vm{uZ!j43Y%%K<~Ma+byRX~lGN zmZ+*ACEGrzMUQ->Rm zOidPbhoGj_zqYTyyl33DtOCmTZ{5@omf^HZ?Fg(=o=wIQc1r_LZK10kq)%Bnc+}pt zxzv-5@FqLsCPwlZ;E3vn*49}wR<17Dww7xh?X}91sbER=9^mKt4T@s!)sB3gK&n|( zkz%1o>l!x5#sJ0OPnlxR+c|~-so=GCb*qDtCx>h!nx+}$MrC3kF0pl?opd3e2eQ+9 z=vp4au7WpP&0qA(ixIL2784ZJzrD4pY+@=zrS-uf=2 z+1BXhRkQKJ90OuGrh^Whvh}ED3Y(R*chO^X;s}4J1gF5-7;b#VjhLL zij(Q-(Ol8bQ#aM*E*W`>bHO^%ibd7l)&QJ7psPt7;l^xol~Co%tvUxe91oQTvALcW zOi+M|wS}xc!^F4|dI1iS%{=Ti^@UjtPW)E_D1(Tvv|5zt=a;25dz(lZhyf)}E6P7| z?i>wdYJR6G1J@+I`;Jw~Tgl5XN$5tlWhTJ0+ull@ezY(V=y_N6xCl%#D>*-HR{_+u z1srCmyJZ`gj~L7WM-9dr%MALYOz|KwrtC_}h`0(|h56H6ug0VoX5D8j+4uQRgbilmtkMi}o3)B-7t% zOjX!BtNELb>l>;UITsti@fD{+MCXwG#HD0^S+o5xalphgQT*DM-(K8yIQ19YCd;dKNx`5LXjbj1&Y^X*a)V>H|k5HV@ll@oR|G<*Q7bu`K&%q&e zv{~sGq{7qYVSD?7Kccr)14W{v6(uJ!ql{du?Ekx#f^8O8hZJYy-Wn+@&@|e0yh=p-YJCDfL*pj@IDFJd%d#(W ztJcc*$!oft)bi911+8V{ker9lp&=bq}S zr4?1)f;!lZ**j|x3R>K*d~5jk{y~TpZPb1tv{0{;KA~=2=joV2=Ukbr&VNqF_(?Bs z&pqBpwKC}aQ+-TdG@~Qkg4;J^t=4Ji^)VSmIgL{l}&NYnrDi{%wP9-jMP8Y~r?>8Zth3ixQh@eu#1;vHhHx9oU6w zkTKo=Ppjl@wJ-b954t3C|EGR(I%H;mj(SFX4~MDfo6qjnMS3<2Tp7F5N-kcZS?6z^ zVLL4RR6-=-_3~TJN?|Y}S{ZQL^80o65U}5aoi6<^BMdM@eO17lUHPj~`Kg)|Mk8%S#R%!d*9n31W&65#&%};zh zkY`54sTN8wi+>##I{J_{q;54?`VhAyttIP0S$|XJ_vy}W6VNi1B(fvuAR6XG33=(E z0b;moa(kE-u5Ou4Aj)Xz0leZ>QTxkIhVI+3*T^P1ytD$tEQ#>cv(s{7GOx8FJ60@a z-l<$HyVC%wkAT-|z>lnbK-`fXNyyK09``M{7C&+=K+Q87j7F0-2x#U~h-OwRMlO&# zhc2}*@VRn0hMYRAtLRDiNwhW6`PVH*x?k#p)eWK;LP;t%cPBO`1XRQ1WmCg%sk;&H zvXgZ*H3!{KgXH3HdDC{SZ=F?jXv}0YbAM0Q+@JdCeTDJ<_Nby@6a8QVDfM=BK~I=T z%n`uSuRwEuWcEHtI|60WGHf>HbEbGG@^ba9D#hid$oGEJfi&z~Uh-0Q%IENsKwqdF zQW86dvflrFJ^{JVf5?y6=)4+?px&;MEjc`9GS$SejBaZU4)vC@GH`Cc{x|j#`^>S2 zX}6_lK2j$=N(xZzWhI{f+O8aYNc>am9j7J4)tTIOhVEYy=PEqKYgeuwDR0yMxA784 zw&9Fbe7K4AJHB===Y~(m4;=T z6<=3{FM+{jBzYTOqCT!QPAA6811_6ngp8Te8c!r@m<1kvjkJ5DL`-9RfS7vkJo5CE zs#K|LLXQ!NV}+iEikR6b<;;wOQfgLX_|E+N+-}k_R$lEvY1s?c#15`OqNlUsr)6Bw z?Finj?$=zc_qM^$^eg)e!<;)BPf<-Sq{Fo#3iyG|?B}gYNYZl8HMTF7SH^a{XAiGq=y_7S!j>Xy2`-94F66x-WaI@?6w z`ozy)@p{{PnZ)|06kET;Ez;8;*O*k5+9*Ptz9R`@nPWvwbkOHKjOH5?D;wJt<(rfN zo!Sxe4g=|`RUDA0CkzPE684$}!3R>3^PXYE(g6)zqsS{oIkJAUDOgadq|{mSV;(23 zN}Upe@1KR-4KeeV2WDrj7=Bg>dy4i_oozkl!XL?2ZH)j=dJvN(=wU2LXM4DE#J1nh z;7$1Fit2BYj~l#s0F$j;m9k&=e9FszDOD%v7J z3<#D*Z%sOSp)o$B?rkl^lzZ-Hgmof4N;%ldy31YBVn@}Flo0U-n(EqV z!*(2dtIReWVfd44ER*+H{thLpqlTU?CV397-#1_sVismLOmsdi9hr!b34`x+X`j6- z1)33^S%RkgkkSM-Q_bhnypz58+R8r>?-j(vLyV+T^=>`evW5JkDv~a{AJmgY5Xp{_ zfnb;MEBBE)r_><>xG^^?%oiq zH@A?7u)zK+r9Iy-Z}9!(f67J|hR55L6b_+M>H5kLiF9YpEGCaPBJu=t1=#iE&hXO^ z?`eTpC_Kyjs-%hX$B`a&2O>|Z3=hL>9qRD+?~laz(!G8w=sI`E_!GJ;ER5A95z$w! zfW_TsX91wJIA+oGp@G8y5K007>=UH}SS8-I;fg>Z_aAKl9ZuI;5ecCO(NPzb%u<@H zPe^m^VE&i}Tj8-FmwaC(m6k$pfTo>3H_HuLe#q{Q?Nb1t<}OaT3#pEDMY<~X0vfrU zFtx`lJDGndaTLm3!lpD=^BVCSC7Fv_#>X%4j9`$LbNoe~W;s$lvKu#q!@cA661(;7!hQ}0wksjMPz8-%MXZNV<=G9mY+1C zrkoEy+3*gDup6=2!?GJ^&DV$B z!q#IbUtb#IB}l>H=JT%*KcKu}tC;h>igi7VlJa$4s|jDb+V&`t60K4Uh`!BH`Vi)z zsG<=X>SsS9uS%6W0EsNfer0FtC1~nc+O)MpZ3+pSM}sMaqm*Tqm){a1bNW)hVw2sH zP{J>)mBt*zy^Z&=)-u)&8-M2lFDeJCR?qb-8b7bjBk6q89pHt~Fj~v}>MLENvg4c- zDm2rra{AKSh5=l4fmm+*l&do|9s}@cNov-ZADB|Q2v;=5#%<&pCOPUpyx#`CqkssB z5_((Px?$h*a8Bc~-Zxjfp|reC)=ms1`x9%1`weTH1cL#q0t0#roweZJ4hNzrfTi;O zt0c*{Z)IG{(oKz7jPW7c{(G?gJ)734cgVFR{wMPU!)&Wvsjj|O+8ROs5vn$s;_$Lg zv+83^0`kYgQ`_F_5C(MSktm#?gtqL*x${Z1()ho{0TjXq!8 zJ`YB2w53#Uy`U2NMfDpPpO^d?+DAIp?mKE^7TWK3V!s61(3pXXHT}4E9QSR!!~vHI zKZb742dabMBGNk0Gt+CS^Z=m@mEd;BuQ#+h+~RM)GBvBKJ!By?e>QU( zFOOb|I0~5pP26@(zby*Nguf;Sdmj?7m}nMnD)C*6f!?<{82uMGanU6q4OXJN@ew7I zyu3jrWe>8%k01^o4Jt15Tq?Z)8+jZl#{CtYK}nRQdaaEVbK(s@(r%a=Hr zZ5TsVWLiWLe_86ySYt~inpNAscHf2-I?@{((bXE&>hSlCbTMP&Uf^U>$b7 z=Xq&92AW%FD|9M&zKFo+UELj7ToTn+MQY?#Z|F!UsE%R>41$F`(_L6j=*OMWvaSVs zjpo$<=sHf0o^A;=o^rJB++@qWA{S>l{f`2-OYcHy`~_+P1zK^1LLh#iF4Unty3T%W z^tx#IDy2Dkz~s@<5{o*HV?C5(Z(UQcUSIIF7Lr^usULQk(NW>88J+KfYqQk=3ToN! z3@aXO=o)v#dHjif{CFnAi+8}rtNMJVS9Yz&^C<^sOmUia(hI~9rD%`taT)NYcE%0h z&1ObllinKQ(za4DYKd)k9fGW8M%dNRDWFD&RR`@>nQt)p%!wA!SFT@SH z_@jGRe3JV3GGguTTolVzBIA zPEg7Pck`sA!TN%^DSCS+v{a zKWExOISVl1O_s3^dc5UjS&YV3K;NVHX#UrcYo)@&(XdK1wC`IKvkB7hY5d3F5N=Mf z<|!pU0%YJ(rC<;bmZ^HIKkJ|?W+tftlA-S@fgre`mB5LJ0qoQY&g&b`_8cIVQf8t_ z=Ap!L*-29$>so)kZql@pB5g-LxXDI&fG+?l>lscsYL;TE`mCy zyhrd5L2*wv^#i`$O{V0F*W~-JDLKwA~&172{DO&!@QGYLb9yJbQT!7Fjb)aam|==sHQfF@AXlm6co{Q|#z zVg?{OaxI?O&&mIujC#u2#AjQL8<3$ZY-_nhb*CBZDSr9m{2+JVw&H;1`E8fvd@70$ zT&0LkdkYPG8Ya)zPp&)KyUNN`o;s}YU#{Ia?p|TfwLzR+?Gp9}b&yrj1Y}oSJlLC% zSaK?O+hw-qQw$@(V<|i1#5-lOi012Oh$>rSF=OIQ-duSB&h9cwTIIEw!A#B*7I_O$ z^BIsffWy$Ovb#4077EdPG`dqL!@X!&FaPC!@owj0Vu~q*d}T^a^{Ach{U;0qK#n7( zO*N2`z)~^<+~r4D#Q2vZ43!F1=w1}4cWGjWgqaV3dKe+^NTc>E7EbR|$^9rmab6dR z%-mNTpLU^4l%%~E>^&x%g16kzEdJTtg6rj->fgTkB3vr$&^`SGNv^2F9iHZ)l=_>v z%ELesnK~sJr+UopU8b#1nmC=b#KYJ07q1sb?iCqlq4Ypp>t2_?(0Q*aFnt|nT|7ZH zPa@@fI!a`*ii}UZK%Borh3;8^tl&sOgkzRF6lpr3thwx*W(cwFy&=^I{sZ9y{oQvfNn)DAFoo0iBgobk z;xzxrbFr?p6Pm-&Agq>V2ViO2#VPNaig_Ez9Bq#5_ znDd(goHgc^?-*0-0$7tyDdnntj+AQ*OvXK4qoPQ`mO#U7V7*4}g|(~&pz!vPTWMn* zU35Fm3~-wWDX8faTsV^i!LZE`;wEP@RY~Y#YT3I!0;%2v-JJCSMm&2oQ(UiyO5kCH@N` zixhqq3)O#QPq;uZ4fA*`mK<~C$)X(QlUink9cTdGjx*j3XO?&=?P}sn0AuC9jGL*R z6d~K4a`nu^9;mF_wrA6M5=QM30J5L{+!W5T-R5z5k!PD6R|DWLNTE1~$S{*5l-VVs zb?;1i4Hlg}%`-ukjos$~_?@>eQ0JJTg_XaZ9NH9ndD{y1hOUM@elzZ_%f#!D8?fER@uJDR@ zKS98^&)tR+3LGAmtBg|VU+X3RylN`aP z7+#JXJ3GR|B2^#Agiv5%p$nCpzJgdmE5~lT2C-L+NNM{431U#%F3B683w zCqIVPY`PcpARv??5Cw7W%m)_QjhwZp$A2%M{}5HZ2Y_w(p{wvN`g^fUw%^YUh_7B99r)_i0qay9pk~)`DuP6lW$DPaF@O{(Iy^#5T&m z>xXp=0G`j8k+8ZrP&WSc=S{Veav)vKdIix?sR^g8Rq6Daie%yHGw%OF?evq5#IgKx z1gPxtKqP6dwe{(=)jaj7?i=$@wh>n&m(A3z+O!97-pEf>&$k7hi5x-SK#JiekE_KP zOXS*_uD>J=Wj^_#WHv6$IMJ$U%8n5K!z!GPj|}^1M}`|qsBZ5sN((*yuV6l~t6?9q zP#4(PI2870X^yy_kS3_;I-xB}9`&aCBE&5Kv0Iak( zBd=g?qhHbW!b7kbQcO)c4r-^jorl^BEe)DMbv@+l!x+%{d#F`OWya7 zz2oX#+@yQ(4i$RDXEw!%Uz=`eX1y< zqVapUHJ)3kcRFh)it=AH=f}hBAGP0KZez&HoE<%6O(9;FdjUevTqa zKRg^r37Y5kbc}aoRTquRlf(O2`5r$`G@YSQ0Us4~BwTh4jMZuU|D;u_kTDKdDJ;b( zO^lw=L~i95lSq>`kup5-`ALrX^wsuJJ-V6 z5gG-ofpI;ISKVn>pQI`{B+I481o&nT2@ zEHO`ATViVMwfZhM?1f{HV$)z6jb9z#)eg-~$^;aRTgm1XuwfIf@N*PW+v+S&9G`)L z`cX<)@mb{$Lra%jrvTloUrU-x9%b%LWw~lk@97Nm;W&0bt6Cr{nMG-rx^$K+QVE&? zRTCdvX3Hm!mJ=9d~w-w8nFq{37Em$-? zf~LV|I4A3^59Vgx)ui!1dem#$p>>04Jcx43G{M-=c)iJPTtXbVTP1e1qGJlrp|YF0 z-KuXsD=v2pGojTuTbyaK}_=+XEIhS&Y}j&&aB-)|l37`qh(lhOCm~y~3|lojU`DFCL?~r?VXO~_ zCu|lqk+I~zONjF>*Dxg`EUz8th=2k1Kc#WN9|rp!E%ymwZR>TnLwdeg16kA3eTU^7 zpQe4?KJd(vNB;Y_y1hxf3l!)XZc^P7WKM`GJ)noQ`farEVH{1|)s+_J`Cf2w1NycX zeyTzfzJre_5rV(M3qD`_faeuAo%U*Hy*_HEOelm(==G{>Y)}!R74ddVWX*ZG;1gjX zIcS&VKHMe4$)HvsYQxc&q>ZOezP?n3D$--Cbxa>jdAEd!q`1}Et`1?f%ULZ#bPm#x zR7Ha@iX*|sU0L51Dy8VrV-A8kr~EHMoQ{Nsqt(JHZ?lW_Rs-;&8|KcDKSm~B_p~b( z4PIg!Ep5Je=i=lnKl6##9NdV1I+!D}K$& zFZt>jKD7F>Cl%mA#DeA`&lf4Dec0HJjV$CnXW{svAc7=e?Io=%&Jb#6<>TVJOSNzM z^|?zU z%`leg#*wiCTVPY&tx^~b-m2O>&mw37N5_jI&ypSCtg)tw5R%4?}-3D38oW27; z$h&sHMEquTM2{DZDZ0|}Sg?gzBB}kl;6r{4zs|Wj<*IDroX8Qi7Z?vZIMyGG;y8Ew zBHHzI<9>v>6+Ys1!_1MR%!SvRyoj1PJpN|TaRQHVOaWuhdZUfjF@8s_-jc7|%K#77XeQ6v*I&OgcaQtiUTx^o9fc|VtOiRoX3Kgm|c++%2rHG>b*xk&N3R=n_feIAFUIt21e4VtWazx?t*Np+3!(%*0h`W`+v5`C?t`O)1ACW2pLkdAV&59# z8C4F2f3PU&Vj24X@u>5qt&QsJOlVd?i(SK%3Cib1D)u(?s`cs%mffo_FkS`n(E=i4 z_uErEPwl3a8&V{))IAKEGty+WgKg<^+~0~FY+d7Fc~_M8!0Y~ZCMMLF$h~oPu}F_| zc8M;LpNb z;$4!ciQL|$La!sO>#WyqBkzS8?DXM?#vLJt2t?%V+gko(Kl)-E&Fvc5Un{Q3(qoqJ zH6ENu-ZLRZ$$aK>pJLP#0k*(Hu4rsx$K6|=PF4_IIaP52eB>?Fa9%#Ox#i?5{TvEX zeTj)s0k$|_?Zqvy50fRI;)!;(%PixmWmc(1hjv1-()FIzyNnT*!$DB=xzo7wqc_Tqi%&c&+J((T^{$2%gaE4{vwrVaduKoC%K>RBO8e}Q<;UAs4i<{-yWg)xv z;(IjO;g4<7lbl7lA>4o=FP@6)VeX)t_7~=T1gY42t1f)kcMQoEhrZ=O+0R?=zcl-( z!SVg-7zZa%%fdDVRt74@A%<+Lz_~Y6-^C^Zf!HPN+u}7Evq+`93jF!jV~lSeGp=_U zo-|J1zPYuk@*shXmD_QfA+u*)G)`|Jw);brTiD$-M-TLsj`ex@F}iFVS0j;@$f8$N zQ{->#KdjrxLS?%xd(7t0s`<(5P|j&XT7;5zF5AA4C$Hc8WZlMztZ3x!-;BVY?Ng(+ z{qf{lTgZ=B+y3u?VB(V4ez)@&oEgjTWni?_kLboeVeu;OO2;2Cm-V5(XCr*Qn?Mv^ z9&jntw`=Uj#Tiz@DVi#;DVw1lp-jAc31^zGTSqhcX~kQ;_%?9U))m2Q?)2(fEtwADV@Q z)2`l;TE_O#2h=sTwFa+{xJ&d(~6f|qX+c%ISh z?zx>Qme;Z&G8GHAvqd8MBPl3V@A;`X0uhZF#B!jwHI;S~8!U$*$rFo91iE1Edx_#OR=%k7K}U*P_(Hz!y9+0owZtOK(!5(bXJ+i$#g^3; zx`-oo_f!jHR}8LP^NVW4xxUQj_u-z6qpKDO!5qb2ft0_*)LmTKD!!#gp?DSuYiPQA zfW%MmHSG4WKXp;$?L(!y!ZB3$!Sqih=2zk%rT5&wAX9J0|2X)!fNki8ykM{u|3$Dx zxhQwh$oK_0JS{qA#ZH&L1NbGM?gA;ixU-UU?Nna{e?Urso(67aNRM~nR9 zbP$W*v>-<(TN8R2G)r4Y-7h!af$#Hg+I8E z>~jxXkS)$HMegeWAEgUqjLt&8ao5&9*f~v9In8XnVf^^)stG^YDR)Y0z~ROTztaPK zDYa>Ls)VG@Tz2rU9&FX=SNicSQn2h_oUDdO%KO9Lrei3&5_en*qcsC){2f<0eB9B+ zS++yLL*Usn-#-0B%|1qUt<_8g@<)otyz-#7p%?Qya~VTlayoL}t*ROqL>a3<8WnBp z@lDdj$JObXQnDHsk&CFudnuxZ0l4-A<6!$r_v0|nMXz^^y0YqmOnhs?jWznvXlHu9 zk$T>CQ9fPk=%oCeHIk!+&j%_LlRfJ5=8u7ij*m6Y>=MIrsN>Spi;)!QS@i`zftVJF zTq0heAl;k#U$eYoPCK@HJmeXv&yAan`vwFEf^8cLKcEg}bL>ov9Z%fod2O?ZI22I) zdQtSWet5Cv1KouAtMxMHl>1JX`MLZqy{#9VCLDb+BZ6GZLlcOo7<|m$Z{1G6y4oXU z2ZGvhe|`ByABK2l_MfBA+T~8}EMz}Uxv8U#9u-m&s=ED1-^Oy!+*LxgV5%2q^wfvU z{}c^;w0hKuOSOJEUMb)7x|_gTWUn?^;rLT#Vd9mCqb`=8r!<>BK|pl}X17^a6Vb*W zP$(!*piurw5b*BmV=Kid{2ul&5o7JS0gRk)A}ncV>w?mcYZ#~S$%}KAi>NV{$zC7B z?)JYMLD~iC-G6@*x1l2E;|pyVs9gIzwB=HxQ>)Hx2z@ha(Nll0#YEnLX(4N-&qcqy z+gIG6#~8m>JT@}tP3*SRS*} ztP&Z#Z?%I5z{(TcD+u4subfOP=?}ymmyi!=`=ao(K>IfB9ty@;} z$~OvK-qAB|4T@BIp=~H1Xy_ucKgsmY=eF0GnqL_p?dD4UHjWQ^ zX}`@Z{U@Lj890QKiH8G*s4|*_>$MpoQ$`6 zHeIm#owA#S$)b}dpVNC&5jvz5xP847Z#%6F7ml@qxyFPRY~^@kBdstuG?v~cV4F3c zd}v0-)mo=1<5Y;pFyi-i4*Ld12?V*vWjr>I2P6g5%{d2(iheLpc9%G}ZPg9CpH?5~ z7W1+P9xjn`u9?t`^dk-nd7cRW(3=4+3J`mcyy~T|@1tSuOuR({n*yd2{(kR0ACSx0 zF91$2EEjMXvGKZhXrHsdJq^FB2rG5%kqmWlwP=oMP3qOpHiy<1z254;&EAi6&*QdW z1(sGams0ApByYZJbh2q*vI-f}^BDb5^}cl9aXKJTU|dKiS_n)g_1g@`OXva+C7{*y zUx{YRY0r|TzvU$4e;*507ix5et*W#IfH^I+1U8psH56Re8?VIBj%_fi4+-eGmE7lX zO8b50K*Zb`O=aOVVb8OI-vQOFaaI$wBDUsK^;^nws^yt`nj}5kA|3B@_Ld}xl`%nW zBv7tTEloK>mb1jvHiZD?hn)`Ib#m&eTJSm*hq6A?8pi=d2p$P!FzzIlPl<&EYebly z$g+JB5iG2+-~ALE7aGMLB(K-`qTuW+s@Y6C)e%67rCi~m{ncFp67=H&Wnx|D4qWOA z>$1bz`5Y~FO$$Nq=-VitKNCA}GpzFqyzTUT+ouVi2x~=>sE=&B|EiO&*D!`e6IT=N zJ=}M$<$K(5aBG}km%#qpg0fve0IegO=#;C!%$@==ieYEx*>r`7Y3gO!Hxq=Svr?0U z`yi(HQ3Nx<+QgJDH1HU+ulDT+YF$!ookd0*N@KtE5p_0TTS`b|-1~CoxFC+0Vpp1U z<%vIE@&#&$$owL1zR&5qqq`@{sjXnI!9(-Tm#@^l&xSsBOlinnxOyi?kbbuUxdG@Q z#VscKF$6@T5&<1$o&q=HM2@7)A3sUeeg+^WVKzIH)si3?jzF(de=^z)kA4<;|IHsK z>?jkcUHp~Dup|q8&&&45HUzMa0ZI;~*}YB@-o0>UOt99IPrNK1>f#TJp>;&@s0s5^ z@sv)LqNZ?(a)#-NcW~1|6M<^e!AUru^4x*#&g=ufc{DH+5(MVt@Q_H2Y%dX9pJ;qq_kPHs-; zokcxO;%egdi=Hcy3;g^@J2U7u_Kj*PXnsufwCcu~YGP@XG}F}8nCC3K1L6xnHIvf8 z6FTKvGI3AQ#YGGnrj@dpAuSUIDNFTn7Q2c zHiUZZ_`(d5$WEk@k)k0c1X`KH3!Zg8TG-Po9Gl8%vqCLx?t**OL@XZZr($hYIioLW z=ub~_l229OioA`8)+P()0!F?4vY8hG`vuuzRt{+J>ULe z4U-9~b8cH+i6aXgF~K2|0@M$m935J6)3a|F#DvEuv%!?_=`Ue(psTvc?P2TFht9ls=Fvc&*q%!3gO>{;H;Mhf-AwITzGD6^ z4A0`is>sMKU;zLVrqyLC&DXqJTZVbOq+-QzqH>OT@O!GiwMiv@|Ai)f!YdcIu~+d$}=_?AIDtZ!8dKQ4vn=9tCU4 zl`uyUSJk!INg2{0X5eVbUOgJ?Q=>F?o;~z@)9w@aB&xKC=@(a^2k>l#2@N&IcyCs9 zU!({2r->7lR>84HF-kuVmU3zu$TQRh{%Djq6Nx7QSOjjGa2(+w#|0avZkTfCT%pOs z>_@Vjb#z#jY>7V@R?em$>>4kpY6*GL+h*C4BR8xpTtwHeh4dN+L_(8Ns?A>-zqvp> z-F%J4lMcsDNKa9V+v-HNH>%>n{}PryvtQ)y*k<>ph?ti$%m(fe?g4bD_rgZo#d z!qnbL{KTisAe3{5D?_k{&Ia!`eHy19^y`b)&={t-z)l0%0iey%gI#aS?FAcn=klhH zVSq1F6{guKv`nHfNp8`H4ioLqNqA9HH!L9?p4J1m8rUbKL*!l(mEBZCX!2RFRM07{ zkGR>&#%r#&Jf+S0`D_f+>VsP|EE)O$oc0&jPqwCf!C|wf_e1%wY6B8vQ$KHbvl@m? zb!MsnYS|3-6ZbYYaJZcRZ2#flOYo&ATUyXF*dW_}vkCT`c@6swO zaRg>QwEQ2{9v?=%qQUFD0-KC(pSW_b(xv%E>1#49b%3^bv%flKQa?u#urYEoC4g@G zJhz8FHt_|nJfxWm!xuO`9B3kF=6Ry=`#z6~BG^uS=G!l-qRePX^?)KL;lj!rvNeR~8OW0Q6(In%% z#<>?WR6Uwe(WF(b)MvI|oNO@m3HX=KLY)m2@n(29gMYU;F=Lqv>M5e3hC0NJR~bUZ}L6$p-|@Gebg*IWa#xkjG;B8 z(pEyOySV~YVw7cs+fW_FPxh08XS^Yft!%MNMX*))9CRJdDpxK#7?C!&8g*0!k}}7o z8)7zz6H3Zo75|Jju`{mW(rt#|o}C0-N!a=QS#5VPN@!0jqR-e!>xr;27q{zEIbN1Y zkZ@?IGG}kLs&rI02Bhe=%3fecYoF8kd#3T-jPxSzuw14cfrwX7_QN(!UYTKIh66GN zewE^q<}wPk-$Rv~V3q_e1iUESKFKpmczVO`HHJ2OW;P@GFH`CIR4|6U`RaHBSq1^P zD?h;`SZ6dNe}k5;XFGnT91Hv)tz!F?F~ja9U2(~j^)05nK5dFCC+Fq}`Am~1nq*`J zqLZrq_l-P|%5nV>#ylJjvsETFRWduEss(d-SqFERt7=hJ ziZZ$EYLd0tj_OxG+w1>9VP?3!FCPwu zhF5_ytM;X?AF9Z_CE4YgVQ2%W7uq@G{t6bZjn9|_qNOgm_fK+Qnx!N9^UemTRXN2? z*-=rx;WRXYys03fh9oOsHkBb7X+T0T&%*n}GK+R{x%q@HyUhFK*)>=);Z8S)YXRaH zIO3Lq5-#jdg+SbH_)D(SQnAWuQ_rzh+)Yp)ttX?i_+j$Uzols}@ey24F6ZGmoCkw zt|0Jd-mU?|?l!&wN4qVB)YxLZ|*BT5F{_ zDeJ7XTQ*Y~l3x^Zb07=ba|0+~r6`H+EatiQkQPNd)G!bbXbp5O-r`ENQv$BIoI|Hg zn{g-ZQv}P+c3=6-k<%lXEczu?9j|))ydnJUWHwMDl9-d3K)Tgd+i~prRcNeD7~8`4 z18z9F*IhgRz$Jo6T=3T|vhl8(01!Vi4fk_UPu4dSVLFb+VV~tYHt!}=f+Drkv;=>^ z{VR5mD84unP%5-Y7QCKODgq7vIy4a-^F6g&(=~BPUDMX3J~gK$7YBS4X5j)@rb$v@ z{pl5W%;`#^ZFGmB&utQyn~msY67&+viMEO&P$U% z5vbn+>(%ikYH#(eTYKiK6k?sIpm|ZgHj0FV0rGTKiPiU$=HPO!cyTq`bfab0a@-H^ z@-ssTqPl0}BWUt#e&^@BK~Biox08%P%mW&UA&9jQG4mo@N+APw(h@1 zHYUT~u$s!*PdcIYnQ30d;KnZkDn(XDG?jP|y5Z<_N)w&wp6^Qg%*JHyfKTo(#iQDv z5=DhC9#UF|8MKJ9G_D{^V+BWgS?Ct~!1RIjV#u_$phQ>qs0S&pVj!(TJ!G-t^fafe zl$NV1rKpxNW&HwXr3gJ%iWO=F$y3LIOZUoDN34E|+jUZ(Xf-C;xp=3|O|u)Vd>!nZ zV2{d=HUSgcXZoA!#Jl6Q4&+B-<$VAh$q3r9tqVyuDON16%j|{eET^q4SEkvK912}W!$$IBc%L%< zShSS|Pi8q7{m!r}Tw~J{;W~9skd{wUO&U@BLGMl|h8N;Cwx68j^-+3GA~0nrn)FDq z#!v|f30$KtUU0UnI~TIJ1}a$$Ophu62P+e`+v`A?Vh!hnMreN)zMR7?KbjDk%Q-G5 z`^(2EwR^wVj6UbQ>=yFE9Xwvi4?DWS1|K63L^%lD7o6HMd`T)I-?Z5GqHC6eUH=ix znoh+u-mCP=IUN^7w!yS?s1?-)zje>He1qRRHLz@_JcK4EwRMmBMW#NVyeJYO{nMJ< z0Yf#jmaIid2IXn58+a1Gh{xh$I=eUztFQ0Os@ui9mEts5IMl_-Pgn6$+Mtw0(l2N_ zk^8fI-ZK7B3=*?qjD#F*v6+L~Dsv{w#S$*0TAT27eK{sCLK~uU!9s75v3;coSKKml zw~Mg2Bil~7GJD~p&>K52R`s93Zyq)LT=O($r%wp#+O>h|kX_-#>JIYImsC~kR=~#j_NZbB&S$R+{%nYGcYB%zgiA2U?Q_j z`gH$M^SXl=8>Iq-y~PoGJ4yYHn!}eOa^}k4?gmMyPg4b%Z4HLj?@ISC8taSEcB5iq zGenwAT$_4Q(l&_1>ELhvLm^Q~{8Ge*+*HRYiB}Mb{3{9M#Qe|4PZEGpIwNaX@!J4ry84Xxs zL%>smPJj`1zDXUX5472aGQOm?Dn-GE1eTmTtLt8D;XYn+R4KgN2paRl(leYWU@50p z@LH?g`{j;d=ZwBBwjJqwx;^AjVnx0?r(Ai67OYLq$IQ3EBAXo_Rn<&OzZV=g*6y$R z;~@2Ys(9uB52J1SrBFHM%h`}0)p?(Ai=%7pFztt}xeuRO1geYsWXT$@f+OCzJ3DH0 zghL#!WQbiV$>CjH;y$=fi6|g_(H&CeSay7Qem-eUwD!^~fTYw48yE-10xo)`A`J%m z8wP*PLazC$9+8@s&Y_eeGIw&WzT`3terq@ue8|rT-wwiG!>cbszm2ZhRZWd2)-$H9 z=kgL1O4|q~)JFeCALSWg)8G`{ZCy!`{T~67Y+bcDiA4<2v3n*V#H`(FNIMIOu#Ug> z*>x;a7D+~^XjZ*?Oj%yxe4;Qi<4TU9LPVf@0ji*W@$9q<{i+1)`%wn*&D9cESAbY$ zuTp`Cz}h!sP?xtCO$KFX`0)Y9Ebc06f`ih!ibvok1*Qi@NHF6H_i5Yw(d>VLDNAe= z|8|lddP~MFthOv`IObkMAC!aKK#mR4jK}W#iAci%^9~lbg?e6|iSq@k1N5w&3-<{W zTMKX@a)&l*dHe+2x&k>t^Jvd|VOTFWcSJ_%*KDJ9F8G1It5;#Tc)J(eEPU`veN}47 z_XgA=lw&QJYuUr}CQ6@(LoXlnTxNN)&sgjJ_owr)OeR>aRzP4}*n()Li;GE;#plms z>B1+k=MmMFno&N8vW$G>ZegwojsSw|!_%Td2P1jO_I0BR2+nGC37}(d<%9|G)ol{*6zB#{|DWjaT4 z#v@dzZX z#l%nJvdmzr*;yK_msj95k}QPTF-(NQs*}JK@h)5ALx3^+Me0d_urR{RG=EBdS+3b- zBG^q#k{p6v!rkR_Syqk}sDF)^a7iUPmDU1hyOZ#U`5^7pra`L@tOaO=AMzQJpna$p z#0*Fg*mp4)rU}p<&jwVzvzDWMaP~g!2Cs}pE`(C-gY}2e(wU#cvO# z`eNp_|DG|AMa<*F#n0-zkZH~cDn?K2dMfdWmDXJB6nR%W?$AwOoT}~y`!_q9`Npl_ z4`JTZ^glxIV*ZaB$@iRBA=t1oXFO1dl{ps3d|GPu83$~aahwr<=6%hIbWz`Y9Xgn# zOzG@^tyEZ0hmN9KMBNLPIS;6-!S+o=pcamn%S-&^*P5K@4>vg;x(6A{){j$u8*6>J zk1nZR4%P0?k)%QoZfSJB@!tDTt(%e3$CEbFZL{XyYcl-O);^j*KFI7gZ5y&WDn~o- z62gl>>x-r4%DyC%bA?T*Q`F^$`{j6TcK&)95GD&#lCVik5&JDGeBlW5YkzBZU46*L zGHQ4;en&kcX@gkT0Z4fcDsiBIW@1t*3L*DEn?$=Y1Y9^Z`s%c^9hoMDaTtTMqoy%I z*mvfB5GBWkdvBxRxB|f_S6vO(sXm{O4ua_-ZuMOIkX$QCtQE6IVYUb+5eUMWodON z24nXl_W2*zG)Ys)=198SThv8wE=y+eFviLck_RIri?0K`Fsl3uAGSb0XD*61 zcgu%)J$N$gZ+0xO$^pu?-G9DZ(`{TdY!Fa$*)rG9!_wR0s=aaL#SnQcUAL|x1WxGcx5b z-qQ0DLbycS)7l;IX_fpO0X?;y8Dy#&$b1zXMVsdY|2WNu-;Yy9x&Sle^(G0x2*VzD z8!NWY2M;X3n3u&04#cF+f1$4&>baC9^l79x_LJxR=Td1`_XjmqBD%AN=j0k#ddM09 zaMJPFlm^!}$%7$k@g0}j%2E;*ss^|LQ(5y(u%jwmQBwS=N=W$SaDyyP~9-*FOW0kAAZB> zhGLk0Raeb%K7yys)1UKHABevcg=aYzwU zW+rplWRZ~nf#08F1X_1<89faGQ|$ghAW^Ky@aBmz2J9CuWJd+UAcRJTX`1Gz{4|ngZ}NY4InudXO4AD>xaEvd0Id^RMF@!`E?E$^7Xs{yL1zpWyxr7dos>yx-1k^ci1 zbHB&(Y!OgG`13sB(7+5k1+jfgi@FOQBX9{!W!T=8M+gvq@g)i6XJ{Z>LskgN;>Ba4 z&Ycw=m_xSZ1<_>{`;ZtVk+~7Vr_bOMeXi9lrSu4G+AF5KNxLW~M^?Z&U8!B>X`pp6 zj)I8T`3;Kwe^u-puu*;6DIn8j~%Bt`b?sJq&qp2c9LL~@7$-O+bDp{*q+rB%u= z9V>*qVWDTJ=Wfydk)!2I=OQmAO&@RqYNppFOf^U-llEc%Bh*WWgYJsp=XmZRJTZb< z^MoN1RU9$%tju}eIQ+E)Y>FYV;vKs8{)Y-pjycWtSxi2Ul|V7eT%{f3hZXbV z_1wzeJg!}%BQp2vS6qEssz?k;X}0JwCDz;dSwK-m?p`=N|K$c+r-R~#)^O8%#@_i3 zM?}2cGsOek0*1*tbE7+KB>9;-&l)qvuI199O*x+@*#Q8JsqlhNY9GDoIxg?!E?^!J zZf7KKoNGj4El-Uckb3>}a{j*|!RtF>SJzb4vj#@}k`Usovzlsj-H!}dk$_xjZvg6S zG!`x(;!UZltH^+G!7;R+Gj+8cPC&}-9~u=M4ZaWSjYw|t?yePC*6;$Cjp08Rufg~3 zT8Wk37SP+!zR8(i%^wVtyjh&A?C~o|X`RQtQZ6Y^Lr;yr=L0?#Tzm25*B~CW9roA$ ziypC)9Na99Qrr^QERK6x64`{!?^goN+k{KhZH%nLY{MS>`y^oT@akC(Pkl*RbzqRL zz!)Z^4307keP%^Y`a7^LKQZE8+c~r zDNndcYd0sdW&d>FucNkxSh)nk4KF4&#=KIub!q;DlG=}QG=9!~Ei7d83t?RJyYva_D_!(9u~ z5#CRp-hvX%66N9Lx6*qg%Pc4G@szLmj}>C$auRYA6rL1R*|lH&z_k2U3MwJL;wF%C zimj*n+qmc9;G$nn14cE!+LQPKI;ly-!tPkzAn)!IUJ6u3w3K#r?PbT8;z-ngFVxG+ z?W`S1Ms3q(@5GvA5anSgkkrM!%hQM^YV@~8 zpX0DW_+?3AO552scYW2KCeer^$9N}(qw@%1&A}Wbc=8{|clo4}NX{X}MXH>+_&Y6! zsl}%-hf@>m!lVof<&o)>h$J$p$*)|wz}lfmN`(C>wAmVbb_oGLMc`c)kb9LANkthv zvatzs^7j!~kG66dv`fAs-#QoaKy`!Jzy7p{Q|kzs?k7j5`_GDf?A=@VXoKSV2YkVa z)Zn%R%n4F)Km0k#<6Nm}YwcC|P2gx0fy&yBUU4lR9Hx4uPsSfHAfr`fQWcU|S^#F+ zFBk8e*#*~)?#8TL1;>I5v*%{xzry?Y6oi(MK)e@g_!+UmN;NDl_vEpbM(OC$qX#$P;=OD*jHhuhvN#MALo<x@v(*c4W1gun5`SHu91y70nTdwWC1kgV; zOq3`62vpMWP)rQ@ZhW>6cjUs8aUq2tir<5$^RH3!WcuA4ci}f3X7zqtAn*Q)%|CU0 zspXcv-7BWyN3PUT-U1hL8;3DQ1zOK7W2y^VK0Jz)8{!sViP}A1w~kYK?$T}W4(h<= zt83>?iq3y&;fv8qfAv0;s#kd6iOO}|>5>v3%BV` zxDl)hIbr0QpK=9;@5GFeD`JZ+xrLc4v} zUepgCf%SUDxbN4uZ_=v6(#`I}SaZqO&P_{fNWmEk0?L(sb%{Bh&0N`n(F6>qIkTH z>^wVU596csw9`&=2nbZ2@wOsf+tT{xG}SLSQgcHuZ@%I$CX@g*5c?f`4tsi+zVG5| zd?U?W@HLT%Hk?w&SY-NFLmXdl^!^$tyCK!Dpw4OKWH_^e2`Pci$EVG(7-RWd`hDVL zD@=pN7my~h5i8@**IPNQu*+mUQxW}(qKyp)pq*KbR>sA?cf1#&BJcjWl-1#ytD-*Y zDs$4048p(PU_W~YL|dm9J|Z=0=ro2yAq2{CClgBOz}$b09F zA4t1?PkBXvu^ypKI(wqQ(TWgKN4oe?9jKu}e%`Nf?XwmYGO4s4i|Sqs$+`>5c&mnhzvm8i-Xmq zf?qi2-?0t^T6{4`v)%DyH!sSrC+9*d>|#|$UYgzU8D)VCQJUA4T$-`xDsD=xG51u{ zPJ+ae)a&ayl}JD8%U4I>X2s>|bWTMZcaIxKvt!@|)Av9n;$`04TVj_@*0mrv$*4xxGmbfo`YK# zD|26?z52G}`NN|Lz`q}f{mSnmwZU2e!agvavC$vCl8L=Td~+why|X#J$|KF@B4R*8 zr`P{R)M-_rpiD#w(OP?WR1DFS6OF5H;vtp3hKYpvP)DBmR~epG$2-=XeF$O4SQdUX@M2!D%H*O zAHy_gO#9!+1}~7myh(5?W-}hV0K{s~$;lG~T3sU3jDzbJPsETR9|R7zu&*Q)tFCgv z?j$411vc-|z)#4Q=@5cxqYN&;8(A&k?5ZMR;e@WteL>3wlumZ!_1sJ;&?nG1=X5Lu z%;l9OzFCb;EPxukG$udMk(=WK~4N6uQ8hfn`VV0;@ zKc6p%Sa-8VT|97cuQ5w;adug4A5D~)Vlp6Jxu39&^Hq8m1}K`6Zlq!CWIP`i%bhax z3BIA&D)XFteMO4m+)uv$*j+wnAhH-v1GXJ099mI@oqcV^U57(WSQ|=KToLcvm3lc| zA4WG8PxNgU_p+%EA&%^U;pwg*?HO&+UMYIk{4J?%vEE;^U|=3i=ZEu^iP^rPvy_HS z_{|bx%80fO$vy{y&}lhX{i&ngiyoi05n*yaIT?1Dkkiv=Y#FvoD$qt#I`_4Z*X#LF z4L!WLv<~irCS-YIPR8dZ@=@Q_+vDGrI(P3Hy^pq!FMiBh!-fF|AA*m6+{~$$DkZve zytvX+YF^+1N4|}TI zmsrKUT)@ppj2FE&7qL{c;MP8z)t>L5W0=2XnT$eW<|SNkVE;ftuK>bzz-4bk!nEiV zG`zF4+sM^y-`xArQhh{-pH-6G{NIW+vNg>ESCb>W}U9qdMA@$$rzFf-O zYs+DbqBU7+hP_tl@(pvYuPUdpVZLSgwO!-B>tceY74AaWMwTZRn=rXIvw8?^sJUnv zf%D!JA-h(y%1ZI<%Jhoa7kE5ke}}`ZyO`ba$7$k4xt+K5EPoq$085X_#jOhjV2)!z zC1*-sEJ3RsoK%i^;S2m)MmTQB*D7tD;3aZS3@uDFFv<7<2T|W@-f|wB`CuV0M>ceE zf=aa#kSo7YoUa|AGV6@e5)YzVqfo!1sz+nhjkFY%TF*ylTN3pGor-KrmdRelkB$Uw zIIxK7O~Qp+vwjg%*AMKxzt&3HSC&Vyc|P{R!(oGVgEo;15h+UrGCx5N1R1ymi$(Y< z&6r_6LMOeRZ{&(n$IgLWTU<_9~v^ zTVu*fGm=QAz0rpH*TWRbaDbPvH{Jsp;bUCB&DDPFs4r=;xqnDv)T1@m$a#8Y^!2aT zQ&#e<)S*o0@oNjvY9e&*;bwh&$bst@BB2^Smt9}O*534GB(?eVIezSLcrG{9?1aoq z%m@eF^rMNTqFRuSam?Z*py-*|JG#2w*G_aVPZz96cN}pF zdzy89(bt^Q3=>)U{#%5ToK##}Y2nTQpZJ`C*(BEH}o2`S?6eHRAp%;(w+&07`f`y9F4qY zB7F`$Gn+}8-WOt`P?LuFXn}0O3&MwWK-dmKx!||yw z*Drzn7IUFd+2{``>?$CFyaoTu)Csl<&I#SRA%ZrZw2E+b?e=PQ2{;@`*kvNbD4YD)N;dRKsD~t1rq~-8!mEb}Hg$WfnXC zQT>=~Qb2F#x&SomM_X>vN6H{ce-ek7<0dFON1Yq3hC{FFNU~N?{Jq2@!;Hazqijf4@dD8&HC-gm= z3T*hzNDzPGZw?a+5E@TS(;})AUDLBH`B@AG5|x)Bmny9#Sjw-|zjheSKMb8Rk3H&z zcZhtEdjm_=5%!@abd2xMT8<#GT0<;aAf>MM1y|}nIX*%e9TZ@k+j~W;&^?8+eNPG1 z5cgRWSkBZ-4hLNas`fn-{rS*c@Ajnr5K{LQ=lPtr?bU%HKnYRWl%yk<$ypfH`6%ro zC#>W|^h)%9h`1LJ{F$sCk(J!LrhNVb2c_HTb2AI=W^iP$z-n=>Ib(>IxEGuHjABFhf0djDw5 zw1cKN^XOUv2rvE>nm{tW;q5gU9Mt(Xdnlp%v{guOcYpEr&zH*eCy#4ml%EY3fJZkP3~DIkFHq}K$&)hh2O6+N_Z({3s6@O zx;57ng9f>{Jv6^(Y0?m)2B{yjR=M#Qb{mnIalY||H8(lQySh-lq_a+B^s2u7=rujm zZ(~anVhN^>aCPlB)e-+eN%Z*)ON2Sqi_W{|dpam2SLloyf1R``OH}1()D6+)%Hg@c zOTIv?xjZiXu$(p|YcJ?0>B;GP%}0t+bRu&g`o)HS8QTRxJEK19gV=WuJ4(L!dR98! znvPg>)QjB2$x-PQhDqsT9Km!mryi;Av0Y*3qhf%i1t*$^KHruzUi6>i$V61VlL{N4 z)ef9ajb|lX_!#3AeKQMI4?}8Ol3T3YbpwOjbD1az#5U8i#wwaqon;y4VyVA|j<7X9 zj9G$;pz76@1FX1#IVm8D=n>|p=|R_}xxzuI$CwYyF+t~@>EQl0m`^$p+w|awCdpu6 zr;JfyI5@}|-LO8SFUu?`=1L4Cr%X8ZxLkCdy3D$6Uy>)QD6yYrNizA23j^MC=Mf^d z7^ep+#~(lXGd*td^nB65B0_GtnYb?LkS-~0ZfCaT$ZTnR{p%xxJEu*JDr21-1Pl0i zFetyTx>mtV*8vUF*61*fTfvn%JGBUhJ=RxDjNoaJ<$reg1ckUD?MUb{dmqsx*at6Z zMQ=lSEoe>FH0Q8Lg*77YMz<#F52%d1tNb|>p>g!i(eavvq!_B>`q=uZpzP4>@4-t^ z!ACGo#xm|7Px1ks7D~@*Q(E442~s5Vv9``3W&MxJC+fU&imwIsU-dkEIb0+-O2R8| za^|tEYM|G>a8solS-HyQsV53M_6;z+Di{XO2rJX32B^JN(`8GpUvn*D=`_OLo}YI# z$|%u3%Y22-$9RxfpSM+q2@v~v2~p4J&zo~kYnl@J9=PK((*6bkZ`~i_ebW6Ut=c@_ z66>^A&~wYY-+p$*f*RVr2X#nW}G zFX!`u2UI9{Wm@V{BSob8k;l;NMY0L2EsZO6BGJlgn)+eTq$?;27}){3xyl|MLH{PN z!+8xnu%v@ywFNlc?tr+?8<$*3ijf6cMqcWLs7#ij&JgcrhtO{ZrTyx~HzcQwzAw53 z)4Ex$e!deNWR1p^hhPE}pXo-i7%TUwi#*yTMQMh1X_|t9@(^Bw-r*o7g=x81mKXMN5WXDNO|9kfo)42r#d)X3w*NU9*D{f)KB9o?s>4lnx7 zM8dtMG@V=R(ZNk2ri;P~HoPdp7a2T5sZos=ba|8<4At(9(AX&n79_ zy1w()PO$Q7nKhPtIB-*w1zkhS&HeObz43qVov&W#e#^kTn$y>+ti`=1u9>#U6nQJ}|J z*Q&{3sr#93C~{jP=ftE!TCqdPlaS?%5bdX$!l`$b=jSU);+J574U35`ze=kPx;%19 zH8%g@(w&tT%#SGzAZjLh@LY;c=QI7cEDDN?zrqbZa&-+-TSPfyE%b~E$8U6t@HJh| zBc7*0^=OPGa!n!`MPXVg_mG3fNbXzKl!QF&cy*echF_oh*OsKT)ZPaAE&Vp7^*OeN z&xEfkWM=?q`ytdJw$NdglUvv{c3+}&Z3&uifoEmR(Z*|Rq2l6^fYkf#+6Q`zz@$&7O@#9$XI`r>R@#S7~)QKpo7g!qJL zotFy3PZcu!GwMt^n$VyYP3nGp#7J!%D0+t#n*A~gIpzxxSrh!=l;cHno?gm@aESL% zO7bM(hvu`zt+1QpB?<=o#!2zFKThXEI>5cCgwr{s#ha?x;wQ_PXG*i4_AKaKmJE-s zMlV_neg74t{q&+SU|js5`-;Lpk7h@eA~D@H%O``R8YDdG6g_fLQoN>wLObPhYhczF5-=X_Oq)l@@l??xd9a5v8BnG=^NgZAD( zJ)v>zEMkW zHT_~_n(U*;`ki^JaDZT%4!zI=h>;IW(Onwyt~ir_%(Tesj=uvNXgf<7MMfbMkD8;5 z%TQr|(S3r1315tXJR!xYFzuxD?n=YP92^%bgFXiL5^PhKyO8u%axV zF_rIch8+s9P8I-HOpN|0-kt^9kWFGkJWihc*Wm68*e3CH>w))XPGeXn&66#k4+blV zT^bYljH@;wMQisgap{%EF2+r9A+_EOH*5N=3i4D3^O6Ug*2J!GtjKD<8cjc7C6E?wAU>{Tp9$OQ+ zd+sJMP2m7EL3ugl!4&vCBkIQsqABe3xf+o{zSIJFr9P5+0oObt93G_4y)S9&*kDc3 z+N+d}u}+?wP6=IPE^-5^l~NVGVOu!+195=Y8m8>Wr$*X1C^}U5vgt%-ZE}HR-$RZ| zl7r}pZ};DwLqAAuKUW}oZK(4n%E)gNI2;-rUw^9fo6yA!v8od>aQ0Em?w|9M+U+1L z3UE9E^;#d!bGl7qkB)XNk$vdPHHGR4Q?xtYbO`Y9k5S#!xv;2=zSJCwz7CEPg;4$k zznKP2+9V|_+*sV9-zmFY`>E;>g0|dz3o3_WAx4#A zMW)WaXpuVVbgKC37WhpMdTED|OE(O^@$G9{{3^n`3(=u?F} z=au?_m?mAxr)*FeL%JrF9cvxuzx@2u!TuaqU=vYWA6;{b(K57h+oDo{LepO%VsB|* z^KkcU=K#LoQuC2c=H2}H?H5&@e2Atl_^Z!U2g&^H$Yx}q%|;;|Fw}z?k+(+CPqQdj zTVFVosP`V~*EBl$yn`&BJ$nTq&zK76KIy&9Js{`X0PiIa1-cS$*(+kSlgG>Gnep{j zW~(?kmt$Iip4lj4HDY_zsc{FH|0%lesHEOL4v30dapA^|iU#gkPTVDKTp@VM%T*9n z7@M$ZFE?XORD_1p>NWAl=@2 z<8stsHHwB8GcywC5PaU%NO^fXdGb-Wos0UgbN8c@Wkr9JxsKE7Vh1R}9{|vp2vI%g ztJl#f`Ts^=?KEMP*_q*=WBA)aD?MoB&C(t0WxwPd*MKq3<@c6Y#PvdTF0+ko2YMs| zt=uzxsWO7voM4i8n$X6sJiqm!FUIs-0sG`DUXSE9)Xc8ad8M0m2c z0NgUc&Zy@7eu{mwc|#@vhP#kmY3DJTDt_Yng~#gEEav+9`HkL%iC%S+QgyWvd);vh zUz13{ePf*Ath4_0YApIeW-}(5)*J4=?7g&n{+wP0E>CVcggAAKEXk8Mt7u2a;Fe9U z*R`SgdN#L%D%DNiB|TcVi?pWewLPQns<>P6+!(oexcj@p9d{K=a9h?QZaP@LidKR) zy?3v|+TSSiw{Zgumdm_eR9;3F4P}9wa>3m3UI^ z&4(A!{7~@0G4b(O=b;_#@6XEh(c>^ip{bvu00>IZwXjqx-@$V1m60p8a-G6U=HB+6o_3x(PirtXLL;^d z1--tPO7*&m2qdn1-)*exsW(bLPaz6F$#^|)YV?@SRDULd6fiWf-;k}Y8MU{=d~;pc zsSH^Lo$>c;`m%R0WZb0m{Ed2?#x&csVf?H66k>^>MhGwqA+e~GzV5$Y@KGP6G-u#R zycBU?CS?68q)BC78^;ajlRYdmGA)jn{S~1BMQjWne&8CCqQ~8KstDHLqd3QvW7(?AL3~ zXPVbVdKS3){5~T+Dst=0?)=vwz);Y7+F-Pq(TL9^2Q}Sj-0l@syRF^cW@P%$f$xI{ zE<&$igMB2VC{~}Iv0*)?IeJ%1#X-p(rGAhJ;< zd)|LybUeFPeZq0VXP;M3x6z*I?jl^`vfN=K;9%p9IPP!!imd)BpgR9Nfy=85LHp`@ zW21^L0SXX~uxVSIU5)m)b&DZd6R>sXsv=M?<(gPZO^6fAsiL7-DKO?t%?m zOB?Bc>+Ba#bZ|)W%}Pf@wZ`{qDt2KIsg9(FFzG#t zrC4owpqq0-x(a3OjID)z-!Z0Z%OrrRom|uv>P;nUE5)}(w%Z3X@9$O}b7*>_HXx*~ z@CQ++mM`@^5AxBkD|KPS^|e<ETjy^}cmb75dv796#l6f<)H9=2Vc74J~O}NJGeI-vqhQaXL(U0Yt6TiMZzgT5K zk$7YXqBL*ZyoYT%p8mj1#a3Wt-BHf>HH_3+<1m_Ebc%n+6r0Z8hEr z8XNa8%=6+lwTTBrqgBxs7s;PWqXz%MQ%pDN2EH1$rXK!m>3&=s{XM7P8RT(oZn~hs z!|ask%DjzZ4%{E9yUy#B=3{EjmK5N|L&H-l%w9Ew1A%&ZBlb?p;r2`S0gR8vgXI^) zw?9)(U7#5*#$F5V;F>3E*?iSH#-`(-{PxdZ7?ltlVxmoKQyq*=Z-zbe#35+^m29VE zpm;8iN_ud{S0@*o=(I5yy%J%gzovKH6)kV2{01W-Dx$nm1{@*!yR{u6vbHK*44XIP zaW;w&$dPCl? z1MU6HA#vhkyjZPBezK*lyUQgl8_i(5X}7{y!2R%=_TaXno_4ST>&tFmX7ZjPNJItO zH%?)M?ED31;qFzXUk(~MXg;id6CM}i{CLr!$y{30i~k zI`r>E!?^L!bw|gx=JI2a{X`#H-rq>O`jL#S!JbHypj-fDJLM8>+UIWWOg*nj$Df~T zs}%T8PtjVfuo+Gga{Gei^uM3&2O9h)5wyQh300@b4@#{Bge3*})@kfZW^d8y=RMAj zxL`Mr^#Y0W{snR!exX!Tdo9He*PJY!Njj5mjZZJ`A%~vAxNOWDlD{uBN*;AD4Yr2d zHTSLlh|p@`@|;%xp!((0V&Q!0ZzVtXKmyCfsIu;T_?^oa?ynSBZL|#7S~O-FcU7n!9lT2*+QWM~w=^2fIEH}l~c14ILpz8IT#_!I&@T}aZaQ82jWV4z`1N9tdv5H-fWuhEAh-r0+MYQ0^V%no{P~H1{eiz8G`A`( zBAFrU5#EB>4Uk^7H&xdXlzY*CEU=3&c=!FP?UUp;6I)ZP-x_s8YPXLf)q86DogR2@ zZP;K{T6?ao-FrKwcKhyy^*-&5Xban&=-jB^&Qi<1FsdrnJ9*gM@0+AC0)+<8QIp_hUD_*`ShoI@%-^dm$R@dkGvc zQ0;oE$fe0!n8G)i*=CV&ypHenJvhz0Ucv4~T~z!`q1SU`^j0mXOXqX1H2$AGctA5ofnX5U|h zkA*Cki1o#Y6o-wSd?X|qUG`Bc$}dfIpaFMOo7+S?@fmzF{ow&%wEpzen^j!j#eE$| z#Oj2R4v(S927MrEY3Ug6YhahTW?}1>AciQ|itn@d(B+HO;3iMMs%cgL?c{t=@5v2! zAXuZzpWUm#*gRXD*l9eZt(6@6AXU9lRO$IRg2c6rij46%&s!dS=-9~lar%C>UH7)9 z!Bge7-MZ^GB9Eu0ORt*ymKswhG!68^pW_9zFR=P*)eJgL0M=cb+}`D#8+V9P>-Eui zUgTVG>+Z)P$M>$A?Jrh#h=?cs;}Yrva~&^4)iXmUuV9M(P3D;?xcQ$p`bCvOE$VJ< zp{{L)FqdMn6#XdAoZ*0{-^Ja+^R=;lTrvAp%dE#)9Yra`Dra>hmxk@v;kVA|@yFN& zyI)67Ry;YH9ie_SR#Nq47 zyU1_DQ?v|)p>VNB>ndBy#O6|5eeOW!&7$?9mJ+#@l!D};g8UF01V+c}FxK`}bPvtWyU}HxM&iDrpTH9b5BWM%joth=Dw_mB z!)vXT?tu{=d47Jvl*_oAI^suqD^0xiXLsi6V^l1E~ht)?zMmW^v51C)IZZx z7MBul8oI>R4TS$ck=sjKq8`b&>eU)M{i zZ5wleX3e}W9OJ3cgnFfG1_p7lrA{%9b*8k^WaxYu_3rgfQpb0K=yQ3GNd5`IlFs9}d`#O%Bbk79oUP zLS|m>e{KdH=l5L=`m;Iuf>u_9<#QGO5Wm?VT9dic*tncCSHmkI_Asks*Rw9bIYIhF zaDJtG^NIXF=3H=tx157^lXW9APs}(!D+z7`%z=gsO8~=B6$mzjuK@pnqDb}^t{9O; zyh4;gxoMr|G7V4?MYlppPRPYu0EXpC#0i1|!AU@vMWCyhE{0^EE^8HZn34x@vjd^H zC4T})zZt;b6N#fr+!EU+2WH7~LSj$1)9A8L5WHLiPe%(`x&(;{6{{dX15~SNxRy$;Ifz2PGAZi z1+(e42J@a|ky~kUFhxYSEu-7!BiksAbWL1AR3({|4WxtF5DKToXy$mKKon>Qr66d8 zXRSv-@w7jX)^9hq03g2YUwO&(pi3k{I?00s0Rj@qPXZwHRyje+yOdl|Th061y3c>j z@H6`E9!GWGyR;Z)X>(=g&%f^0bQd33K+)iSu^&As&}i-C%fSsosDumPau-|cKlTe&BH~1?tpbd z!sXQ`#8&D&AvM3H`=^++jfliqt<+xw^FzG8nmQLJ=MwHcpj*8fFiz84XFWcQ4cyt0 zdTZ}p-ci(oXotM^jiZk|Uy2S~?vZ#qyq`jy6*}V;ReZVZO~2SCOX7t8GY;A*E#8Yu zBk85@zFqfPB}k}IzGw|`g@<1K-Q%QmDK^kzf@cmjG2VRH4^i>=cn+9usc*F@5}K&Y zqcAD0D$qxRp7QHj3#&gmYQ6<-Qtymi^o+F*uA&2O0JH7zaT2sOCdxO{L<{}Rz(EOA z?=3zmv?wR(_VsiNZVLiDFvKB zfb8Ri=s@PSLp6$$+_)}WUYUXwq67XtAM=Vyy+^5;5(&O?F0S{xj5w4UUgqJXelXRg z+FF;z)8Up%eWPU(nT0J^=S5;bp<(|BpxATYatg2b!Gyy_N>AF{k?KgM{;schlDIyE z7(fm%>&-OR712M%kd!zQdA`jlRyL3?+Kzjy~_iSXu^0O}+r$B*~Cr9E<7 zp{%sW=J)YGw&BTs;iBB$xRiF$_)z^VAkFvDW!5F;m!ar(BW8La-= zS~N$f+&H3}-i`W|*u8jTz#URQ`|hTb&v7>V)u&Eu#-*~%~-{!mPrfX_Ahlxvwc?gI(%s+b#(~Mh211t zxX6^le_ikiP@92;k7LEqU++gEfzSyTe?R&at+<1Mb>#`v*wl@gFT29|6!e4fd6q;9 z(fy)GWDBex88W2p;Ien)7E9v#l%*dX(6llkQzUUR@Mp4^cHgCFu@^T~s|$1Z3)Oh{ z6JL4zb`doJ>_7Uj z)&FLW6PICz_i9wQ#XF>!W*4Nk_tI3^G)u>y8!uQFg7MR7DZd4d=pB3!-HZMKm3NrC zt%&zr6B85@Q#Ie$?HjBy^lWPnn~lp)1h~o%ku_^L@#KBa+E5vM%=#)}Z6-DN3)vvOvDb^CE3UCjr5=geJVD|M~aHE|NN){*#bp343CSn)E50qEZE|)jX27};= zxFQt**zSrQ$le~Fkptj16j(7+BIkfXh|0f0T!~87P!MZ;Md00lG0<7^l{=ZG{11dm ziZNZ96HeoiPs`=AvA5%ftW?eVrXv;!JkvtjS*q}=H( zXwHc{i{?F`NC1u@EIf?CwO*mm%h3 z%p{_$>nXNRvfc`sSa?mX+d>Oj3a3g=o__l5p|>|i#s#MN!f;t0FRe8{~c2uP}Z0(qzjAOM`NQ78+ z%Tw=Hre@6&;F$aLV2Rf%`P61V+CM{GFNUrN{m6%RHm2Gt+7NPqnnB395PC+rYP#Ip z4f~P+^~)$tDb?_1SxRW&#d{}ig?@FxLQ9xe`M56R+1h{nq=Gi+oJYUV4qpq+40lHF zl06?5R>=8mg4!#&U!S2$WcjG%=jU1lLhEM;4fit&EojJ6LyYdwyuNXMGOctH+0=E) z$7;m-)Rl=Xq`@a7o5N{)+eS)Z&AB_3t-O^_PXlKPu|3ObtbdBjc%`;^f@;ICEf6u; zw;typ1p9IP?bOu;p-prr<_RJp5kq0c8Y)8a(V}ko6-0efCtdTus~z-8$25oPV7^aC zD`iEhj!#fjr~Zyr`!WSf5o4;9ER;chp7ddvUKVn+I%DO?G4Zi^l0|#&-pE7&E{EoE z+fwCcnp?E@LTD3@@5G?JKk9sA6zRG1E<>fJ9ZQ+|y3g86tUGDlX~8m&Y1i*$G3F49 z$$XVz_i+s3TU%;IeaBrJNlDuZvlx^08Kvfexpwz-U5ZCW4aQ#G0^m_odmP?vKLqeK zg_GUCH2s^s*tXAXZ2h5Dxw*C=Z$QNtO8lKPA1*;(C^v1l6pmnrP#etJUUE6q+%_>5 zs<8u9Kmhfm;9+{7w{W@yl66ha2UEaGOc#syV}^waXT7T4sIrkNnZ944t?Y#Z1AMrZ zF)EE3Vt}wAHJ}(c+gTkaSf*Y;m0Jz=-7Qmg+x)inR_sQhe`kfnU!%E4Djyq@*>DXH zyw9LByv=RhXiMPaI29Z7@JVYp+Y&*z_eSTU1~nDq*z>wHURyJ+yW)4VGE>O19bp#X z059qACRM@I3Ca2L=2i3u%tTHJpWqtU1=6uE?Q<7Z?=9iwcmDo<@dyAyDM0jz}fpq{-u`P3*Q$5Rmk#T@lACN=uR1eEj*%RE>rjMr;kY znXxL!h3DIQeiEjO9#j&cRFRZP9*j*6m_$+YeX)+HXb1d%S%v?7TZ0LU2U#ad*Q`qz z=Ql`7VhdEv5qX5dCJ*#!9v3(~Pm2Rp9C281engwcOnxF_YQT3m7yot{2VGyq8>Fa? zX}+Ejfk#zYv}n74wM1XI?$-@WC$WxZg7|p_{15=lhGf$E=(AFGFSKi7N=vl^IJt58-)CIel%L+Hamqn9 zcG6$bDt(lmUxkY45Hugal-jCs$STeQN+4O_9PVp7JEEi+$u5n!l8E-x4=lT6OI4p! zotn&5P*yT`HxbpGVAW?>r?g>mC7iTzVeaa&zME&+>b8ktfR>>*MDg&T1*&R)LdZNJ?L{lWXYUk_{9?)%H%1U<7C643bpa>eu z9|U5$G!`Kd6N!~u!`jpP#)DIp7V*y~M5gN<4v_IiCeC*(EpxM&&jD3>Ib|^BqIM&x z+D`&mTeq$LFxS$l2wbkI@<>{H8dX!mUgTVDe?_{=;@0Ldqs8?CO{~fy$Dy!caV+Pa z(CJ{Vb-Rj+Yu04C{)N?b%E+K0lk(6_s0L>`uj6PI@{RZ0S-ygAK$* zYjh~(h1%2*oO`&9x=%2NQ3})v>IPB|&UMV)bQH2ru_onAyF=TG-VU`dCI`Py>G(t} zhcDya$5qsN8c_8_J|SP4b1A!Kb-=VS`=Lr=Ra~J;Zg<H=G7!q`1zD5qN6

~1r=you{_z^3dlmKFLr*^^ETonZb8BDJxm3AkC>6@-a<>5_azyRK zO?qm~&S5c?!`P>JFxV!}%Bl~Df6?unGAg#3=?2DdF8EEgVy@Zf{mR4v)@?(Shq4lK@Z3X7S`6z-NaeRV z5rvxlw1m8HfzTxy#!bDWdf~7+9UCcTUQxK@@kOKmV(6$&bM!N@lyVi;VUrF;HR$ck zeuX50Ac)k`pW>dXAc}qZ@MuxBC0t*``;vS864EoLHL|Covbh7{2old!Yjk5R%+w@YxwxG{*Z)~YGGoPy?j$agpz5f z$)u8tmQloU&P~k=echzAHSaH6R^o_V=TAh?^CIK#@H-}t##ODd7CnLUuFMOHzK+GZ@RRoeEm?M|? z@<^vbLoXG6QpEr!B!Go6P15(UV)vs}3mP-MO(Qn3qmq#t_zcWWk)r2xq4M~pLYcgt ze!~dKmd1{9RZIqNHb5}Z9++F4L5x`}JL#K`?F@Ersqs|j$c{WyuhuAl*KG!UKnaU- zdsV!TQax>1fiRk6G z5hAs!lO_~oC>sr4!ZtQXj)8{}S3-*|^d56_oevF1R!r4%mAv91?DN?KELE>_)ryrw z=6CcMvaNW3RN?OtNJ%J%-PK!kx)$g?*Z4!8_lx6TXt;%Pak5XacdbfrHORZQG}|O! zIO}~Ca#W*67n-^TQQw=FB=Id9QNhN&Ba9u^37Re z7E3^N$KJQjxTj>~=ze|)qHJRpz?L~VBk|)x=4SGD%gM-CL=$d?R{YXQ60w%-$!lBM zwfKHsn|2et2Vo%H)HP17JCFB>R1n40tfCXnh4FHKxEB>2mao^e&#ahxu;s!s&&gl# z(;3E0D&fM5Hc5p|{x~`6v3J z;Bp3`toaQgFEcD=M$#G(xa9mBISF9?aP6ceS&+50^_ENB=NwK`{%Ae~ie6S8Um6sV zDgjs!Y^?9x7i1xW<_K{W&VVq9cLZ3tJcq9AQdJ$drrY@WOMXQkIFOv(DEpNO_daUW zo}s_-q;K;g)?qG-9qreKNu6$wd=}B>tfw*@U^KtsPywd+IxV@VZ1zfONQ0x=JFy~f zE-KYP-E%=o8JP z252?9OfvMCp*^3`xq+21=8OZz4++e(=zMCmH^}EQ#4L+E**kYt`1a1%vJH{@*FuXo zx(d=h3kA%noAMrRdUKSVXDoIpWP=5Xd{NO?0> z?2Yt?ZEWM`l})c47;3JAPL!B>-cA)slMfwg0Q{UV)lFYz>yj0?uD0G(-4{32a+Y%Z zN?jb&DC{-5LSBN#GnGa=egd}4g}NTm%_7LXoxu^v%xl-KOREpjub7MJF*e3XMpt}_ zj75h2ZLNV2)Uet1426VpI4M)%otglSCYies${ycXBf|ESSU?jmLR7}=YjLpFrXO(E zB5hUN>sgmCoH0NOa)Qog`K%JgvM|Ag{{DO>| z4Mv}9zN$$HPib1Lu+w$i9ih~SJ7xsWNFF!Po&a=9ii9vx^Rh#{b;K> z3a~3&)i~jn_8g2lNqWzDoL=eb3IE1^&XG>&8m)fEH9U_t>^VaXuN z#B!(`{5`^bWW+i>kp!zJ1Fp8^yQwLufC0c&>ri-#k`UgUoE*;Ms;JA*Hn3D<^HI!p zg^c$L0@%0*y(`B7V#zev0!9dR{Ht__=!&=_%^{FP2W~cKkgS4vt`~?zT1eOK3`s}n z28G@i8e=tbN2svWAu@L6p7!QnU2w|Y06UybZF4Ruh1~974-o`3fhW{0lYy!!_;!j% z`#I5=T=QHIDy#XQ)tGt{H{(k^Q1ECEzbxbhc*vSRDS*KT95+_%&+b^e?q1DDN-|2Q zbJ*eD`$dkm%2Q@pEiUvD&iK3wyB4)qTF`|w`eFP-WtKEQQTq%7$j0q?cDst`Cg zy8zt?ULSB#Vr8UVkGk>OUO_tY;w|r3;Vu+8{F;s_{LEFDo?D1=|4*ilF#(<-8pF>* zn+!%?|Ea#zwSL*nV^?O5+@0|d_a*5!zlwWq#8~m=rNO7BcBw&}LFk3SP_c`@ucFcn z9K(zSowFgwsCHfq8fXfOk?2a8vmY5O?g(}WmSOpE_+64W2W|CyeCo2jDj_K##iTD> zE+pr?SOxZl$Eb#dYiMSxY+eVuVPO9)#kRH1nKn|F`R_gaQe<9j51aVT%8)fS}fHvfOsYOdDuIjy_P1mIP*@Ooh`VtII*Ai{CLpNgzFyub~1+JvyN~w zkZVNWZg;D)LW<|_KdRb8bqTeIGgm)}ze4bEdGrnI3T#Xj6pB7H`#dKp5D!=(&pW5< zbcTmGj8Y3ZZr?WxmK*vFUy9ko-*3*hZc&;5kvPo|K6eVu-S)@t&v(KEpdR&v{c*b- z7m-}o?j+;@7#P?etYt|Y4qNpr|agR`>hL6 zDI1Mr7CO;&VZ>hO2WNryj^@Hw)Y67}Jpn{uP{q=oZjAP5hQD|^I51_5E4;g>GVUPKz3{k&>%bvC4D0vSPW*Y~TyByn*KTheTSOIAWdU%lP!#mC~Lo zo;S1cGQ5m|(D$C^j}|~Yj^}w!Os}uKqY8xD$`#xI=JJ!MFH=rkhP^SRXUU!gmVWC{ z1LdE5SlJ=Xj9*h?A~z#o(Ko8hv80jh|B$>&K7CL5SV zm$e2OwsOfCqIAmb33(&jRn~nDHTra+jwlp92b}G$wYkp!3QbTD+GN;`sEnQq$KPcr z#Jyk)ZLBY!%Pz&{;kx;G+o_!EW_(At+2r;rhgQg4rEJ54{E}nj!42|n&&`X8j!bFH z8S%M#nBFgrG2`Je@_&k~?u#6hGp69OB9+_3oAD?D&Z%YYcvthU(r# zhJtY=oejFqXf6=maJDw$A7xL&ZV+ys7CAnzz{(n8X3x1BtuqwfvZgcEoH>m6VfTcY z$79l1F@6k_yaQY^!us*H+)g4PPVpCgVAS8$dJ9H}8`6RV8nBFi@ks_|@7KE%PK&I6 zuQ!<4z0H!-HbIw2Y$|~3C5Q)M6cq+I-M-@MdBuv?LzL1%>IgZz_m9cKFYty5i&XZA1{Z#y>{i9OaW$a zSZ=e=l=IgqDRU{8XguSeFk>_S*R5Xgeo)Lm*Wq@7b%vIk6tXRKQE}=cexEOO(}*6+ixw|gWAsV+ zc1Y9sQWtqbqVdZQh$XYO8(zl>Je8J=A{5Hdi_}l_U z{&|`o%8iXVz+$4$@a)?DPK5%vwcsSRasXEqfRBtwuLg+leoR7Qc5mfBxOes)dY6LzRFjt=J?=W_Cc0=|LtJK$fvifbN8X8?Z%O3)W)Xtz1m zl_Zh&m@p3N2<(*PEy!!XYznQGRlnsY6K%{L|cW>B^r8?3e! z?F&47pHD1QS+FL;QO2qF9xhTHQjHNppJgfK3TqKg zlJ!5!2m2%uCo8SPP$wDn$`v0usxDL*$L&!O#*(bc!S06jm8y?INB1}+-&F*b2K{zv zw6wqSBhR$rm7L$g4*|xvyJrZ4@$o&pf4`LeMm&~p1^=9JHHD~(d_ocK5*XaAkS~== z@-l~daehN(gLo0Jmn=AVn2>`VdPhyx(aRh%|@dFL9ZS$YX z14EMgq3FdRP^&zBDngJ}l~DBNmhN&Q{^zOM^#2UL3P`>SJn(kezsT?LVC`8167hVT z%VSQ_)9lA#OWmTycdWwCBVbAJbcxXexT()}J$Daa@DRt-d;W4@l3*ZzA})!r&lbX& zh=apy8ejvl0TIuba245XEO=euY2zTx_`UiOEqM=7@wEJav)@q+$%eYMEJ$}tPI})& zgm2^Shw3k!WhbxNzO1YgFvnkwUZ!N@U={HO0640zSA1A6F-dd|On4)?@}`PE__lJN z2U}t$kA zw#hSO#TbFYz*NTbYmy)&ScUt@0v*k31t{^P$wL0l4c}1_GjILTI6Lxmo%@?091L#x z&FJU0fPxthtRav<$blCGHL={}Ndw#yOwZdIwjv~Nw>`dc-%Ev*5eI>f(xWUPSJ$`` z6cK32^_=u)z5Aw>jEz7{^C=RF8-D7QlpX_63QxUUJnE*J>`b(Ev*tMT0O4DgOipnJjjOy|t+$~Y7a~pl|CBI(Vfm|+;|7X zr9>;hx}Y~Cks*oV0r8}7JYwkU1`D7@hJr*Ds!k4`lU>~t;B5=Y;6t3~US3`bnf6s4 z{hYnxlN*n$Xx-?GxqrP?*J~+>t>eKig2xfX?HC)2%)I{UtV3{{_^7wd`P3SSO|_-VPAz2!3_-ZQWl- zt01zx7~IKQ^2hT-HWSt<)G%2_zZ@16cBq3NmDByp;MbF>Z4s5-0xe(QCU!E?Of zW(*@t!4yeQs^v^})9Lqb#vruz=MOvUB+KQ0c?WuprCM$XF5ch+-r^xEKZ1@uXyqA6 zX2>(B^wlwRS2EuqhXqSc1UqCkGjdlF5JF-kKv)1eOLQ+n4w1@u$_rXwOe4hyyT6Uw zd{oM&oFfD_o@qv3zSL|6=}oI_4ov=A!HP7OZA~SKl2;$Ko!tSjiIK@Z(g=Rb0(-h>ujx{0V6g)g2RPBVSei z`i3B2Q!sI1BT9EtKmX2vtSvb1UWuWnAxBps5t3*EE=+xwnBrn#o+Y&H+lsG91^{YT z>O_$Ff+(03-eQW6tog-)Asbx(bl~tVKsojTEA2!Z$m&oVQ8g>~^C}H? z9nJJ5NtY#oL~faoW4=O0Vi3qf5dC_(GT9>Kth}|8@OS=bM8LkHkOv-sc#GlyBSM$^OG3=DV>dm|L*q4 zkabEA6q3>0y!t0lv~)LlM;4AoUqF$#8X5bx<8#V=&TdF*~_89l6Dk@y+~lfmQon9Sj4?DVEVlmLUK ze)E~8mPUe;~#o z!B~kfnk4d&g)_c)-yMS8 zif(=P^a&&%;C3AR3crz_0RV0pfxsyS|6RhvK~M$!cRt*$y1#h$WfcB4$(U`%0j{p6 z)f6acpvBf7|NY66K;SPlJHzAqz+dx!N9D<+)q(z_lL1H1>KF7N**b5=Mx4^(eSWbg z3cmlomvnhb#YCS)g!)P1%3IL3kcJ#Po`#C0FZ@-XdN_Hi?x7 zW7#RsOjOt*^dBuk;9+2Yd_RDH_|`4ITysI>Z=P+w#8tpclfq>-r21oXJSpkoFG4at z+gbZ(f0{XeB8?*i6{~Eht=o|bh*4(em0e6ycOFb-&cDHPGXe!I0?a9fFQc|Udhsi| z-~7O4ArF(e9QSNc5H9su4&t4ttlMk({gae7+ZaO-KwgzFD93L#}?ydM^xDM;O$z;A&AOT+6||N9LZPCd?*Au6OxP zQ60EY@WI_5rR>WeQkJwL2ZkRNsew5@1dOcQuMJPEj4D!qq(~xOnfIg=K~W zI1a+w2(jXi$9qBeKu1T@SvsItAV7AFW}{Rt#9l+zuVU~z7y`v+V2?dBy14%VpNzcg zlO7#n#Ob<#K1x>k0Ljt*+`1_(mM`r@Kyjd#!k{WO*i~--q!uh(k7JM#3#ZNCNnHMp z6%pnyA)us83lv6>VQ?t|@L5!U(7b}2))E$RRe+5+$fyXch^XxooiQJ-h!8rrvXe1t z_0mvB`m21RIiEjoXOeJi;H4?t=5{i)ceK#zaSy++?aM}+N~-`_*N-I&P6gki*7Ju1 zw39xYZhZ{;_4Ji8oLLbez)qHz^49=M`fC6#IV&NLbB|BmdwzDNN`+DFz~u4wKyKAb zj;FLlw{>e&6wqt(a7p^YKB^h31THc`2r^29)7Qy(8dZTtwXw7jx|f$cpeB|Y{h>-< zT8mqJGGXH`R`_1{@wlv(*#F0wl}(82AX*6Xgdg%dMcq{-u)|>TigYX~K&jK*#@1%o z5m@m}Rv+Z@FY7Zn@dT`+%XddGox!hR^!W<-F8S?|fgk}ETOv?Xke5f|W6M>woJ1crEL-dZ&+ZhQ+YCPQQ? z9{}RHlkkzhcS%t8Bs^+8_zmq%ojHDN2?XCxO1h<`!aZq$;z?$7et6F=6ca2fLpXO8 z2^MU5^A6rB;I^gAb>fX5r3?b0cmeVIy=S zngDDg8$lbH6et@>DjXZx26|)Q$F7o_Bq_Y;G7_2whp-U$80JiLs|$hECfIX znVBUtdd#Jz377>n!KlKDsu^4Zg0>J~1s!cjjWkOefI9+Y<;8<|&=PkhL0x4LUOQIW z5tTqpE$kRs|>XFP6J$ONckp|Y6m!Ke#MkC3JUHpY*I^Jfu@!v`s1rE#YnCBkGX zVtQmnlr%=sib&I7Bh^{Q5OiJ>Xbh?}V_{K2B@!-bNb5paTU@dj%G$=jmINJFl2ir; zW_B6S0kNFA*lZmbO@bT;5Y33d8t z%H*Q5Y}#DIe6Va{(&}Q|;|9N$ag%8lHX3E5+e{lvP+Z$xqaZH~CIUuvR=Ti%B)WUB zR5Y{Ha9IoE?X2l!jecY5wnAZ9WPy~o>Ov@7;5Gunw6(h_Vzcp<0?I9`B(ZIn5F3jD zFyhKgX(p7}x;kv0G&V_tvuuhvM%GX<`D30Mp1536YbYqHP(KDJ;H{L{QD(#v!PsN~ z+Gd&C#M8r=N)-%LR7^gbl8kOPplLHJ)kOsHtr&=vG;_-=Yhaej%_VVSk|--WJW|mr zyp}P7qHqREDSMw+#XXF$$S|l5bmK>yrP^1U7!f)Po zi7}=Y7P%eCp8O{L8J~lJ!EdNQfcEa2#$#cy492@9EU$Yi!W?yzvu;y?z;>z|-DGem z%Y3Vqw}FKfR?VzT8eRD{$lP+`=|t870goYLV@;JrN`5RU%`=-sQVv^(psl9RsMuI} zX=Ws4maQ&p1Cx_tN`<}E_(=T%kh9KvUWrmX4g)Ax}hS5OVC2?V70d@Gz4mM1qXgIPlK}%N~oLaouKt+N_=viw*B%DnX1*XOk zgq?}2Hl1)`g#@E;ZOpYP4>@IP8eOZRLrz8LGLM$^BZvV@)@ahqO4-FS5{Ig5G^W&C z%5=1_#?p>a)5toW0$N#v%kPExaJ8u*DS9@{sSP!7mMj#fwXwipO+ktrRJvMqvWf9} z=15Q>%nBxF*g*9?(@+qem&b#8zf%G0992Uj6PPtTv7jz3oe&0 z!cE8~&P*^C^(ecf{O6D&)$g(KaK1bSGOGThly$tk4yd^XnPE0zBFBZBI4HX2&pwdDg=fP2EsAB+N*HRcy#Q2N zW)}(;YHAnyq;k!Ca!tPJ-|ULuKWX$rQH7QHQSnWsjjVt0!8U&@lD=NX$^z2R+REmh zR;nrEdErMz;)_X$W~`x(XO^nyAvO^QQe=d=3J`t{vlL$9HJ?_LP$KOoY#xfXF<|+- zQ*N1O4VdQ)+0N>K+iCuYqJdDG8svqj}8i^FzHq0bWoAma|{*Mqk|GN#26~zpQY%Cq(%{WR4?4xKppN3i*(ag{x#HZ0wsAi+n3@pB=0J8ilj{(d7^wFgJ z)kA4L&_4=DQt5v*BN_p~IH)+rh!k0G5z0jsX7q8{dJhZU7qSR7mCDwbWU6>er1RzquXsh5$b8fX}P zp)se8sBE$LwUt1ygJ3}+)>0r^i#iOwGCK#CqT$X=yp%Qquk5mx%HCTpOau%&%GDS} z!Nk&2Np1oK&;bYXN*o-8%4>vmU{C;2gFGzMMmR`-Ws>R$u{NWKHG|l=&uz2qr5G1W zMV*XBpk5B3fFKP%ByFv;-GfKDZp9i!S@1i;9cKzb0`i9u2g9?EIkTEd;^NOrC9RS5 zF&*|yNS$50oxx^-y z3uC`68wQG-XLGtOpDHg~z2eC+1(!i-XDu}2X%a#7NZgd_zz)L5tF z^5Tk9inpPN7=pG0u0dXum)PXwxSA|hWhn}{?g148Twc_0M&~~?fZ%syxQmhE#)}S$ z^dX|W-$?OENKrxgbVDtIEEks!7O#|LCqwp#a-m6gY~o@l$AF zAt72y^3t_UWPGvtlX*MHQL2!@N?XiBZ%7hVhGI zA*~!ojSRF98`Y02ZqDfj|CyoaIODi9c_xe==S?CKkA7T{o0C)Lc{1TdCV3J~fnbQe30M=xI_fM5ITOdCWz z%#5y5Mp7FF+{tHDE9sb7VWIdGDWk-r(M&I-aOt~dy>8wXHapjm(BotLj6=YdHXa6y5L6yy)GUfeoGTfMtE1+01I-d)hfFgqab_*=UGU(9l~M={Q!*YeCU9 zL78Fo)WxLRHPr;;r$*(v zEk&R?$}sbaO{TzA$8d5k?(m~(aj1-RV$>`135Wb>S){ebse=~H7aN#{Ho^9c0w zb)kwBsuYW5N~;bYj*J%2jJYr>Os;rU6L-rL$Asz_F~=^PI5!7&zKR=#$Mn zUX7;04`41Y5yMUqH@z{>f|kpP1(O2&tkJ{DPk@3ByeLQ^%tG8M8$DzW%L9*8A$61k zwi@n$?KcgveN}8bHlIh2%Bq80E1lmWOFC$Bh@);0QJ6NncN9vg|>?4NKWXv(( z??AG6;{T8{vcHj{C+)E2MF)OdE;E;-DK@CNmCj0LMR7sN=FzZOt2dm1TvElN#+5jf z5@NO?W(}pbnnfbAz@XCQHYU@vLdmNg6P6qrDIk~?D~Q+VDC;PqV(fB&CxrE3@u6%L zS>BOjxt3KV^Cy88P_8(lA3nkmQ4pg-u5(6JVVPKJQWUmS=Ga=)L`Rpfb4XZ;>Ll3+ zHPVoxjh|WNCsG(?g31(5BVuC(Dpqu|Fl;OzIS58s5^TXm6k4QRRlWeBC4+tuGU!Ln zgMQ>(NK(!v%GenFB+xo4si1gjnn6D#+{_rziS#Ck`HdtcP!tWCHF9PhK_lc`^NLi| zdp~iEkXlh-R@AJexV$Oh6W1e3=rYJSP_<;P3~=;18Jq^%!k6U|;8e#Lfe_RfC2y^} z%j@gSj{?(60px_3gq;e`6&yHNmbk1QZN|%J=A0y$K(M!#1Uk950jW))i%PJ0gc%eC z?YW?eogG2kW>l4@B%WhcF$#(Z;yC$kh(q!blPx@+osETiC{2-#guEw^H8 z1PVo$W5K<)p|V``7@@KxEKlsbyX?f~Y>P@r;?PxGh+4bL7_&X#a+WSyPKagY0*5SJ z;G>(!MxNc}^%BB1VMd5Ky>dwblofGwiil|p$gpLRwq#UMVxVJd!W}FkI$K~hSCkRs zixngpizJ~sO{D;_E6bdE=rmqe37xg&(cY-q(KkV`a&hJSi3SB!4~2;_SVY#QAiFHO z3r0IijYGsP!j69!V$8~;o?KP%TI(?5g^Eqc=Ah77pdK|Wc8<_F%q59s2t+UJP{+pR zZVO6BM$fjG0^2SdfNu-w7)mJ0)Z-$U%7F>=E-dk0nn{Mp%ady`ti)SprMTnjV4)#S z6(pU~;UgFp7!Iru!J$JD7lJ4empNo6aH=ID7!wjUK7w(L7&S{ef<5W9xuKW>w?s(& z#Hi^1dyRXMnIu}1g)=MZjA&2LQc5< zA!cv^aM_|!F+*8m$RTR11I{?ViN>vkq{NC*?dG2= zTI)|$!(u~y1)Ue>E{*WYi&eTRKHfR%E)J;jYIPLe<8-tebxB!3Qs)IJ@EY~tox0Rn z#?Q+o!cY?FOI?I11!a8$pjh%x6^ieiHqpw8D@WeXl@DUZ@e?c6>HxS*M_P#yT8$!B z@@sZS^|&y{sZEbfj~DaEd1%~0hH<1LZsTR*XJPjH;6@|JrCA5yS!%1&;RAkemxn7hF zc1*6d`M5G`(p*tGW-$RgQ*IU`H zhLdX~Ciasuc{rXvfxv+fpj=8S0?h0Qz%k;LbTo!}6|bH^lUBlkf&Io9HsWc;esmuB z@VSK+EG$(XV8@$jKJKnTj!xrGrv=1I!3a}Dq^8p(bb~HQjhapalG7~DZM68frHNg0 zMw9E6AR-lBj9k!@pDL;pSo5N@O)=NT$`!s3Q;jMvmxl^puAQe8w=S*iiw??p2QS}G zpgM{Gb6jn3)(Pwl?jb!0V+qApYR7%UYM}pdMBJ#g1?1>|ah&6g-8HpV=G_S}#aXV5 z#sAb=Rer~lAN_}~rdo$TA_^g?D52~R28EUXg!uUdpF_y`pVvo-idcm|76GH_zA7WNntTZ~} zXVp|GXl<~uzFikS5pR`;E2*^9F5azTZ{MxrvsP5$)H~}V2#UIBw?y7<7NF1dNhrH(%PUoZhhFbWbB) zR3#%_8cQK#>Eie{Md>OU6C{=ajdXE-gn3jSv{Axrd}Or$Fb}6q9{94G4C$h32g*Kv zbwVlrBO22syD{@`)e34Zv{ea^h8*<`E?wRgISL}hELtfJ7naA-`Wr>~$80WmAf`)!n#u+kn05V4pM_(pWSa>DGRkQox=?IPet>g+`_ z={3nWy6B*j%E#K{EIW@#Cfqw)%=4AysVN6V6+o74lsD*<4yZRw^n*C8>;huagkXdM+Z{hz${qFhC^?LdUsPa!D7il^kJjSS-07w}vY| zXl|*BP<<@8IC&Kmm45Qy71QF8Hgx0UrKPZ^#=3FzkRD;Gi$I4uktO!If zw8E1z8VTMdP{YB>_*4)&9Bj*+pK!_ zq0jmTps1_Z?X&uk4T^8doKi#|S*oljXPzrh6elYB*!_)UiHaf2kg|`$EACZUvZkwmtw%%{#T#qo=AB#87HL)jKJ&9-R1I<0 zAypJ~>ybdIK(|(E4a-ZJTa`;2V_9E}^GayJptz_oy8<6C)!bw#iRVEpmCZM2VPFQb znZ-LtyL3`$G}j76igQn>-L+viZa!E1jjCsf*f{E~vTeM%;gn`dloxu`n)*F8hKuvp zVv)=uqYfCW{PT(N^ffBmwNzs5bIroCIm=}_LV!zO&r4+UJ+u#XhnnEFvMas@HIkE& zmRy(+D6JPg7Uwx)XNWmnVX!VHAsuG(v>ZKNH>Z(03JA<8J1&bG^vI!HK+`Loz*!7X zMFn5QWdq2?b;dOMAgtgL>hYx|YccKdQDzsJti__`b3v>sT`0o*e8t+>ffc_(ri$nV zL>Mv{HV)dEU#h%lR@C|q#P*qURRCEWaqL=^uZxR7#y$=Y@4+{wzOjT318?*VT@X-I z1l@=(pfH(Umqu}|hJo@T6F2;?10^X|6lProMK_`h?P#VKsFy~OL#}Q>)io^E0M_ay z^ZMZOzOusHAgPElMVF^gauo0tl@+=`g%Dqr{b^uouBh6Po(7X==)O@_gI#F-%i~~X zKf+KdJfn7m$roW09#veSRV3r(YL~Aa5%}=YgjguBUq$f7{2phkAgs%{qUOOorD9S2 zf$_@up=Mo&wG7r-vOJhZku^^a*%3ntSyxP3+Epl0Xz-|>ye>Aa7rii{V0$+sccVug z#?vT5wE_zCMQo|jayoFAoExsrqLYfdAVDLZlWd1LbijmEb#>hgWgemY^QYSELG?7$T#*#WM z34(#;ARm_0Qs#i~C3vI&ZaY`xC&ig!oW%%-1lt8PCl@-#5g%1b%3&~)n@-;fuLw}w zT`uEdz#@*UZA8-J!o@uDDK|!t74aDPigm6PUXWAFYsff@{79$heMTE6UPl?HNOHi0 z1q4;xl?90xabGy_vgeMjDa8Ug&c`E8g)ZgO*l4J33OTSE;;cdPg|_NR+J8zYmK_nc zN@yPpqY&CFdQ~KGrewsX8WQ|zT~9N$Ry}4ED0ty(O6aUIRZyKWGqtEsP8f8+-`YuupG6uv8qW(dnGQUQKfs|-;CU3%16_S7Dd+~`9YsWzE)gZZWH-7%PUtcF{R3`PxS&hE zOxts_xcV?yX-B?|kzOy7GwtZNH^S^ikER^~jQiuaHwUhqsYB7R(l2Yfdz zLW5NoqoUQ!7omzfV(FM$R!<=FWs?W#?VNj7Mr$2m#n(_9hpcBS&Ep`V`dXT1$gr4I z2?toa&}*TTcUJOR0wKi)Q)d{XUbVZH(u^E;wJ0Jjcrfb>T7LAJ0Ac=qX^ao4l@{@7 zHGyEhel*?aS}!HHrKCl4N^>BX=tsClNj;4$2S6k!G(`Tte z?aFYJKdCb5#M3c#POB?R#iZK|iu|Mkii&-%q$`^X#I=hFwE*JiOLp*$+fc5WrJ~b1 zbh?Vbczldbj1z~d=87t+XtbHARZuNbi>|qA%qr&iU4$x=kJn*Mh4t{T1|gpnx@0?F zedQg9fc^!wcqA&&gvQ{(O}P6pnV~#iPJi9UlvH3dQN*zjkHi zHq9=VPJiz*D@$i9HkXoJK(GlzySVymh`^54DB5sWq zAB3Qj4!pjxRQh?#vEal}|%CL-Bl2bCq8K?;KSmHZYVmEQWw5 zyyI)w&?`Pt$3tBvKg6JnkFT5y%`2*N7kGMa>!c`Zb( za@MLMj`;VArKJtxu5G{9Dw;vGbh7jWhQ4-Fg2 z`dFbZ_=1E!_=|t<^t*7OjhGq@O4&vAIk{$8rtG0r^n~WB6+~3I&$xmHE|4gr)fE!T z4lN--7@`;uTtnFWl{DC06yLF9L|PXxZ$tf`ugdZxz%wU;2Z-IJhZhu( zi@W$M8)J;Zd#7(UyC&T5lsk(bRuQ^_M@2PV;WFhicqM>d39xs>i;A3d9G4Ya>&A@Z z{^Nr?yW)zEe!}g_>agUC>l<+{6d2+`;MI<&f#?CtyV5(W>QO}ubIK|MlE|)@7n3Y7 z&VNBeaS_H-bQMK zG<eEz&_6C%mHnef)I*&jUYU;8gt`#him8vHm%}eE z%fg0=b92pA_I}aKjcP0x%>9bTY|AZbqO--j`gqK_?BmnYxbbA^UE&_xG=Mi ze{E#c2C0rMM7NbqC)KO8LKzs$?4`sv)59|`(+W4s`GCgd^~N%;{Lv9cLQ*ky(QjQ= zF~)S!8JBzfOT_VZL&t?#E(d9|7M2plL zjX-;m$&N+qSvRWIMI9D&3FQYR1wWOIrRTX>&5^W=Z2U97?VMF8e9&8;`8DcP6&EJ< z!vEmgn(fLd{#280SiPsE+M`NWlui2PBFd}4wXx>%9m(XuQt>3vjnZk9p$4R45B_{q z+>nGrJfSY5#4F{N_sXv>6t7erMH}u_P+Fm2;LoDOhoz+a-iWeK>U!#=m^F(8EIVb= zG~)>r$azf_RG>^MD1gEi@}w}Iy9x`w`9D#lwdcV>R>MJwA@wJl9F&KJf3oTwd0ZG; z@`tfq1;d-{eb7*g_Ikq1Xw?^~s*tc+$mG=G;BJmF4h5@`iz2`;x+uG?VdDbHT{6L( zy5uvRtr%jyRBkOXwd4}ASMTDCD@^EE^tjY8GU}`dOJ<82;*8)fin0*qxLh%J-E+XH zh3(2F52sAN0DQ#K7*LgHI}KS?OaS6UJi3UaVcO|#wQbZ zc2*P=#h>RN2Fxm;a)B=D^SR~YH`gVzsB%RZp`z#3d;YAvXsL`2GqZ*BE4n#aM;sN< zg)S!yqsofY<_IzGmOwxS>?2sET@)Nv99Ar>CRt!MiVs9CL%#|fjp4OlXuCoJ+y^R) zfAa;POr^3O^FgBQMDt?RR)?a?tTChfDEri*Q@cKJL6ND}ab%Yp`cp&E{+OYN%S%!& z{f(7O+M1=mdJ$}1xQMk}^s1ntV8XLCf`-CqpI1Yw!UuJQsK{ng@bhApuYDc;ImUTK zr!M!|ag0(Q6m1!O%Jw-COH3La%Uk;*J_}tcL+R}IY80k^?v|fh)p3hrkV-|HAm_fV zE(9p*nPo=3o^i?NYVUwpIVp&b!L;pA7wabkab zUl9++`4tC%UdMk_kWn2mHh#rz2NEA2sz{-Cy}01>QY2YaO?2<_9Oiay31^OX%DCsg zRTbynRb_GJ;l(F9kJZ`H$-qT#(L`CDR#{uh8RP{lN1RxfpLI#Vu3g6#8y*Jgl~Gz# z2&N{CI8phEpe*?O_BYm0KYl(xA0A%5_6HQ7B9AVzyAFQyyB`=j_}S$vFE0)FBGC(e z2-?;&bT;W*{9N;y&>-<%LQyfbdW`Ya=G5;@u*L;pcaJ1oIVr2wzcuM#o=I zqf=^O7gglJPW0)nN5}e34nB(idQCvBIrWd=;T^#!{8D$s-XDdOcLxoB|L9X6@_MRH z)zl`3`f`O31i12wN8h4rxbr*jG=w<57m`**X)(z8Z;0qhs3h_`qXVDr@BCuX>pX(Q zYLDo0iddyCx~4`8SLUP@p=1OBt&^nE zVOc2>WG<-*LsuCJ{BNvj=qfKlu&O*-2)g1aL)}~ouFzT|9?u7dM#8$>isB$LNG7yG z$%R_3Lsy23ZgNE-9JT&YXXdC;(P9{tdz8CMVI-v$<5Gc6b&}f~lUcOU(Igq?T;}QT z(<`yOm>2WnxpdL3rHIdv0$oOupvxqM6>G{=6^lfrN{5A*W01b!s_^st(8r3hcNo&u zM4eamxSx&F%|g`joHi@3W~IpT>#<{1mwfON-FVVP2OM2qMJ-+YvhD~Z^Y752>3VRe zj?79eFTVJ!I&A&&4|YE8&=(IXQwn`#foDk>QL#du89iszco5WSBZ8e=u$A5;H z!pvAvT&d0~CIRMp9$5({qPlFz{*{#ZT$L9%QXLfxEO6iSMxUxCHu7hZ(@S;!y9om&zd3lrOgV))_t2q`W&kiihiYkk# zCe;rMx}-K1?Tb%KX6k5J064k}V^Xbtq%dTX5Jf~gNQ7z%`eMwg`wjxm@Ap*S`m8^y zDEb~D=<_}litc-i?+aYM(FTtyigu(AA~ruL{e$ zDJzzV%i`T!`Z%Vj+ls@{8YJ^`q(a+@;+~3txRNL_j%DvE!gxcBwdA71udr26WhE3H z(ebibD^*qk^k-Lx5^@&`3klAjJWc4z%LmfBn5)6!#Sw!#iRq76Rz*)skf9w<5dX6p zRDkpjWZLNN3ylVTg?5oX=cITUlwD?wqAMxIg81y%ijwwz%b#BBBm9B1)iI(Jw{}3< zT5+%@s{&%cF0at?it9$7I}3E{sQ7`QtSf8o;;wv_j5y0FUBcD-vHhwD>a8n3M|IFY zV?LiCqs_Vk2aUV3C@MzGQ*&*8cv5_Ju{M`>Tuuw4cC@k9{8<+8a89_{mTGEb$ZSaw z&8#r49l3N|gaL}NW5`!YWe1!cm8YV8aFzvryiDfA!v_q1b;)X~b(C0qX=ThNl%*xb z=y$%|;9JL$9OL#!bV=cVNMTM@!iv9Ao_rNu1p^-yg3_9q@bf;KM%zKY8Mf^zvEXI*hM7*g&k%SmSl~u}7m^B^z zFY8E5j&$#n=;BB*S7kVdUqu7uo9cy*cGQXN7IcqRxIHGUN}#t~&6F`XPLU^4r_l=G|Ty09_pF?ybiW6!AR=!3|pipo;I zj5_MLXQO+9ba2g&0bv?FmQ$nPT*ViR8_X3u6nl#m;65KxLrXH__DE4hC?+#uItuvG z9A#8YVct$#(&#BMz(9J`rcqntMvLtza?K-|sh0(JyH5|EigyzPhpeUdEXRX!D(cxN z2J?5;v0+0A#?2OGHu@_J$?a84eX?sy;|QjUV;NPiu@vQY z7e9G0dRS3Qeg3=YWff6VKxM6p7cFLyqyyzgRhb~KPTDmRQVj6L$KCqEa@{S<hryr$vY%dd z`P`uvUr{3n5|}GVHt8!OFG9? zWs_ro?{U(3rdF2&%lT-YW`(PIIBL1iMS;j|n1wOb{SCY3u}8tFgn{FFZW%H z%#c+M3rO!WMM@$Zj6Efmijbu~R83z{1z?o)B&#S>hi;(r9Jwm`BNDMag5PrY6oC+C-yBuA+%Cm01cfLT36=hq{s+VO3Md9amWi zb`CA?Df6nB#pA^CD&yo>k#*R(n8s{a87W*eph*RkKpD&g6sMwSR+&cXlF*XcFd9Fz z0Pl*~YhptS=jT3G(VxYn{=!ne+RUPwqiHfe^NSle!s(A~qgKy2$+Z;ssa>qN z*s>2LE?F|Y8ygc$tc>^b{EOGmP~~E;kRBcL(d1I4xmiTn^GlU4nJde!js;g^xl{pS zGVSEF0+-ls?2?0ugR)Sgn4qjOG=Dnn(lKJL7X_7Um<6-t5E=E1VW^pWg@|=!ltEni z6LcYBqIP4V{FSuDxhkF_N);$8?u>u`7^6azu>_M2wQpX`s;1t3P_c%iOG+AXX2yWS z^$er9IVD!L8^6ESd1T)99hG9z%D?3ohsXcmjC$|POA|gw>Xz3QQT6;b!t%jPtc)7^ zkfv-?ko<+U&6}T>UUd$njEJLwi*A#jBEt7Y7sb&)LN! zCfa71x(&TAU0qH}5FRJGmfv)~V9`rq?|_}-m`979C7E>YvBXqqyZK<)$zgYHlz(1P zR7@XVWOWve$126y&aS+gb7WaX5l+Q+pNqn0#pewT4jGlJK1``THr`TA73HqUxw?*% zyrFoonK!Yz)0;{SQak!KLGM*j?x0KqokcrG%Y>G`G8IM$ko;IA5%a={2+HytgE^P5d2D;-m-^IeaIuq)Rjk_RqURn*vA&rQJM2L424mMk@-$} zQ*;>TTG$|vUTdogZH0`MBxSh-+dcm>$|?elJ8I+Hk$F>#Q=(Z_#oTg9H5I2`@eduB z^08&y-hNp=uGBo2mAeYJ%O$fSySc8E=K?S<=mg@5^LVzagSV9C&2?Ne9(77nq3JF} zahW(OMUn59@#UpFqV~~H<%k-e6}N|8hZk&ipy4?}t*jyz10FRqB9Cgs+C9H1MPnAJ zVv4(nn02qCyF8k#U9)xfP^YdOroc+KI4ycT=!~|j|7_~H7=()<;+C(X-(;(bi!bnu z{LVv+WH)J%>RDNV9kbq9Rw(R4S)AJC<45PD$ttJn;b9fm6d>MZB_+RKTb>CDRV<>{ zEk%J#jqWNcqIfW8Gt5%c*+y7k_*!c+^>#7AWs7UPE2Af*r#oVqquYf86$Sq8Cr zg&Jwti%LJ{tt^8q?J9e>VJm$}t*GTOR@_XOFu9ibpkcJRx_fH{mOoD&0jrCbY1C4W zMEh!rNKP2g3viUhlRWam5tRuLfGtRkC|NopY6MITr;=F7&+m!@r1jRuODVZ5Ya1vo zYnH7qdVAGe#31$g3KlMxTt~i&HP?KnUqxBzl53|VD<22CWHL_))?%09#pRWC}02?VtIBkc~P&8}Qu2|VB5l@Nw=CerA zj9oNI?ll)}U~#i$k0a$lX+qe$QM*i+i&<*ea~Dd*cvb!sP*V2J3UH_Cm>auQ&g|>M zsY`e;UhEA)Jhto#20sm~_KNxiS^@r}J5#+Y-*Z#7T7K_}gIfEw?~2|{87ap z;C(y^GSu;T<*phPUHOq^_GfEj*dUau08uSNEoJOuMlMn$t0Wf_t1Nc-$)pNvSKN|O z`$w^Cd2Rg8X#q#s(v7+@5mZL*7*iJ?s{(S=^ZoNG-Z{%~5vR^-UI6Z>$_sxg4E^M% zVoRn|k>iA-1s+2e>F-rEOJy_4*H)FH`MhyAx@M?b&l#T|NViI?C~v&a*3Ow$BZJ~mx!zY;SCPDwmQ@P)s^l7PuF8b5WCoclPi~m`v&_EID6_BVU7^prKz(wl zGhbQhxauV*%Nuf3G2#Ay)gUA z%F1@5DYS-<7}CMbqK~Mz3&6M(p>!qX276UDNTuawSIK}gYWV}t4~AJ=MN`Zb`)R|# z9#wRs(#e<0Rg4|8F9oP*4W=DSmMdsQb6=LHx>Qz1yIz%*XxU$$7KU6_T5xz*7IXawbmNvBVbTFd9fI@YR;}->Pd~Ho`lWE32$4pqw=-Ue?6W z9vl=EbT;99Yo`^`SsPjuZ(s5D>9gxgqsTKji)U9(d5ltdnV;QMvuj*Nn3;T(F)Ead zWdwAH%*%Zwyz;n`Pjc_d_Cizkgiy5Ha z95GLDrkcK}k)>!cn@8Mpb-P%FuIP%-hL`_hKX%^4jyKCKztoP3!>sM*XcUb@&9&vX zh+!>@>6ta+<&ITuoMBv*=DN>bvSucIEt7bICQ|iy;#sJdP}*Be`r2##0GB<)G40orSag>S8AYB4pVdyezls zuFSmgTXacz+?W_0>)kWJ&DtC<;OZ*EI_%rM5uF3&12ofTJN6%CzfPdQn3_*!R+pYv*QVwCTLW)$T$uYItfQS)dw%Vyjh zA0B4fh6UIgQciZ$aa!LOV}N=u3Zugo&e!o%21_|s*VG`Y&_<9sqN z4$U`^v)$n+bTUpUo0iG=aTmy=NIb3v#J z){+k(&X}D~d#Xyyw?OrrW)GY-hFP?2MoVS(o>i0$fyGCqx)gWjW5>9<-dtK8CB~Ac z>9DeD$x2;$&#Ic*5%%%cmF6lV*B^WH##v%FE|{0Ll8pQCEq-T=o^&r?Z5N$NqT5kH zcB!p-!^aostIAmuoXdXYgrGm7&SHY{Z)rmKx3o!K^BnOioy&68Ye&{1MT|#*b8)1Z z!ZOynSJ%pdKHRaim#%!iQkRdVm6OQmM@I~|jAdJDs0!-MfG|3`%F1Zt$@Rm+9(>_U z4i{sLAA0-CDl2n1>^F;K?}W|uOJ~*D!RqQ*J61Vj)^9y26^YjM3^LT1BFZm~29L5z z7Ik;=wRpdCbS3 z{)jRvGK(TF8!oz-H2%%nQHxK#Mn&(HyJ=^W(#~1uDE95%;*yrG`7yJQOnEisWR8l( z5wpH{D^D#unOTc>&Qt!5udJVScdIL{9#meA+D=nEEQ83%#nmx9)N@e@>nL;90+6qJ z%-6_|l((G#Ev`oe>1PFJ6x$7GE>X1oqpA}6-zLw<7>?aAj~uh#%5$8Gy~<qb+a4%!iUQokI>LB{5ZbS7|^+mo{IVU_Ui6ycji$E=qjAtEi;#SB+=Yiwh-l zHP@nqud+-Jws>;=h8eY)tLCrifg~5KfMu55;?2~8D+_kBCFds7Wkt4EOY7ya-K&Ub zI&zGM;#DB|aCGIdmq5mq$L)$OG&jt0IkTui%#$b9XcjrN#kiu!g;w~1d1=HE!g?FZ z?Mgbj{1SRr)Ebgp%(8;7tmP<{qLJmxzOsPehCd1#@{caI>oM-@la$GIX)|5S1B7S!HFo^(@n7M?X1J`R>WKHiXUq4oE{cJYzugjt+(72keVzR~)b z))ZLISTHZS>AVc}js$c0k}7J9RX$P1L{VUHqF7lY6}wc{KDsNdxbv#mMPJFSA%121 zw`3NbLme)dFPcTEQ_c>p%1#514zuK>zal%C#NsE6N--`+;{>3~#j;$qc?Hr^^iQhp zl1dwS&LArWZ4S57=N*_9S!NkkdRkV1d?=Uxqja?nY%2?KC_v2G?=0l}7ATg`aT)e% z%u;+v=kLDdn^AQ7%_7Iem#>|l`kG~`^78PNE<3pBii6ZIMK@180@M|?hYFV;#w@aH zJ7mjo8UR*aXj1*$E-NU#M=F~sd4|$niOqEu8SK~5tf#PLN?IdIReow&KON0UZzrI3TwKsR+iXWw@j{m#c1U! zXf&+c8Lvjccv%MVv!Cn@^RM zhmNi*Djcbb%NqkKzs(Yb?~yiZ!`pH@scM(<~4MO^cBT~spdKhRAwol$5gcOqpQ*yQGtL+s;E7GzWX;*R<>`H zYN@yGXo>-$H6^SJ$(-2X{Y?9zfGY0=|fjh+H`Ps zyJN%>m9V2f-pE;3Uv>siU>naLUOG@##ic!WqUuG6qQ}JUHq5t_OF=s-@;)*wE-AUW zf)XuuK3_As$K<9D}JfGy*kA>Vq0ab%8{|EYR+PV3th^Nii;QX8D95=(5q`q zTQrN3r6?FmJ4zMI8)+_`O35skXo_>1DCx|eu2^ciVT$&Z!k6-o(1w??`U=?P~Q9~MY%wA%dFGJ)m%oN`^lw^TUrwpALN=&x1k0h=D?_! zl)&vaUs0mK78vKfaP-qo?q680VRmPUt)U+kXQ4u8+tK1$@j~m&u9Tsn3LWb1j&_VI zI!gzt=sa%yS8FXgm7j;A->Qs{C<@IZKYvC2U0NFstcii)*7}#yHIUlK(8hIk3xz_Rt==B90BzWOG=lMqs`ZqVVHte0k#O!|!quo;h>Y zgM;rPBH0YH;$649J}Qo_qRx={V#ew3NkZq2gW*R^Kh_4%M?i)2kqQL zu0t$vAn+8lY_=*`pGE%s=$QA8k_s*AqilriO9}H-lIsABm`e%{$5=ehudFlXL;3)W zY4@$JowvFUE4nkJ_O4k^5qSHFCspx9Z5DUI#f6Abj(=vH7Q|M}K|p=smz7?5N73pZ zM@bNHm!A{V&GO`M^>!tUW`{UeVf36NQ=L_#l|D}_8NZoOEfr{&pTR&-~jTzVCk1hLXm{8@FD`Ndsck*jmbf%ooU;|dV-cNfQ! z!tyv#9e4aibhWMt=7Kt_SJ+sF-GOw4 z3CE*vb?Jp~3zeC}ET)>uWDMn!SQM(ZQ;BN=+)9zb+g(uk@uDq-!)gH#<#p1!n{ zd7`XCKvGt%O$T+!EkS47I`mPM?1B^}^W~@oMsw?Y#$7Q{B41 zI|E4wNC{P%^xh0jQBgtRKOB=)~}v=`h?P$S<`o_lZvw<`v;8`iE;$RKJfX zl<<{)Et;R9wU<}tSk~kU*Q>tx8uud`-4}?zZf{HHp1GpCBI>&D>$jpq8=V&{nznGT zFrUA^X8naKmkiN`D|>xw1es5Mu~0LV%9W%xwz5o z#@*tleXjgZ!rZ@Pn&1$V|7uSV* zo%UPqygt@yc~crcY!UppW_O^Vlgo$E`h#mJ{fcQlxO-P(KOQMM8$D(I>Xu7LNTs8% zq3b!(<)P`Zz3cPF7U=I&x*vbw+GVk=#hUe}7s@?NI{c|AQ^@J=Skp6bUrpi{YnKk~ z%uJh7IqkD-b-x^mB}oBoY{7T7ytJ5JAl)!Ay~kaHe}_F) z-{ht9ni2Vx&99WN-4vNX+AGU6>?d~Frdjj9Wi?$Nzd2o^(^{?;(feTKg$BCN z#@#PBZ#p>YUxNw%Cd}=;bHeVadA64uKxWEE&lTLm7YeNYvaSB z65-lr(;-@Y+R^#;W$KYn&vQzg z)^-VyCws#hLx-=eS~&l1@4gewYFx6P!d`AK&k{RvCQrS{{WGIlV8;d3W055ejv^-( z?m#jZI0~QlsISkeyr!zY{JM3Op+%*;?#deqSIT@|W#{GITrVBA+CNw%Z1?KMeK&X3 zoLP3qrCcLs?T$c6U#Bw`zHA3nX>hTh@O;7TLJ( zkdaToYx)}UjBrS+%DaZ$mGrOOcJbm$Qo-?LU($!UqO3@9G&RWw?Yj-kun1IW}}n z_dp5zt=k>q5}&%VbUM^63Xhy}cilgQT~W7la=j~8Cwa2ky?Cp?xAT(CTix5P?YmHA zxW#A95wVDuh4sfGZNKL>9#|gSK4CFDyg+LQKi7kmE0bQ2JpYtUC8=?Ab5jadu?=A7 zFHiJ4T*Ps|w@T-%#x<42AI(al4PH-QW=~fUUVUKjSanxV^tDURP8Kg(>D1oaBki01 z;!ApUTke;W&+d9EOSrNKVeWWRrtrE_uNaL>u^y&*|)Q;Wq8N)}qhS z9oF1WVn=klV{KP)!nh^*(yul+-_vkpNt94Q+`TXp^Y5N{j?t}0^j^*v zF4FUhbNe8_(T}#?#{BRab*q6|TFXy+-*K5CCd{y=h&*jI`E|11mkn)iMVCkS+dQ>ccTVlG>mDxZ@e`$a?@L#t8{NDf0^elxjjFoQ;>7+gVXY0M z^m!5pGs&Kyg4r`vcX!&|i9aqg?qdb#4}z?Q{g5S@Egw%8mo?*bCWiBCC+se^m{+58 zgL8wr>k);7f@Pl0$_^Z>mA#bbJ1sHFWzz^%_AoijSbmgWo+fL-!DY>vBvz|^SCN~2 zj|gFpSE4*OfhKcog;pFz$dU87iD`@0o=_5d4oO~1o0OhwV3BC*!QE2GDQnuIy_b?x z*MrL~u3!@@Oib1$%PH8M39WZ%Q}IIgw#{E)kZ@Us&S~#2ddP6}SS;0WK9@%v&;Cjp zo)Ss#D!0alJ)&u^5cP}KP%u_pobRD9peh=+muP89$ee$SJupv@DrBZ7pu26AGHqGA z#NmqSu=xtQM|0Z~X}$DSdYoQC*vd^3%}ot;dZ~FG#~qhVBPbm**OipzahNYjtnb=V8)wee zoJriQxlIhC%{5S92yl1t@{k7zUUsD5$AZ}@Wrt{JCYv4!n|%F_T#K^+eA#4f z`HGM7_zEQ@Th(oA9ppST8BGE;B6dpJ61--`d-P2?>oQLI4HYjiEiDoB5EPb!|3MbE zly8YAb%<(Rs^t&B7Z>1_>*LrND!CG7`w0>?CL(#0c46Y|4>ODP6LFo`3KgOUUDWp3 z$;`NtRsHG%3*@uw#-r1;rPFeIuzHW{_Z_zGUFRmx#xZE8xKTsf%ObbL%>Ow1YX@#QZx>wW^D1+iYvNw=#MwPZ{WwYFJ*-r9vtcAS@qe2oD$qsB1&B^d? zF=qF^E`M+Fs(mLhMfK#-qgzFJRAu(Y_mNc#qr?hNZ`$nc}C8$!%* zLb}ocQ3nE{F|9oDeV_41%GLy`6{XjvfG8#}RmHG0=L!{ye?m<2HrZpUsy99IR>srZ z%!a_t{!TWmlx(h-Z_O>fQm@-+vgm!k2`5SL$|(D*w7BHM&kQRZee@RA$T0>M1t{b0 zU_SbNL!I%ZrrC7(tnb(IT=^dL*BN47t0eVoDbba_BkWCgBaQc5XvbRbwUX}?dM+y@ zaZ(x!kIYm@`c^EpJ836&Stq-gycx6j%cc{>eU4$KyjhW1G;y{4nOZn>F zvq|*M)@w-iD~0M7D1Otu6R+kSr%ENX zlyXz<+O2PGVSkQ~5o+|>*&?a3HvIb0EQNV(mgsz)wwST6$#SParHA{lFLR#l7W2>C zVm*Hsmbcs`x$XAs8S@BA9>oP8 zALLhtF7iypZt!5Y4q)?JXtl?wqF84m`|;w+ml>D~LKc*?{j`r87u4o?Eprzm3Cg${ z>SvXj^zIX5%Qmg=2o~gaYm<2>dd^SR_|AudoMM9U`v>i++PiBla)n4oN<`$-DS@gO z=Ukmd%S5zlWs-L*npN)4@!~QQ7G#%*x0cZ`H=F9v7B?#=+Q-?>TkKt8D6>aWz)q-b zf&6W5u1-n&QGSaQwjMv!L|eNkp1fx@iD%KK0()&c<(u-feQsjJ+KoX(S-w?oodgI2 z)n@|_-an#nMkT%brQ&4{S(xe<^+vJr@e7Mx_xh$LxT<7F+8S0HaAepG4Bgk~b|k;* z7#vXfBA2-LDw|FHwPz+#<}#Eau^h8xVS(-2oq06yM(w*rye;Fe1&SLgk=Lgawbc`_ zI<`XQT^UO$2b=FC=5fnO5s5Etg}kq-C5q|WV!SBDb_M)>KV}r;I|aSF5VK$cs1yTUzN(S8j((@>i8wWb7Xp-wRKSr;7Nrt|YDCk>`3~ z#{Y<4m)g!N9`wA=wEhm}1yzeHVM~Bu(N)UQy@IxfRJ(I=7J;NZg`;+MnzCL#hoZ7K zQM7Z}uGFT)uN=6-7S<=mZ+;lt)KR67Pp!ReeT=Gol7bhwPBY;YTwP{Obr4qcO!~H> z#M;|Ktg^m~w}dlVURxWdfElnsIh(cpS~R>$9bW9HXXp?dG&DM0u!Ji%j2pG-$HGr6 z5>lU6PC`3LW?7S`yatGqB32g96tLbj5kkDjb~lBM1}#GTmoFustZcPLrAJrrzST4i ztW&ZGeSwbN^cr(Z%8#2rP-d3@!cpLGvgP&43{u%MV-FYEx&uVoNP&Oz$)X|i&u-3| zrP)Gbse0JJ%eYrU_O#RO2L+nXu&pzn=ob5QBCFWdD!^2xF4Hx?WbAT{QsO3CXR!;` zxR0Bcm)tEb86vGU#?~%~^%@g1iPBK78FC#wO^};cB9iM9MQN#+&cU^HUZ-U$oaEZK zgg;b|m}78icScpb&pHV#y(XjaRFhSh=c*wBNAm`$zBgRQROUHwJ&PAO z-J2si%61_xDIg)ir{#+d8`7it(nICuDbW4y(OR)f1g*K>zQI+FM4i(SlKB{)>6ZW#u=pf$+jaI(3 zUDE&Cl|(g}4JXs2H3n_?ut`LUfPDMP6G|<`>nB7B;Vx_*#PeAh!LJ<9fWTq&|G~h4 z*r3)FglO!*VjQC3fK42Th6lRNM>JmGkQAa3ffN};+YY1y0lx%EB+#DE|$h2Ti!oZ_pfnJ0o{-$jya$H5a!w?6t0tXa7cyl z2iafgLDwScQr79UfUac)=%Al}ALjBM0-dNaYaJ2VEz}gs$09ug&=s5GkO2#w2k5#j zafmtoe;?+`M+cpO^?#M#JZKpRctm3+r2>R5M7BVv8j1x%5{Ln0uG1Yr4&W$|+0>%2 zescoJKrSE^I1iWu1pE@_$|DMibkq`%%50{;T>g7^PDcjaXdMAjnVJ7K%;~70b3IK! zLoC`M2Xy2!@Xhip#zzzALRaBX1&eVx06NiiIF|Vmn2oi8wT=Y3A?Q?A^>77Uw>N7Y zvy+;}#NCxB=n)L#(MFhB}W2p9?! z1{MQFfGxoJz#*V0kSK&`Vn73+IM4$q0i**ZfwjN|z&@Z95D6oiG*AU71GELo0b_yk zKn73&*a1`ojslf{q9TZ<3?u{hnnV48`+zyX1HdNWA>aUz0VIH*co;|mLax7rx%D6x z79n~d4mmOxvEPO{9RqX&AvhGtT;zTm=5!sPbB)9y0T$_vf-W?MwcQhi#c^Oe4t20d zj|{pB8q7-;Ix6UL5^-pdg)Rqlv0x0mVBPwCn5%CSvwT_5ek|H$0CWcVI26xf9Vc+Z z*ebvwZrty4{psJ5K-awohgw+ZTtSy}2!}*j=xCs;C<7gfcBx>N?W#G&3lHOpWA3I%k;dK_wJp$i3FALzcZ&=oUv4Pf6`v`Y)< zXicokHv~G@X4d5+^1>Q)hIRQ2n7Xr&FN^;00NuoS(6JbQbkKEQWSw3u=qfJb5YvDC zeVCgceV}8svmOVC5Bm2S4(()74;9cg-C$i0ThQg)!Xc&~`THQfv_WU;=8!p;5YOB~W*Q4cccWQJLfD=O%QKu2X!z8uim zj%|Cqc(zyb$Oj zbOww5s9@@dcmz%JhcGv;x^WVo~1#X1-~7B*G#+f(YcBg+~f3bR^KZ=E2}&Q4d$9t_Y7ZSfob--OxTf0#p5m zFgN}xKv#PhkAhj)!EVsWl;P39A5#12$4-C_9l;|m7VD7Ae3+Nzu)eTJj{-V$6xNMD zmQMxM!L7fXp~DVu*GcNC7gRZH5AyfyKZxz!ukP1`><^Y+tvI(dO8~|DX2@Bx<9!LV(09}D=fi$2Wumb20>;^J@feBy$PzGL4 zxDKQMZvaDq%r&GKcnjD9{AU-;jf)mhC_^P4F`uXZKFsNcKu0=;N8ecJh+?3t!6Plm z^Y>vcJp<5r)WLf5dl8(S(|Lf-_9PyiWRWi&bc6<2Z&=LdTF?&|PPt8wDM;19U9fSrlGZFu0CK4_Kr}2A${)7*{OTFDg@a8`dQjx*X6=^x=^! z3tbcFY@a~?vMApG=op}zW-$&3lAs#^d&2Rj1n0&933Q=D(7#|ue;?*_uFUkN@JJ8* zkl%+n9SwASd>rT?;rFVa;}71OgkqTwv0<(HeV9wH8*~%m9O&HdMR0abHvzgP2@aIV zLMO9;x%P3O<1BO((2ar)Ubp;1n9DbmnVvKUviO7QXZeajM+e;#7X8)&I;t!O+Qg#Y zhCtV+!hyarUj+DVm@6Mq3f5*F4&(>V$$lT^bOxX^SPuR6dl8(S(|Lfd4|D_;>nR;{ z1IEzKEd1J9(B)7#5c7H8@55ZaeV}u7;6PKq7r|K$M1<$oBxywB2f6|UfHa^WumUIq z>;?)0Cx9YA85uJy3qfIt_5`T z|AuY|bd3Lojwl230(5eJDBaI~H2~cJi}aX7*W(ZE6$|lIS_vrezgUO2L43v^;x|G3 z3CN%6#{CTNvH?8ahdzQ0gXRWY3+(?s(9mp8(r9ylzp#s1T3UdxgJx!b(aa2U4>tH= zo`OHjtMrtZ@fbQKCT4tQCYByE%g7YquJQ5Mn3xngg)cNF7Hm2_CN?Hz*RGkFl$cO@ z_RLI7Y;1ILV)o3qe{3Wc5ymG{LStigjqZx2hemSDB(I@UX`vq36h1ti7U{!>r_kvh zp=1i#!oq?EsWStl`u{Bavz_J^UNW<@{w*|D6rh^Daj5oC3aVpnj1*M0dmE}fn2b&w zNJ908>8PPJ1Dz_*M$MJ^=xXy(wA0rd(Yy?h9n2MXU4-lu5sLRULoVtFt(iU1)WL^iYUzNI=0WC6EJ@plv1a9=Q%RR+pl-bM@$1|7|q& zV+Otd@DZ&yqIHXe65F z5|r$}0)?!WL&fP^(TDf%(a7*y^ls!GI#qob)fDf9eoI5$XAdKzrFy8b_5=#C5`eZe zLq+kv=maAJjeZ_Sliz00D8wBd9Yr5uyL%1a|*A$X7lL0MS=xjH+dl%zydTT_j0-@1v0UcE$L zK7U4+FJ1b#nfyOH9C-Hp#o)_VuZP~e9UgfX_P(e0_MN-;?)UXSc=+h?lczeDTd%aW zU+w7Zx_13W{LNe44UMNxHg^MkhbjpsDAFZgYI#ykC{6uZt$@+rA-9^QF z_U_w%;NT&~;gV8%YFc_mW>&Tigq+;G{4HCzZQrqT7cDM6EFm!|Ic0NTP_Rl!s7_dT zL}XNSOsxC*4I4c?y}WgNeEs~X0h?CYtX^YlXYb(X7oS{QxIGjBLQD%}s4e^=T&}ic^iFA5wOe~c`ClCk}j+k8@$uTi>LOdPp zDwzh!(o$0BiHTT5ArNAAO)!sR6R8k|ne_}LWJ!-?no&4_KmK4mQ#|NQ3(CAc4#f;j zq4>}e=L8ceDKTU^ojCvnz&9r&B#BbjWQSzAs@s7Sc_jC1ZVd#mqz|6JjRdGM$`A zGoj4v3QbImiA+ued!39Ykh5oK9*Nn>bb2D4mWahF5XP~|$tj76aE6?0Vq&H+ZbBia zP*f;%3XOs#dyr#6ME6Ndrce>x1dqqZnwXd*6R0$LGCW5y!;*clWcUkapMp}7>C7K0 z{6hIsJfKqa*ty?WXb(EGv;R+qe~$Axe}XnU1piqo0bVY|51Sy78wvCCp!tG4NK}v) zi3{_h1@nnWN=yJrO9&!4@B`$f#gL+`1X7ZhLdpsBdMW9+Ul^T zYoH~1T4)*A&gF|2f*o9lj9?=#S%{36l90(#ZDhJk8<`nugROyW*+OKoR2^9uC?m^7 za>!Cw5?N}CA}f+0vex27Hkw>$wK^WHQDaAIRN0WdItDpvVvq|7gIu*SXsr%Aa?``2 zb^3VZzK8>@Uraz7mT;ks%eavT*muw6yvS<>5qTT&&uwG@i(&2GMC63EY768Tw3As-7FGf=pj1`ePnB4 zfYw+pLv~h%$YJFQY!MFXDAGv-MLBDt7?*`;%UW%;75t>F z;IwU9zX)yLuo&&wXn=NlEJeFK4H3=T2*vxEpag$Ylt?v0$pPlGK2U0q6`}{NL@B|m zQF4eqN(ga6@u99LE_5A=3)_Ga!Z)B4@RQP`Tv1lcT9m!T9p!FakMg!{KzTd7P~I*- zln=f_VVplIj`u_R5`5AAM1SzLHlu^7!RSz0C}O0Cp~D#wh>;bI7&+U}p`0D46#R|y zg6*hs_jXiOv z4yrH9Lv>{ZsJ3i3I$pL1)s*c=$I1@Db{HKyQi7_>OHs|yBj|W#IXY2w6xAI&it4M& zQA2eZI$g~`XKD_hv&Z+N^C$MBi?#dFr8?N^52H(sWw0GZ=NqcfnfhvYU+Qsmy1ov! zlc=eo0W~+C0)OH(I@@#_oo{XeAEybmoNYo^E;ONzmQ(23rPJtoYcsmhb{5@izkqIa zTtc@xub`V!=6(fZm>Nbhoz$-MiBZeg$mz@1uwP{pd0HCr=+gLeHK& zhV2P@2L9x;foJIXvlr;a^A~9F#S8Qb{L|O3UZFRyhtTkwH)sU>k#{2_=>5BQv%ci$ zhY#Qn!uD|#jg5VTZ47<-^a-}l=<}Da==+D&z$4^d)Nr@|!-voPZ`$K7#1TbAgoOBseB7KEjB{Mkz30!Ky%>BwJTf-% zV|se}*v0arlAI{4<@$FGxP%;);rk7cU);~Jbk6D>qgJr{wL2~j(qquKJk6( z$DZPZT^nrNPhV}QKXtmbt&^Gjqo;89@#*Wtx9>lu3i6{jt}MFISl`faikbS|`~44? z$$yxH!c9+4dwaWk?>zrJJ)N0med2UoZT+b$ ztxXk-^76{6qeqI;;?_w?J?`#)?B<-hGrhg8?o?NGAvi(1+}&L4ghdxf+u2JU@9FM& z97jw_Za;alqiCJ2qobppot?Cll$01#;n;oY)~&~JB8fE(^_>Zx8$Fz*#DoOJr0v$a zr=7SxIQ{)d%cV7ALP? zhbDdb?&HMw$;q$dpTCa2pUgRX=G^)7Z4YxhH&df_>~8LVJ@oq3$osL;FJC@n3{ z;j+rAb3M1`71bCAhlU0PQX_8;PrQFW`sw4?=)1S$Mf=N2&vtgZ;}cUXHV21AM8(F2 z#`aGCfQ#?my&W1Z+^a}#AwRb>Td`Ot~s z=L65~Cuim67wp+n4%efM{HU8_llNb~H#FU&7!f@E^wE>{t(jRlx%q|V8#sd#ckb(a z_44K0ckka%Z=^)~x4i6sRJ1LXo|&DKcW@mcERwW%X>ix*!1JNuH_DsCf?{6Ydk_mB zJe&$i>~-S^i_$e%L{g`JdowtCMLj4m$oF#p^?+?V5|dKsnFX$JU2loG;S%-WiPsZ5 zl{W-qIyYmo8P$nHW%B?(0kSrN8zKkBo|CCXwyL6$;mx zL2t?TR&`@@3ty9@Hvi!8$Y^E~Sq}KnNL^<1rAyTB=W4A0fpKz<@8;mp2vBUJ+u(j) zU#ijUr?=F=h-?%YYC#PMWcEo+;ws$cK=p-M%%B-E3oRX89Rnj~M!wX|k@9Sbhv`{! zfu1=_s5bcR1qDo}zG5rpY}KB9`wsjX_U}7zka4)QwESr0*~*ZAdISF_j+kCJkw~2N z#+mPI#=sHt@7(*B+2HBk+%@LAd*OdLWah3h-;2z2XA;@r;RSL=4rn9%HAnWaXNA_l zYZDuRtKpgMn%PR7$9|Y*#zcr0mCT-jHzPqXf{l3=3qMT$8U`Up45Sx{!chPUhX0+h z00tsoNI4k!A!g&X%xXwT4_>WV0-GK(nSI^H7KuV!Q_uvVP~-{vEl?UyIP#s%!Up!e zA>9xZ4QWQe76KZX*%;vvBLuE_Le6vN;l=^ph>H0;e=|rWVm5vNX#b@`pjZX1;0kH^ z!g(2_0xhBnWR^Gr&Uixk1EEe-NZA+me16fG!8zvj5U8mP#AD_Wf})@#-n0A6g6km8 zU&`SO=fnRlJ@dLYw15`0fEMg60yQ(t#bK5pa#kNao6EmigV|FNf90oxHqXXc0dI=N zK;JQ2-XFHPI6vE;c{JCOzsA*q+AwR!3|o;p#0Q@XVl(T+?1@n5gSqsmP!jZ;bIkTK zooz22r~?TthIaVB+fxV`!WhFKTgWQ}N)!dH7x|CA|8rj;XgAz{#QpbH{@KRNdXfA+OoCXU1Xni~e7|V+O|Eq%sBp-rZu1XhHr0g%f5@Gj?MUX-)_@!KXB3PRN*{4> zah{3dZp9OZIN0SkY+ToQ`3pug;mYT!b4#)#6=aTYKS1`2TVZX=Cz^DCjgrvL&87SB z%sLv^RWk*lmF%WD?7gD#=^}dA$*qFRBQ($|1)^?CX4yLv9~>Pg6Or3u_4xx^OEfo~ z!*bZ6T|AC2J{aSsv5c?&(T?UP^Rn#T`+TsrrBNd5_)_1kTfrM)a$Zci*{V!Brzc~X zjq1JmE#a+il)PrxnlT5rCvv#tke_@j;7GkKOl-d&Ix&GK@Fl*Tj?LI&ZxwpVVb`0( z3LMrR<2^&oY!uafM_WQpbbM%gafvPIStQ3u-rzm@VvH&U3>GGgdV&L;Jq!LdCN zX~TUhIhI-ALmno72r0d)ZnkQ#{M~*f+jXnhhzu-^|0b7;5aw`8`(BeP1OwuCB}SGR z`*lI`ywDC32SZPF%~b`8D7T@Y?Zr1%e3TDn#EvTqjqlYx2-V_kRw%$>B`Y&3%W(>H zdxAlI_ZQoY3ZYjkB&%yvYdElC3)P7axW)6y-|a*SrVl>KkQ6?10K@0?UW%*EK&V<- zKg|i=1+qTw-6}zYoDfo@DNnk^RINM(TNyp}&&0%`q9aoP=!( z6ihNEJ;E&M>m%OgAo&D~$!#W&zpZ?9(A7)=6TVP41dAt(f0~ivmb4qPc$!m=VGL`e zk}}m-ZX#354#nCratar>%BChMbMiP3ebv|&e%^S2wxUO8LH{KcvIw`V6Pu8O&8S{d zXYC5JRQ9g~FT16dcut1b+dPo5r(=*rj$%QnqC;MH@>PcI38Q{3KVA z7$t4WoxPIW@{xVK9q;<)t0YdnH&tk!qG}F?TF*7c(QW7QadCy1h%qg1U!xLVdGs>6 z1-Bsk)%8|At!5w3jFz8KS{L_DT-b=3%*)Ps&2A>2Sea^`b8d+%`0cgddpX!5 zMeN_7B3fP)i<&aiB_4B2n0FaFJjiWVjn{~3QwbTnzH;J8qu7r9mIr7X6PC3`u6+|@ zpzzw>ko^^~l zCibOI#O-=*#aC?fo#)aJ_tKe;C|r89xfX`wXj1R+Y1L?K1m7h;WgFtHF79=B4))9O z0)*kueSI%cM%@T73#FX)rOH=b@K$K*+{m-98FEBPHYo=r!9z;SF)Bx z?dZFm=K~Lm*KG~#x0%W&ZxBdZ^c6F)?A8vwLA(XxJJpSGn$j4`vEC8MKHZUaKT2|e z+S1E;JgcP%o-M@WD|%9R3g*1)(81<-Ex>7SJ9JbjXKj{-q?M7Ni_@!TWz?6(mh;CyR4O;yJ~6pr zn*NTsHPWVYAR<|6hl<8Z!o>bdCX;NRjaSj=-r#La>P%qzbuuJpd8%RRf!cEZhM`@5fl;arB$yr$bVHFYtEgT&{%h}n|Pe~ z)#7=&V*ZEp)d8P-y%KirUz?uPl0sU&Xn1v^H-$L-f!s+fc#z;El+=5hZTMdOS7Dy9 ztHExH>Sg(6_V&A!D~XDniu>jFZ(J$ov^H-hkPXQcq0H?ZV92g2AHH?zjfcmxS9YG6(YBkghKb#`h~K5S(l{!<@?tfz z>0E0U$h}UHQq(({;cK4c%cHTiTkhP^WJhjA-6W&l6VGo6uC}(_c9JKviKZ!WtR>x9 zFLi!R`I|z@69ePWgunoA&qzi{u#ACk_}AB$_X~VzlDQc5Jyc8Dk?OnM-_YCNXSz>F zG2)5-#z4cf!7CyeUSGyTJQuwS@OdifV74mKQb|AF+egDQFh=Hx?iRI6E(*%t-JFECA(5*uo~Ev7VEEH=_lX!ALP2#-J`^Von$d)u<$RXnCG2~>(_ zu+P=^9BV>P2#aQ0zK*o1x*`-P*|*&}z$iSjhruw;+UlLZH!RvAf3F;8yjj+k)DKJi9^g=4}q45@hGFJ;X6Y%aHM`Mia2BfJHsl~JwuT;f}O*X zxs*!-gz6!1K+tlu17dU0rf?DXgo#}-Y{tfg>238G=k!?%x?wnrtv3pnCSoDb+p61X zJoFwsDZ$R6*MRV`R&^*@>UIT5&&%8>5_~S^``z8aJ1e|JKpo(3U7z#6h)loh3T#bp z&Uf==(hmw4pj2Z_x}yR%-JZLh?M=dEoO)NP^^|T)Yg4SVo`6p_4$6iSu3()U>|C7f zGmBjyO1gunefkg>Bj)S-GZENLD19Z7y(=9v)9sc%VQZhRn{Emp7LiU!T`7}pDmk|Y zMlgLPH+xs6siZAu$KufSoP6VX96fvR}0PDPfaosgnUNRR|>fe zLnJDqA+!m(%N>Uazm z6Tg@ZgJrmpTuHjWoZ%xWvSZ+VJ0()^-af8`67KF~Og%$=wFO8-=4lQ=PUfMEV@OP}_5zXw^Bk9; zkR#PICel~NG$c48Dljr2*k8umTU&*s#JoIDP}&rp!Ugy-O-%rp8VBF-=m2lu2pO}0 z=zs_~qb*C4W-8eQMgL03HrzKTAS!59>KiU&YCN0R&!*+Xh=_&GDKsM>G2d`<L<#KJ+MC0F!kyI zeN3iJHjmS?kijWgzU4yQss&RY(}Ep)0}g*&mA}+@ddD4~ZQkbN9v%y{7nHrZ&6oZ? zSV^J2V&>(`oI4GdAK7{wU&{sq3R4VI_(vm1TGO^vlcG}|}}6tN;CAv^)bHV((Z z&i3~nJBgQ>0Ut9{EDS?DNtJobkCh|Ilu3~!wZ%!Ia02?D-!?oT+B4F3m8X|)ppK@t zp5CvG3d5BhS~L3O{`Z21B))3uhwGHd3bKC|9mi<(O_TEYrf_r(Pd4+)j*4PR_i8$%hgHsZYLB&PA<6^FvJ6C*IAuE3@_H=~$0IE7C$ z?JZ2l9|lo)w9Edj#H6_Ne-5}mOfaF@o`DHA&nzn3%QHASATZEZn-5Z(onrX8w*NWj z=KX8V{W`b)bC@~?1i>`+3<~{gn9j})Z5@){FS7# z0CTu&$XEq?YiX;`_91kc+|LU#%&cS_e&+S}EQh%fkCFSeRhW|_9>WLgC5DSF9)m%Z zT_?+~-;g=MwIj7UC2F)`^~a}|_%8Z;o-g&0d~kNMOZQkJDb;mn#>35z7aiog*fSD4 z7E``6#PDMN37#|5&w&M9=j}C*QI>x>b$9(n3ARJu7H*a*8!z2kF5bcRY}YFL7rY)L zWXYY)JWq_SHatx^zj5m(Z7udaae@_=GB>p&cw97Z#Omo53hWVRenMSX_3Fjtv<$V@ zblDWY^9imlAyF3%tCUjKcM*jR4<){Jyu=lJWxCD!aWe;hk=*u&E0lYrVn+^XcYb^& zC-(44y`|}1@r?|roWTuW-f#c7dJLUp(l4|6*Vuo}>tBb;U(=dt3Se4ulem7Cf}QXmlUac&;>UtDC=(;i z|7k$j1-Ts^jA5V|XliTf>;BsRf6Zg-&696kFPlkfr*7G!zWZW)HRhh=svEUwuE9?U zs-+t`y7C2IW9@l9Si{~`k|pBG=0ly_iBaS zO6ApCkDvB5{-k#Eb!Y#E$7j`(Rx}=H?0@DmbD^Pa=a*aD2SLicDkRqQ-{``=3ZzhyU=6LJwrM|*BQlE7R+f9dFueon}^ z?0?Qkei9#ZMiK-GR)K*5!65+=+JYp0<|z(AE(dR_XH<|^RJgyk3`vT4l1p&Dji+~b z$eg7G3mqOB5KBq&M=F&f* zllGvrQiNZ^X#W+0`7Xzy6NJ*uy~fAQWV~O=54OdM6n?VjSahebWb=iy>3hd^+h1;v zeswOpl6&)J0eAo0lmpIn6*o6*=?&3Rbq;79OUHze;L9Ef>O1_`e>~s%*KF=5#oZ%u zGv~&vwPl0XC{{3!q_JRSNnm9e3zIc}nUVitXH7$VeE)JV{+fB#dP}KF7V3e^UE%Cj>0=Wn8q$*rIl*2xCM>Mxgb1r^l)p+@~ zzWs|#{wLyEHV5@-6B4xQ69;}I1zD%Acn}i1?(F>yyDz`jBfThXn>lfj^THtk;#=~Y zE?w-KC6Uj4%0bF~yPy6>T$=fG^y;S$w30ZP1IOv^C4}*p zq{;Vki&vR&-F(_EedV6hn>eFJ`%;Z6%+|4zs!aXqL$B6v!W~+^`NhTEEz{RMCdsck z7-qw9cELx~#!jUXRo-Pk!ZVU>_inQ$@Q@aC5f5%2f8%-_TS?w?Qe`Mxq}uR>L&(b8 z`Ue_Ad=}L2);PQT^_JnFt&<|Jlxj|V*yC`TtWnssrE2<){V~Z|L}^LPE<;4=!4bv7@2hgTRP)OSAH~$?LME2TF>9O(f*mY zZ)Vb_Mc0eO-}WU^;!fU^jr(N;>$aO;u)UG+nl?Y-sB*r)pvCvDreb6E>-+51;nH_i zgnW{)l~B+c3&;$V8$a76QuvNLvV|JcKfK2)L~7(#`D3NU+luPOvsJ@vw4x*^ z#t%jtd1M^##W0HEy#s!5-bx#dI?K7Qf0ExxX|Jcwg{^G0+mbJow5H2x#P;Y%pUaDI zpKN}$N|;Oj`e5%JJuNG;upytvR)zK>ejj$<3LReY`ZLeYM?Kq1qr(C&?O$U_(wD6( zIU(+4sNSDdrN*(XPqf~B+w%iQLZ%HFdbl z9&KPh{Hx!;&=dzs4fG`&cXJUzUH?OZ?^5AAE2ue5TP6UMmfq z>N{ITV%jiM8 z4Nk4RM|CIr9&TRo%;{dtxYNa|rM5!6z1wpw)g3N|pJ`-dH#!osr;foFp9((hJZXMa zrhlE6`R&{1{W!u#X2eA7_zV^W{Eov;DT{ za6AU=2Il*}S|6_+kAYh}%n)-N`Twt23O3?@*e7m0VeYvR8#u>|wQxWD_i$j>p7-|w z2L^`G-&b(jeBdoECh6%c)?P$1&|mBZ&r$xqiq#gt5)TjsOyjnK z=5O3PH=4}TFP~1w-@ZHZ_T7Uh8_IUVhPJHIrNPT?JWf{qAQEzKg`dqg)rbqhQ>KP; z-VtemMZ}!1z4U!c`cxz)4pz!8;kF60yl-roIq$%`T!p(ed>C=fNRH%Nws# On>z|V$)G!WmDS7u literal 0 HcmV?d00001 diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/corecomp.ini b/PL2303-Prolific-DriverInstaller-v1.5.0/corecomp.ini new file mode 100644 index 0000000..0d9a132 --- /dev/null +++ b/PL2303-Prolific-DriverInstaller-v1.5.0/corecomp.ini @@ -0,0 +1,2733 @@ +; Corecomp.ini +; +; This file stores information about files that InstallShield +; will install to the Windows\System folder, such as Windows +; 95 and NT 4.0 core components and DAO, ODBC, and ActiveX files. +; +; The entries have the following format, without a space before +; or after the equal sign: +; +; = +; +; Currently, following properties are supported: +; 0x00000000 No registry entry is created for this file. It is +; not logged for uninstallation, and is therefore +; never removed. +; +; Inappropriate modification to this file can prevent an +; application from getting Windows 95/Windows NT logo. +; +; Last Updated: 2/27/2002; rs + +[Win32] + +12500852.cpx=0x00000000 +12510866.cpx=0x00000000 +12520437.cpx=0x00000000 +12520850.cpx=0x00000000 +12520860.cpx=0x00000000 +12520861.cpx=0x00000000 +12520863.cpx=0x00000000 +12520865.cpx=0x00000000 +6to4svc.dll=0x00000000 +82557ndi.dll=0x00000000 +8514a.dll=0x00000000 +95fiber.dll=0x00000000 +aaaamon.dll=0x00000000 +aactive.dll=0x00000000 +aart16.dll=0x00000000 +aart32.dll=0x00000000 +access.cpl=0x00000000 +accessibility.dll=0x00000000 +accmdd16.dll=0x00000000 +accmdd32.dll=0x00000000 +acctres.dll=0x00000000 +accwiz.dll=0x00000000 +acl.dll=0x00000000 +acl.vxd=0x00000000 +acl5446.dll=0x00000000 +acl5446.vxd=0x00000000 +acl7543.dll=0x00000000 +acl7543.vxd=0x00000000 +acl7548.dll=0x00000000 +acl7548.vxd=0x00000000 +aclb.dll=0x00000000 +aclb.vxd=0x00000000 +acledit.dll=0x00000000 +aclmm.dll=0x00000000 +aclmm.vxd=0x00000000 +aclui.dll=0x00000000 +acsetupc.dll=0x00000000 +acsmib.dll=0x00000000 +acssnap.dll=0x00000000 +activeds.dll=0x00000000 +activeds.inf=0x00000000 +activeds.tlb=0x00000000 +actxprxy.dll=0x00000000 +admin.dll=0x00000000 +admparse.dll=0x00000000 +admwprox.dll=0x00000000 +admxprox.dll=0x00000000 +adptif.dll=0x00000000 +ads.exe=0x00000000 +ads95vc.exe=0x00000000 +ads95vc.inf=0x00000000 +ads98vc.exe=0x00000000 +ads98vc.inf=0x00000000 +adsiis.dll=0x00000000 +adsiisex.dll=0x00000000 +adsldp.dll=0x00000000 +adsldpc.dll=0x00000000 +adsmsext.dll=0x00000000 +adsnds.dll=0x00000000 +adsnt.dll=0x00000000 +adsnw.dll=0x00000000 +advapi32.dll=0x00000000 +advpack.dll=0x00000000 +afvxd.vxd=0x00000000 +alink.dll=0x00000000 +alinkui.dll=0x00000000 +alrsvc.dll=0x00000000 +alt.dll=0x00000000 +am18.dll=0x00000000 +amcompat.tlb=0x00000000 +amddlg.dll=0x00000000 +amdmp.sys=0x00000000 +amdncdet.dll=0x00000000 +amf18.dll=0x00000000 +amstream.dll=0x00000000 +anim30e.ocx=0x00000000 +ansi.sys=0x00000000 +apcups.dll=0x00000000 +apix.vxd=0x00000000 +appexc32.dll=0x00000000 +apphelp.dll=0x00000000 +appmgmts.dll=0x00000000 +appmgr.dll=0x00000000 +appwiz.cpl=0x00000000 +asferror.dll=0x00000000 +asfsipc.dll=0x00000000 +aspnet_filter.dll=0x00000000 +aspnet_isapi.dll=0x00000000 +aspnet_rc.dll=0x00000000 +aspnet_regiis.exe=0x00000000 +aspnet_state.exe=0x00000000 +aspnet_wp.exe=0x00000000 +aspperf.dll=0x00000000 +astm3d32.dll=0x00000000 +astminit.dll=0x00000000 +asycfilt.dll=0x00000000 +asycpict.dll=0x00000000 +atapchng.vxd=0x00000000 +ati.vxd=0x00000000 +ati_3dae.dll=0x00000000 +ati_ddae.dll=0x00000000 +ati_drae.drv=0x00000000 +ati_i9ae.dll=0x00000000 +ati_vpae.dll=0x00000000 +ati3d.dll=0x00000000 +ati3dcif.dll=0x00000000 +ati3dcor.dll=0x00000000 +atictl32.dll=0x00000000 +aticwdde.dll=0x00000000 +atid3d.dll=0x00000000 +atid3dr3.dll=0x00000000 +atidev.dll=0x00000000 +atidiag.dll=0x00000000 +atidil.dll=0x00000000 +atidplx.dll=0x00000000 +atidpp.dll=0x00000000 +atidrab.dll=0x00000000 +atidrae.dll=0x00000000 +atihal64.dll=0x00000000 +atiht.dll=0x00000000 +atilcd.dll=0x00000000 +atim32.dll=0x00000000 +atim64.dll=0x00000000 +atimppif.dll=0x00000000 +atipita.dll=0x00000000 +atir3.drv=0x00000000 +atir3d16.dll=0x00000000 +atir3d32.dll=0x00000000 +atir3d3d.dll=0x00000000 +atir3hal.dll=0x00000000 +atir3icd.dll=0x00000000 +atir3tv.dll=0x00000000 +atir3vpe.dll=0x00000000 +atirage.dll=0x00000000 +atitb.dll=0x00000000 +atitbdrv.sys=0x00000000 +atitvo32.dll=0x00000000 +atitvout.dll=0x00000000 +atitvt16.dll=0x00000000 +atitvt32.dll=0x00000000 +ativpe32.dll=0x00000000 +ativpm16.dll=0x00000000 +ativpm32.dll=0x00000000 +ativtvpm.dll=0x00000000 +atkctrs.dll=0x00000000 +atl.dll=0x00000000 +atls.dll=0x00000000 +atlsdd16.dll=0x00000000 +atlsdd32.dll=0x00000000 +atmfd.dll=0x00000000 +atmlib.dll=0x00000000 +atmpvcno.dll=0x00000000 +atmui.dll=0x00000000 +atmuni.sys=0x00000000 +atrace.dll=0x00000000 +audiosrv.dll=0x00000000 +auhook.dll=0x00000000 +author.dll=0x00000000 +authz.dll=0x00000000 +autmgr32.exe=0x00000000 +autodisc.dll=0x00000000 +autprx32.dll=0x00000000 +avicap.dll=0x00000000 +avicap32.dll=0x00000000 +avifil32.dll=0x00000000 +avifile.dll=0x00000000 +avmeter.dll=0x00000000 +avtapi.dll=0x00000000 +avwav.dll=0x00000000 +avwin.dll=0x00000000 +awbmsc32.dll=0x00000000 +awbtrv32.dll=0x00000000 +awcapi32.dll=0x00000000 +awcl1_32.dll=0x00000000 +awcl2_32.dll=0x00000000 +awcodc32.dll=0x00000000 +awdcxc32.dll=0x00000000 +awdenc32.dll=0x00000000 +awdevl16.dll=0x00000000 +awdevl32.dll=0x00000000 +awfaxp32.dll=0x00000000 +awfext32.dll=0x00000000 +awfmon32.dll=0x00000000 +awfr32.dll=0x00000000 +awfxab32.dll=0x00000000 +awfxcg32.dll=0x00000000 +awfxio32.dll=0x00000000 +awfxrn32.dll=0x00000000 +awkrnl32.dll=0x00000000 +awlft332.dll=0x00000000 +awlhut32.dll=0x00000000 +awlinx32.dll=0x00000000 +awlinz32.dll=0x00000000 +awlzrd32.dll=0x00000000 +awnfax32.dll=0x00000000 +awpwd32.dll=0x00000000 +awramb32.dll=0x00000000 +awrbae32.dll=0x00000000 +awresx32.dll=0x00000000 +awrndr32.dll=0x00000000 +awschd32.dll=0x00000000 +awsnto32.exe=0x00000000 +awsrvr32.dll=0x00000000 +awt30_32.dll=0x00000000 +awutil32.dll=0x00000000 +awview32.dll=0x00000000 +axdist.exe=0x00000000 +azt16.vxd=0x00000000 +basesrv.dll=0x00000000 +batmeter.dll=0x00000000 +batt.dll=0x00000000 +bidispl.dll=0x00000000 +bios.vxd=0x00000000 +biosxlat.vxd=0x00000000 +bkupnet.dll=0x00000000 +bkupprop.dll=0x00000000 +blackbox.dll=0x00000000 +bootvid.dll=0x00000000 +br549.dll=0x00000000 +browselc.dll=0x00000000 +browser.dll=0x00000000 +browseui.dll=0x00000000 +browsewm.dll=0x00000000 +btpagnt.dll=0x00000000 +c_g18030.dll=0x00000000 +cabinet.dll=0x00000000 +cabview.dll=0x00000000 +cachevu.dll=0x00000000 +camocx.dll=0x00000000 +capesnpn.dll=0x00000000 +cards.dll=0x00000000 +caspol.exe=0x00000000 +catsrv.dll=0x00000000 +catsrvps.dll=0x00000000 +catsrvut.dll=0x00000000 +cba.dll=0x00000000 +ccapi.dll=0x00000000 +ccdist.exe=0x00000000 +ccei.dll=0x00000000 +ccfapi32.dll=0x00000000 +ccfg95.dll=0x00000000 +ccfgnt.dll=0x00000000 +ccpsh.dll=0x00000000 +cdfs.vxd=0x00000000 +cdfview.dll=0x00000000 +cdist.exe=0x00000000 +cdm.dll=0x00000000 +cdmodem.dll=0x00000000 +cdonts.dll=0x00000000 +cdosys.dll=0x00000000 +cdtsd.vxd=0x00000000 +cdvsd.vxd=0x00000000 +certadm.dll=0x00000000 +certcli.dll=0x00000000 +certmgr.dll=0x00000000 +cewmdm.dll=0x00000000 +cfgbkend.dll=0x00000000 +cfgmgr32.dll=0x00000000 +cfgwiz.dll=0x00000000 +cfm30.dll=0x00000000 +cfm30u.dll=0x00000000 +cfmo30.dll=0x00000000 +cfmo30u.dll=0x00000000 +chcp.com=0x00000000 +cheyprop.dll=0x00000000 +chiadi.dll=0x00000000 +chikdi.dll=0x00000000 +chips.dll=0x00000000 +chips.vxd=0x00000000 +choosusr.dll=0x00000000 +ciadmin.dll=0x00000000 +cic.dll=0x00000000 +ciodm.dll=0x00000000 +cirrus.dll=0x00000000 +cirrus.vxd=0x00000000 +cirruslg.dll=0x00000000 +cirruslg.vxd=0x00000000 +cirrusmm.dll=0x00000000 +clb.dll=0x00000000 +clbcatex.dll=0x00000000 +clbcatq.dll=0x00000000 +cliconfg.dll=0x00000000 +clrviddc.dll=0x00000000 +clrviddd.dll=0x00000000 +clusalgo.dll=0x00000000 +clusapi.dll=0x00000000 +cmc.dll=0x00000000 +cmcfg32.dll=0x00000000 +cmdial32.dll=0x00000000 +cmgr32.dll=0x00000000 +cmnquery.dll=0x00000000 +cmpbk32.dll=0x00000000 +cmprops.dll=0x00000000 +cmthunks.dll=0x00000000 +cmutil.dll=0x00000000 +cmutoa.dll=0x00000000 +cnbjmon.dll=0x00000000 +cnet16.dll=0x00000000 +cnetcfg.dll=0x00000000 +cnfnot32.exe=0x00000000 +cnvfat.dll=0x00000000 +colbact.dll=0x00000000 +comaddin.dll=0x00000000 +combuff.vxd=0x00000000 +comcat.dll=0x00000000 +comctl31.dll=0x00000000 +comctl32.dll=0x00000000 +comdlg32.dll=0x00000000 +comm.drv=0x00000000 +command.com=0x00000000 +commctrl.dll=0x00000000 +commdlg.dll=0x00000000 +commtb32.dll=0x00000000 +compatui.dll=0x00000000 +complinc.dll=0x00000000 +compobj.dll=0x00000000 +compstui.dll=0x00000000 +comrepl.dll=0x00000000 +comres.dll=0x00000000 +comsnap.dll=0x00000000 +comsvcs.dll=0x00000000 +comuid.dll=0x00000000 +confapi.dll=0x00000000 +confcli.dll=0x00000000 +confcp.dll=0x00000000 +configmg.vxd=0x00000000 +configwizards.exe=0x00000000 +conflnk.dll=0x00000000 +confmsp.dll=0x00000000 +console.cpl=0x00000000 +console.dll=0x00000000 +contab32.dll=0x00000000 +convdsn.exe=0x00000000 +convmsg.dll=0x00000000 +cool.dll=0x00000000 +corperfmonext.dll=0x00000000 +corpol.dll=0x00000000 +country.sys=0x00000000 +cpq_bb.dll=0x00000000 +credui.dll=0x00000000 +crswpp.dll=0x00000000 +crtdll.dll=0x00000000 +crypt32.dll=0x00000000 +cryptdlg.dll=0x00000000 +cryptdll.dll=0x00000000 +cryptext.dll=0x00000000 +cryptnet.dll=0x00000000 +cryptsvc.dll=0x00000000 +cryptui.dll=0x00000000 +cs32ba11.dll=0x00000000 +csapi3t1.dll=0x00000000 +csc.exe=0x00000000 +cscdll.dll=0x00000000 +cscomp.dll=0x00000000 +cscompmgd.dll=0x00000000 +cscompui.dll=0x00000000 +cscui.dll=0x00000000 +cspman.dll=0x00000000 +csrsrv.dll=0x00000000 +csseqchk.dll=0x00000000 +ct_65550.dll=0x00000000 +ctl3d.dll=0x00000000 +ctl3d32.dll=0x00000000 +ctl3dv2.dll=0x00000000 +custommarshalers.dll=0x00000000 +cvid32.qtc=0x00000000 +cvt16.dll=0x00000000 +cvt32.dll=0x00000000 +cvtres.exe=0x00000000 +cwbaudio.drv=0x00000000 +cwbfm.drv=0x00000000 +cwbmidi.drv=0x00000000 +cwbpcple.dll=0x00000000 +cwdaudio.drv=0x00000000 +cwdfm.drv=0x00000000 +cwdmidi.drv=0x00000000 +cwdpcple.dll=0x00000000 +cy9382.dll=0x00000000 +d3d8.dll=0x00000000 +d3d8thk.dll=0x00000000 +d3dhalf.dll=0x00000000 +d3dim.dll=0x00000000 +d3dim700.dll=0x00000000 +d3dpmesh.dll=0x00000000 +d3dramp.dll=0x00000000 +d3drampf.dll=0x00000000 +d3dref.dll=0x00000000 +d3drg16f.dll=0x00000000 +d3drg24f.dll=0x00000000 +d3drg24x.dll=0x00000000 +d3drg32f.dll=0x00000000 +d3drg32x.dll=0x00000000 +d3drg55x.dll=0x00000000 +d3drg56x.dll=0x00000000 +d3drg8f.dll=0x00000000 +d3drg8x.dll=0x00000000 +d3drgbf.dll=0x00000000 +d3drgbxf.dll=0x00000000 +d3drm.dll=0x00000000 +d3drm16f.dll=0x00000000 +d3drm24f.dll=0x00000000 +d3drm32f.dll=0x00000000 +d3drm8f.dll=0x00000000 +d3dxof.dll=0x00000000 +dacui.dll=0x00000000 +danim.dll=0x00000000 +dao360.dll=0x00000000 +dataacc.exe=0x00000000 +dataclen.dll=0x00000000 +dataedcl.dll=0x00000000 +datapath.tlb=0x00000000 +datime.dll=0x00000000 +davclnt.dll=0x00000000 +dbadapt.dll=0x00000000 +dbgeng.dll=0x00000000 +dbghelp.dll=0x00000000 +dbmsadsn.dll=0x00000000 +dbmsrpcn.dll=0x00000000 +dbmsshrn.dll=0x00000000 +dbmssocn.dll=0x00000000 +dbmsspxn.dll=0x00000000 +dbmsvinn.dll=0x00000000 +dbnetlib.dll=0x00000000 +dbnmpntw.dll=0x00000000 +dci32.qtc=0x00000000 +dciman.dll=0x00000000 +dciman32.dll=0x00000000 +dcom2w98.dll=0x00000000 +dcomext.dll=0x00000000 +dcpromo.dll=0x00000000 +ddao35.dll=0x00000000 +ddeml.dll=0x00000000 +ddraw.dll=0x00000000 +ddraw16.dll=0x00000000 +ddrawex.dll=0x00000000 +debmp.dll=0x00000000 +decdnet.dll=0x00000000 +decpsmw4.dll=0x00000000 +decvw_32.dll=0x00000000 +defea.dll=0x00000000 +defpa.dll=0x00000000 +defrag.exe=0x00000000 +dehex.dll=0x00000000 +demet.dll=0x00000000 +desk.cpl=0x00000000 +deskadp.dll=0x00000000 +deskcp16.dll=0x00000000 +deskmg16.dll=0x00000000 +deskmgmt.dll=0x00000000 +deskmon.dll=0x00000000 +deskperf.dll=0x00000000 +dess.dll=0x00000000 +devapps.cpl=0x00000000 +devenum.dll=0x00000000 +devmgr.dll=0x00000000 +devmgr32.dll=0x00000000 +dewp.dll=0x00000000 +dfrgres.dll=0x00000000 +dfrgsnap.dll=0x00000000 +dfrgui.dll=0x00000000 +dfscore.dll=0x00000000 +dfsgui.dll=0x00000000 +dfssetup.dll=0x00000000 +dfsshlex.dll=0x00000000 +dgnet.dll=0x00000000 +dgrpsetu.dll=0x00000000 +dgsetup.dll=0x00000000 +dhcpcsvc.dll=0x00000000 +dhcpmon.dll=0x00000000 +dhcpsapi.dll=0x00000000 +dhio32.qtc=0x00000000 +diactfrm.dll=0x00000000 +diasymreader.dll=0x00000000 +dibeng.dll=0x00000000 +digest.dll=0x00000000 +digsig.dll=0x00000000 +dimap.dll=0x00000000 +dimm.dll=0x00000000 +dindi.dll=0x00000000 +dinput.dll=0x00000000 +dinput8.dll=0x00000000 +directdb.dll=0x00000000 +diskcomp.com=0x00000000 +diskcopy.com=0x00000000 +diskcopy.dll=0x00000000 +diskmgmt.vxd=0x00000000 +disktsd.vxd=0x00000000 +diskvsd.vxd=0x00000000 +dispdib.dll=0x00000000 +dispex.dll=0x00000000 +dlcapi.dll=0x00000000 +dlcndi.dll=0x00000000 +dmband.dll=0x00000000 +dmcolor.dll=0x00000000 +dmcompos.dll=0x00000000 +dmconfig.dll=0x00000000 +dmdlgs.dll=0x00000000 +dmdskmgr.dll=0x00000000 +dmdskres.dll=0x00000000 +dmiapi32.dll=0x00000000 +dmime.dll=0x00000000 +dmintf.dll=0x00000000 +dmloader.dll=0x00000000 +dmocx.dll=0x00000000 +dmprnt.dll=0x00000000 +dmprnt32.dll=0x00000000 +dmreg.dll=0x00000000 +dmscript.dll=0x00000000 +dmserver.dll=0x00000000 +dmstyle.dll=0x00000000 +dmsynth.dll=0x00000000 +dmusic.dll=0x00000000 +dmusic16.dll=0x00000000 +dmusic32.dll=0x00000000 +dmutil.dll=0x00000000 +dnsapi.dll=0x00000000 +dnsrslvr.dll=0x00000000 +docobj.dll=0x00000000 +docprop.dll=0x00000000 +docprop2.dll=0x00000000 +domadmin.dll=0x00000000 +dosmgr.vxd=0x00000000 +dosnet.vxd=0x00000000 +dpcdll.dll=0x00000000 +dplay.dll=0x00000000 +dplayx.dll=0x00000000 +dpmodemx.dll=0x00000000 +dpnaddr.dll=0x00000000 +dpnet.dll=0x00000000 +dpnhpast.dll=0x00000000 +dpnhupnp.dll=0x00000000 +dpnlobby.dll=0x00000000 +dpnmodem.dll=0x00000000 +dpnwsock.dll=0x00000000 +dpserial.dll=0x00000000 +dpvacm.dll=0x00000000 +dpvoice.dll=0x00000000 +dpvvox.dll=0x00000000 +dpwsock.dll=0x00000000 +dpwsockx.dll=0x00000000 +drmclien.dll=0x00000000 +drmstor.dll=0x00000000 +drmv2clt.dll=0x00000000 +drprov.dll=0x00000000 +drvspacx.vxd=0x00000000 +drvssrvr.hlp=0x00000000 +ds16gt.dll=0x00000000 +ds32gt.dll=0x00000000 +dsadmin.dll=0x00000000 +dsauth.dll=0x00000000 +dsctl.dll=0x00000000 +dscvr.dll=0x00000000 +dsdmo.dll=0x00000000 +dsdmoprp.dll=0x00000000 +dsetup.dll=0x00000000 +dsetup6e.dll=0x00000000 +dsetup6j.dll=0x00000000 +dsetupe.dll=0x00000000 +dsetupj.dll=0x00000000 +dsfolder.dll=0x00000000 +dskapi16.dll=0x00000000 +dskapi32.dll=0x00000000 +dskmaint.dll=0x00000000 +dskquota.dll=0x00000000 +dskquoui.dll=0x00000000 +dslite.dll=0x00000000 +dsound.dll=0x00000000 +dsound.vxd=0x00000000 +dsound3d.dll=0x00000000 +dsprop.dll=0x00000000 +dsquery.dll=0x00000000 +dssbase.dll=0x00000000 +dssec.dll=0x00000000 +dssenh.dll=0x00000000 +dsuiext.dll=0x00000000 +dsuiwiz.dll=0x00000000 +dswave.dll=0x00000000 +dt_ctrl.dll=0x00000000 +dte.olb=0x00000000 +dunzip32.dll=0x00000000 +dunzipnt.dll=0x00000000 +duser.dll=0x00000000 +dx_ver.dll=0x00000000 +dx3j.dll=0x00000000 +dx7vb.dll=0x00000000 +dx8vb.dll=0x00000000 +dxapi.sys=0x00000000 +dxmasf.dll=0x00000000 +dxmrtp.dll=0x00000000 +dxtmsft.dll=0x00000000 +dxtmsft3.dll=0x00000000 +dxtrans.dll=0x00000000 +dynapage.vxd=0x00000000 +dzip32.dll=0x00000000 +e4808xa2.dll=0x00000000 +ebios.vxd=0x00000000 +edit.com=0x00000000 +efsadu.dll=0x00000000 +eisa.vxd=0x00000000 +el90x.sys=0x00000000 +el90xbc3.sys=0x00000000 +el90xbc4.sys=0x00000000 +el90xbc5.sys=0x00000000 +elnk3.vxd=0x00000000 +els.dll=0x00000000 +emsabp32.dll=0x00000000 +emsmdb32.dll=0x00000000 +emsui32.dll=0x00000000 +emsuix32.dll=0x00000000 +enable.vxd=0x00000000 +enable2.vxd=0x00000000 +enable3.dll=0x00000000 +enable4.vxd=0x00000000 +enhsig.dll=0x00000000 +enumfile.dll=0x00000000 +eqnclass.dll=0x00000000 +ersvc.dll=0x00000000 +es.dll=0x00000000 +es1488.vxd=0x00000000 +es1688.vxd=0x00000000 +es1788.vxd=0x00000000 +es488.vxd=0x00000000 +es688.vxd=0x00000000 +esent.dll=0x00000000 +esent97.dll=0x00000000 +esentprf.dll=0x00000000 +esenu.dll=0x00000000 +esshared.dll=0x00000000 +estier2.dll=0x00000000 +etexch32.dll=0x00000000 +eventcls.dll=0x00000000 +eventlog.dll=0x00000000 +eventlogmessages.dll=0x00000000 +excel.exe=0x00000000 +excel8.olb=0x00000000 +excel9.olb=0x00000000 +expsrv.dll=0x00000000 +exstrace.dll=0x00000000 +exts.dll=0x00000000 +faultrep.dll=0x00000000 +faxadmin.dll=0x00000000 +faxcodec.dll=0x00000000 +faxcom.dll=0x00000000 +faxdrv.dll=0x00000000 +faxevent.dll=0x00000000 +faxext32.dll=0x00000000 +faxmapi.dll=0x00000000 +faxocm.dll=0x00000000 +faxperf.dll=0x00000000 +faxroute.dll=0x00000000 +faxshell.dll=0x00000000 +faxt30.dll=0x00000000 +faxtiff.dll=0x00000000 +faxui.dll=0x00000000 +faxxp32.dll=0x00000000 +fcachdll.dll=0x00000000 +fde.dll=0x00000000 +fdeploy.dll=0x00000000 +fechrcnv.dll=0x00000000 +feclient.dll=0x00000000 +filemgmt.dll=0x00000000 +filesec.vxd=0x00000000 +findmvi.dll=0x00000000 +findstub.dll=0x00000000 +finstall.dll=0x00000000 +fldrclnr.dll=0x00000000 +flist32.dll=0x00000000 +fm20.dll=0x00000000 +fm20arb.dll=0x00000000 +fm20bsq.dll=0x00000000 +fm20cat.dll=0x00000000 +fm20chs.dll=0x00000000 +fm20cht.dll=0x00000000 +fm20czc.dll=0x00000000 +fm20dan.dll=0x00000000 +fm20deu.dll=0x00000000 +fm20dut.dll=0x00000000 +fm20enu.dll=0x00000000 +fm20fin.dll=0x00000000 +fm20frc.dll=0x00000000 +fm20fre.dll=0x00000000 +fm20grk.dll=0x00000000 +fm20hbr.dll=0x00000000 +fm20hun.dll=0x00000000 +fm20ind.dll=0x00000000 +fm20ita.dll=0x00000000 +fm20jpn.dll=0x00000000 +fm20kor.dll=0x00000000 +fm20nor.dll=0x00000000 +fm20pol.dll=0x00000000 +fm20ptb.dll=0x00000000 +fm20pts.dll=0x00000000 +fm20rus.dll=0x00000000 +fm20slk.dll=0x00000000 +fm20sln.dll=0x00000000 +fm20spa.dll=0x00000000 +fm20swe.dll=0x00000000 +fm20thi.dll=0x00000000 +fm20tur.dll=0x00000000 +fm20vit.dll=0x00000000 +fmifs.dll=0x00000000 +fontext.dll=0x00000000 +fontsub.dll=0x00000000 +format.com=0x00000000 +fp4amsft.dll=0x00000000 +fp4anscp.dll=0x00000000 +fp4anwi.dll=0x00000000 +fp4apws.dll=0x00000000 +fp4areg.dll=0x00000000 +fp4atxt.dll=0x00000000 +fp4autl.dll=0x00000000 +fp4avnb.dll=0x00000000 +fp4avss.dll=0x00000000 +fp4awebs.dll=0x00000000 +fp4awec.dll=0x00000000 +fp4awel.dll=0x00000000 +fpadmdll.dll=0x00000000 +fpencode.dll=0x00000000 +fpexedll.dll=0x00000000 +fpmmc.dll=0x00000000 +fpmmcsat.dll=0x00000000 +fpnwclnt.dll=0x00000000 +fpwpp.dll=0x00000000 +framebuf.dll=0x00000000 +framebuf.drv=0x00000000 +fsusd.dll=0x00000000 +fte.dll=0x00000000 +ftmapi.dll=0x00000000 +ftpctrs2.dll=0x00000000 +ftpsapi2.dll=0x00000000 +ftpwpp.dll=0x00000000 +ftsrch.dll=0x00000000 +fusion.dll=0x00000000 +fxpass.sys=0x00000000 +gapi32.dll=0x00000000 +gapia32.dll=0x00000000 +gcdef.dll=0x00000000 +gchand.dll=0x00000000 +gdi32.dll=0x00000000 +gdiplus.dll=0x00000000 +getuname.dll=0x00000000 +giffilt.dll=0x00000000 +glmf32.dll=0x00000000 +glu32.dll=0x00000000 +gpedit.dll=0x00000000 +gpkcsp.dll=0x00000000 +gpkrsrc.dll=0x00000000 +gptext.dll=0x00000000 +graftabl.com=0x00000000 +graph.olb=0x00000000 +graph8.olb=0x00000000 +graph9.olb=0x00000000 +graphedt.exe=0x00000000 +graphics.com=0x00000000 +grouppol.dll=0x00000000 +h323msp.dll=0x00000000 +hal.dll=0x00000000 +hdwwiz.cpl=0x00000000 +hhsetup.dll=0x00000000 +hid.dll=0x00000000 +hidci.dll=0x00000000 +himem.sys=0x00000000 +hlink.dll=0x00000000 +hlinkprx.dll=0x00000000 +hlp95en.dll=0x00000000 +hndlr32.dll=0x00000000 +hnetcfg.dll=0x00000000 +hnetmon.dll=0x00000000 +hnetwiz.dll=0x00000000 +homebase.dll=0x00000000 +host30e.ocx=0x00000000 +hotplug.dll=0x00000000 +hpalerts.dll=0x00000000 +hparrkui.dll=0x00000000 +hpcola.dll=0x00000000 +hpcolor.dll=0x00000000 +hpdmipx.dll=0x00000000 +hpjd.dll=0x00000000 +hpjdcom.dll=0x00000000 +hpjdmon.dll=0x00000000 +hpjdnp.dll=0x00000000 +hpjdpp.dll=0x00000000 +hpjdui.dll=0x00000000 +hpjdund.dll=0x00000000 +hpmon.dll=0x00000000 +hpnetsrv.dll=0x00000000 +hpnw416.dll=0x00000000 +hpnw432.dll=0x00000000 +hpnwpsrv.dll=0x00000000 +hpnwshim.dll=0x00000000 +hppjl.dll=0x00000000 +hppjlext.dll=0x00000000 +hpprarrk.dll=0x00000000 +hpprntr.dll=0x00000000 +hpprrush.dll=0x00000000 +hpprui.dll=0x00000000 +hprushui.dll=0x00000000 +hpscan32.dll=0x00000000 +hpsnmp.dll=0x00000000 +hptabs.dll=0x00000000 +hptrbit.dll=0x00000000 +hpvbit.dll=0x00000000 +hpviol.dll=0x00000000 +hpvmon.dll=0x00000000 +hpvres.dll=0x00000000 +hpvui.dll=0x00000000 +hpwiz.dll=0x00000000 +hticons.dll=0x00000000 +htmledit.dll=0x00000000 +htui.dll=0x00000000 +hwagent.dll=0x00000000 +hypertrm.dll=0x00000000 +i128.dll=0x00000000 +i128.vxd=0x00000000 +ias.dll=0x00000000 +iasacct.dll=0x00000000 +iasads.dll=0x00000000 +iashlpr.dll=0x00000000 +iasmmc.dll=0x00000000 +iasnap.dll=0x00000000 +iasperf.dll=0x00000000 +iaspipe.dll=0x00000000 +iaspolcy.dll=0x00000000 +iasrad.dll=0x00000000 +iasrecst.dll=0x00000000 +iassam.dll=0x00000000 +iassdo.dll=0x00000000 +iassvcs.dll=0x00000000 +iasuserr.dll=0x00000000 +icaapi.dll=0x00000000 +iccvid.dll=0x00000000 +icfg95.dll=0x00000000 +icfgnt5.dll=0x00000000 +ichrcnv.dll=0x00000000 +icm32.dll=0x00000000 +icmfilter.dll=0x00000000 +icmp.dll=0x00000000 +icmui.dll=0x00000000 +icmupg.dll=0x00000000 +iconlib.dll=0x00000000 +icsapi32.dll=0x00000000 +icsconfg.dll=0x00000000 +icsrmt.dll=0x00000000 +icwdial.dll=0x00000000 +icwphbk.dll=0x00000000 +idq.dll=0x00000000 +ie4tour.dll=0x00000000 +ieakeng.dll=0x00000000 +ieaksie.dll=0x00000000 +ieakui.dll=0x00000000 +iedkcs32.dll=0x00000000 +ieexec.exe=0x00000000 +ieexecremote.dll=0x00000000 +iehost.dll=0x00000000 +ienpstub.dll=0x00000000 +iepeers.dll=0x00000000 +iernonce.dll=0x00000000 +iesetup.dll=0x00000000 +ifmon.dll=0x00000000 +ifsmgr.vxd=0x00000000 +ifsutil.dll=0x00000000 +igmpagnt.dll=0x00000000 +igmpv2.dll=0x00000000 +iiehost.dll=0x00000000 +iisext.dll=0x00000000 +iismap.dll=0x00000000 +iisrstap.dll=0x00000000 +iisrtl.dll=0x00000000 +iissuba.dll=0x00000000 +ilasm.exe=0x00000000 +ils.dll=0x00000000 +imagehlp.dll=0x00000000 +imaging.dll=0x00000000 +imejp98k.dll=0x00000000 +imeshare.dll=0x00000000 +imgcmn.dll=0x00000000 +imgshl.dll=0x00000000 +imgutil.dll=0x00000000 +imidi.ocx=0x00000000 +imix30.ocx=0x00000000 +imm32.dll=0x00000000 +imnimp.dll=0x00000000 +imxgrd32.ocx=0x00000000 +indicdll.dll=0x00000000 +inet16.dll=0x00000000 +inetab32.dll=0x00000000 +inetcfg.dll=0x00000000 +inetcomm.dll=0x00000000 +inetcpl.cpl=0x00000000 +inetcplc.dll=0x00000000 +inetmib1.dll=0x00000000 +inetpp.dll=0x00000000 +inetppui.dll=0x00000000 +inetres.dll=0x00000000 +inetsloc.dll=0x00000000 +infoadmn.dll=0x00000000 +infoctrs.dll=0x00000000 +infosoft.dll=0x00000000 +infrared.dll=0x00000000 +initpki.dll=0x00000000 +inloader.dll=0x00000000 +input.dll=0x00000000 +inseng.dll=0x00000000 +installutil.exe=0x00000000 +installutillib.dll=0x00000000 +instcat.sql=0x00000000 +instl50.dll=0x00000000 +instl51.dll=0x00000000 +instrsa.dll=0x00000000 +int13.vxd=0x00000000 +intl.cpl=0x00000000 +iologmsg.dll=0x00000000 +ios.vxd=0x00000000 +iosclass.dll=0x00000000 +ipbootp.dll=0x00000000 +ipcfgdll.dll=0x00000000 +iphlpapi.dll=0x00000000 +ipmontr.dll=0x00000000 +ipnathlp.dll=0x00000000 +ippromon.dll=0x00000000 +iprip2.dll=0x00000000 +iprop.dll=0x00000000 +iprtprio.dll=0x00000000 +iprtrmgr.dll=0x00000000 +ipsecsnp.dll=0x00000000 +ipsecsvc.dll=0x00000000 +ipsmsnap.dll=0x00000000 +ipsnap.dll=0x00000000 +ipv6mon.dll=0x00000000 +ipxcfg.dll=0x00000000 +ipxmontr.dll=0x00000000 +ipxpromn.dll=0x00000000 +ipxrip.dll=0x00000000 +ipxrtmgr.dll=0x00000000 +ipxsap.dll=0x00000000 +ipxsnap.dll=0x00000000 +ipxwan.dll=0x00000000 +ir_ndi.dll=0x00000000 +ir32_32.dll=0x00000000 +ir41_qc.dll=0x00000000 +ir41_qcx.dll=0x00000000 +ir50_32.dll=0x00000000 +ir50_qc.dll=0x00000000 +ir50_qcx.dll=0x00000000 +irclass.dll=0x00000000 +irmon.dll=0x00000000 +irprops.cpl=0x00000000 +is5446.dll=0x00000000 +is7548.dll=0x00000000 +is9320.dll=0x00000000 +isapnp.vxd=0x00000000 +iscyber.dll=0x00000000 +isdnui.dll=0x00000000 +isign32.dll=0x00000000 +isjamcb.dll=0x00000000 +ismip.dll=0x00000000 +ismsink.dll=0x00000000 +ismsmtp.dll=0x00000000 +isna.dll=0x00000000 +isna13.dll=0x00000000 +isnewcb.dll=0x00000000 +isrdbg32.dll=0x00000000 +iss3_765.dll=0x00000000 +iss3_tv.dll=0x00000000 +issetup.dll=0x00000000 +istri.dll=0x00000000 +isymwrapper.dll=0x00000000 +itircl.dll=0x00000000 +itss.dll=0x00000000 +iuctl.dll=0x00000000 +iuengine.dll=0x00000000 +iv32qt32.qtc=0x00000000 +ivvideo.dll=0x00000000 +ixsso.dll=0x00000000 +iyuv_32.dll=0x00000000 +javacypt.dll=0x00000000 +javaee.dll=0x00000000 +javaprxy.dll=0x00000000 +javart.dll=0x00000000 +javasntx.dll=0x00000000 +javavrfy.dll=0x00000000 +jcb.dll=0x00000000 +jet.dll=0x00000000 +jet500.dll=0x00000000 +jetcomp.exe=0x00000000 +jetdef35.hlp=0x00000000 +jeterr35.cnt=0x00000000 +jeterr35.hlp=0x00000000 +jetsql35.aw=0x00000000 +jetsql35.cnt=0x00000000 +jetsql35.hlp=0x00000000 +jetsql35.tlb=0x00000000 +jgaw400.dll=0x00000000 +jgdw400.dll=0x00000000 +jgdwmie.dll=0x00000000 +jgmd400.dll=0x00000000 +jgpl400.dll=0x00000000 +jgsd400.dll=0x00000000 +jgsh400.dll=0x00000000 +jit.dll=0x00000000 +jobexec.dll=0x00000000 +joy.cpl=0x00000000 +jpeg1x32.dll=0x00000000 +jpeg2x32.dll=0x00000000 +jpeg32.qtc=0x00000000 +jpegfilt.dll=0x00000000 +jsc.exe=0x00000000 +jscript.dll=0x00000000 +jsproxy.dll=0x00000000 +kb16.com=0x00000000 +kbdal.dll=0x00000000 +kbdaze.dll=0x00000000 +kbdazel.dll=0x00000000 +kbdbe.dll=0x00000000 +kbdbene.dll=0x00000000 +kbdblr.dll=0x00000000 +kbdbr.dll=0x00000000 +kbdbu.dll=0x00000000 +kbdca.dll=0x00000000 +kbdcan.dll=0x00000000 +kbdcr.dll=0x00000000 +kbdcz.dll=0x00000000 +kbdcz1.dll=0x00000000 +kbdcz2.dll=0x00000000 +kbdda.dll=0x00000000 +kbddll.dll=0x00000000 +kbddv.dll=0x00000000 +kbdes.dll=0x00000000 +kbdest.dll=0x00000000 +kbdfc.dll=0x00000000 +kbdfi.dll=0x00000000 +kbdfo.dll=0x00000000 +kbdfr.dll=0x00000000 +kbdgae.dll=0x00000000 +kbdgkl.dll=0x00000000 +kbdgr.dll=0x00000000 +kbdgr1.dll=0x00000000 +kbdhe.dll=0x00000000 +kbdhe220.dll=0x00000000 +kbdhe319.dll=0x00000000 +kbdhela2.dll=0x00000000 +kbdhela3.dll=0x00000000 +kbdhept.dll=0x00000000 +kbdhu.dll=0x00000000 +kbdhu1.dll=0x00000000 +kbdic.dll=0x00000000 +kbdir.dll=0x00000000 +kbdit.dll=0x00000000 +kbdit142.dll=0x00000000 +kbdkaz.dll=0x00000000 +kbdkyr.dll=0x00000000 +kbdla.dll=0x00000000 +kbdlt.dll=0x00000000 +kbdlt1.dll=0x00000000 +kbdlv.dll=0x00000000 +kbdlv1.dll=0x00000000 +kbdmac.dll=0x00000000 +kbdmon.dll=0x00000000 +kbdne.dll=0x00000000 +kbdnec.dll=0x00000000 +kbdno.dll=0x00000000 +kbdpl.dll=0x00000000 +kbdpl1.dll=0x00000000 +kbdpo.dll=0x00000000 +kbdro.dll=0x00000000 +kbdru.dll=0x00000000 +kbdru1.dll=0x00000000 +kbdsf.dll=0x00000000 +kbdsg.dll=0x00000000 +kbdsl.dll=0x00000000 +kbdsl1.dll=0x00000000 +kbdsp.dll=0x00000000 +kbdsw.dll=0x00000000 +kbdtat.dll=0x00000000 +kbdtuf.dll=0x00000000 +kbdtuq.dll=0x00000000 +kbduk.dll=0x00000000 +kbdur.dll=0x00000000 +kbdus.dll=0x00000000 +kbdusl.dll=0x00000000 +kbdusr.dll=0x00000000 +kbdusx.dll=0x00000000 +kbduzb.dll=0x00000000 +kbdycc.dll=0x00000000 +kbdycl.dll=0x00000000 +kd1394.dll=0x00000000 +kdcom.dll=0x00000000 +kdcsvc.dll=0x00000000 +kerberos.dll=0x00000000 +kernel32.dll=0x00000000 +key01.sys=0x00000000 +keyb.com=0x00000000 +keyboard.drv=0x00000000 +keyboard.sys=0x00000000 +keylimit.dll=0x00000000 +keymgr.dll=0x00000000 +kommctrl.dll=0x00000000 +ksuser.dll=0x00000000 +langwrbk.dll=0x00000000 +lanman.drv=0x00000000 +laprxy.dll=0x00000000 +lhv0808.dll=0x00000000 +lhv1208.dll=0x00000000 +lhv1608.dll=0x00000000 +liccpa.cpl=0x00000000 +licdll.dll=0x00000000 +licmgr10.dll=0x00000000 +licwmi.dll=0x00000000 +line30e.ocx=0x00000000 +linkinfo.dll=0x00000000 +llsrpc.dll=0x00000000 +lmhsvc.dll=0x00000000 +lmrt.dll=0x00000000 +lmrtrend.dll=0x00000000 +loadfix.com=0x00000000 +loadperf.dll=0x00000000 +localmon.dll=0x00000000 +localsec.dll=0x00000000 +localspl.dll=0x00000000 +localui.dll=0x00000000 +logdrive.dll=0x00000000 +logger.vxd=0x00000000 +loghours.dll=0x00000000 +lpk.dll=0x00000000 +lprhelp.dll=0x00000000 +lprmonui.dll=0x00000000 +lpt.vxd=0x00000000 +lptenum.vxd=0x00000000 +lsasrv.dll=0x00000000 +lyrasp.dll=0x00000000 +lz32.dll=0x00000000 +lzexpand.dll=0x00000000 +m64_sony.dll=0x00000000 +macxdd16.dll=0x00000000 +macxdd32.dll=0x00000000 +macxw4.drv=0x00000000 +mag_hook.dll=0x00000000 +mailnews.dll=0x00000000 +main.cpl=0x00000000 +maincp16.dll=0x00000000 +mapi.dll=0x00000000 +mapi32.dll=0x00000000 +mapi32x.dll=0x00000000 +mapiform.vbx=0x00000000 +mapifvbx.tlb=0x00000000 +mapisp32.exe=0x00000000 +mapisrv.exe=0x00000000 +mapisrvr.exe=0x00000000 +mapistub.dll=0x00000000 +mapiu.dll=0x00000000 +mapiu32.dll=0x00000000 +mapix.dll=0x00000000 +mapix32.dll=0x00000000 +mapixx.dll=0x00000000 +maskf30e.ocx=0x00000000 +mbslgn32.dll=0x00000000 +mcastmib.dll=0x00000000 +mcd32.dll=0x00000000 +mcdsrv32.dll=0x00000000 +mchgrcoi.dll=0x00000000 +mci32.qtc=0x00000000 +mciavi.drv=0x00000000 +mciavi32.dll=0x00000000 +mcicda.dll=0x00000000 +mcicda.drv=0x00000000 +mciole.dll=0x00000000 +mciole16.dll=0x00000000 +mciole32.dll=0x00000000 +mcipionr.drv=0x00000000 +mciqtenu.q32=0x00000000 +mciqtz.drv=0x00000000 +mciqtz32.dll=0x00000000 +mciseq.dll=0x00000000 +mciseq.drv=0x00000000 +mcivisca.drv=0x00000000 +mciwave.dll=0x00000000 +mciwave.drv=0x00000000 +mcm.dll=0x00000000 +mdacmigr.dll=0x00000000 +mdgncdet.dll=0x00000000 +mdhcp.dll=0x00000000 +mdisp.tlb=0x00000000 +mdisp32.tlb=0x00000000 +mdminst.dll=0x00000000 +mdwmdmsp.dll=0x00000000 +membg.dll=0x00000000 +mf3216.dll=0x00000000 +mfc250.dll=0x00000000 +mfc30.dll=0x00000000 +mfc40.dll=0x00000000 +mfc40chs.dll=0x00000000 +mfc40deu.dll=0x00000000 +mfc40enu.dll=0x00000000 +mfc40esp.dll=0x00000000 +mfc40fra.dll=0x00000000 +mfc40ita.dll=0x00000000 +mfc40jpn.dll=0x00000000 +mfc40kor.dll=0x00000000 +mfc40u.dll=0x00000000 +mfc42.dll=0x00000000 +mfc42chs.dll=0x00000000 +mfc42cht.dll=0x00000000 +mfc42d.dll=0x00000000 +mfc42deu.dll=0x00000000 +mfc42enu.dll=0x00000000 +mfc42esp.dll=0x00000000 +mfc42fra.dll=0x00000000 +mfc42ita.dll=0x00000000 +mfc42jpn.dll=0x00000000 +mfc42kor.dll=0x00000000 +mfc42loc.dll=0x00000000 +mfc42u.dll=0x00000000 +mfc61.dll=0x00000000 +mfc61u.dll=0x00000000 +mfcans32.dll=0x00000000 +mfcapwz.dll=0x00000000 +mfcclwz.dll=0x00000000 +mfcd30.dll=0x00000000 +mfcd42d.dll=0x00000000 +mfcn30.dll=0x00000000 +mfcn42.dll=0x00000000 +mfcn42d.dll=0x00000000 +mfco30.dll=0x00000000 +mfco40.dll=0x00000000 +mfco42.dll=0x00000000 +mfco42d.dll=0x00000000 +mfcoleui.dll=0x00000000 +mfcsubs.dll=0x00000000 +mfcuia32.dll=0x00000000 +mfcuiw32.dll=0x00000000 +mga.dll=0x00000000 +mgamil.dll=0x00000000 +mgamil.vxd=0x00000000 +mgapdx63.dll=0x00000000 +mgmtapi.dll=0x00000000 +microsoft.jscript.dll=0x00000000 +microsoft.jscript.tlb=0x00000000 +microsoft.visualbasic.dll=0x00000000 +microsoft.visualbasic.vsa.dll=0x00000000 +microsoft.visualc.dll=0x00000000 +microsoft.vsa.dll=0x00000000 +microsoft.vsa.tlb=0x00000000 +microsoft.vsa.vb.codedomprocessor.dll=0x00000000 +microsoft.vsa.vb.codedomprocessor.tlb=0x00000000 +microsoft_vsavb.dll=0x00000000 +midimap.dll=0x00000000 +midimap.drv=0x00000000 +miglibnt.dll=0x00000000 +mimefilt.dll=0x00000000 +mindex.dll=0x00000000 +minet32.dll=0x00000000 +minikbd.dll=0x00000000 +mlang.dll=0x00000000 +mlcfg.cpl=0x00000000 +mlcfg32.cpl=0x00000000 +mlctrl.dll=0x00000000 +mll_hp.dll=0x00000000 +mll_mtf.dll=0x00000000 +mll_qic.dll=0x00000000 +mlshext.dll=0x00000000 +mmbtn30e.ocx=0x00000000 +mmcbase.dll=0x00000000 +mmci.dll=0x00000000 +mmcndmgr.dll=0x00000000 +mmcshext.dll=0x00000000 +mmdet.dll=0x00000000 +mmdevldr.vxd=0x00000000 +mmdrv.dll=0x00000000 +mmfmig32.dll=0x00000000 +mmfutil.dll=0x00000000 +mmmixer.dll=0x00000000 +mmsound.drv=0x00000000 +mmsprite.ocx=0x00000000 +mmsys.cpl=0x00000000 +mmsystem.dll=0x00000000 +mmutilse.dll=0x00000000 +mmvdib12.dll=0x00000000 +mnmdd.dll=0x00000000 +mobsync.dll=0x00000000 +mode.com=0x00000000 +modem.cpl=0x00000000 +modemui.dll=0x00000000 +modex.dll=0x00000000 +more.com=0x00000000 +moricons.dll=0x00000000 +mosabp32.dll=0x00000000 +mosaf.dll=0x00000000 +moscc.dll=0x00000000 +moscfg32.dll=0x00000000 +moscl.dll=0x00000000 +moscomp.dll=0x00000000 +moscudll.dll=0x00000000 +mosfind.dll=0x00000000 +mosmisc.dll=0x00000000 +mosmutil.dll=0x00000000 +mosrxp32.dll=0x00000000 +mosshell.dll=0x00000000 +mosstub.dll=0x00000000 +mouse.drv=0x00000000 +mpccl.dll=0x00000000 +mpg4dmod.dll=0x00000000 +mpr.dll=0x00000000 +mprapi.dll=0x00000000 +mprddm.dll=0x00000000 +mprdim.dll=0x00000000 +mprmsg.dll=0x00000000 +mprserv.dll=0x00000000 +mprsnap.dll=0x00000000 +mprui.dll=0x00000000 +mqad.dll=0x00000000 +mqcertui.dll=0x00000000 +mqdscli.dll=0x00000000 +mqgentr.dll=0x00000000 +mqise.dll=0x00000000 +mqlogmgr.dll=0x00000000 +mqoa.dll=0x00000000 +mqoa.tlb=0x00000000 +mqoa10.tlb=0x00000000 +mqoa20.tlb=0x00000000 +mqperf.dll=0x00000000 +mqqm.dll=0x00000000 +mqrt.dll=0x00000000 +mqrtdep.dll=0x00000000 +mqsec.dll=0x00000000 +mqsnap.dll=0x00000000 +mqtrig.dll=0x00000000 +mqupgrd.dll=0x00000000 +mqutil.dll=0x00000000 +mrci2.vxd=0x00000000 +msaahtml.dll=0x00000000 +msaatext.dll=0x00000000 +msab32.dll=0x00000000 +msacc.olb=0x00000000 +msacc8.olb=0x00000000 +msacc9.olb=0x00000000 +msacm.dll=0x00000000 +msacm.drv=0x00000000 +msacm32.dll=0x00000000 +msacm32.drv=0x00000000 +msadce.dll=0x00000000 +msadcer.dll=0x00000000 +msadcf.dll=0x00000000 +msadcfr.dll=0x00000000 +msadco.dll=0x00000000 +msadcor.dll=0x00000000 +msadcs.dll=0x00000000 +msadds.dll=0x00000000 +msaddsr.dll=0x00000000 +msader10.dll=0x00000000 +msader15.dll=0x00000000 +msado10.dll=0x00000000 +msado15.dll=0x00000000 +msado20.tlb=0x00000000 +msado21.tlb=0x00000000 +msado25.tlb=0x00000000 +msado26.tlb=0x00000000 +msadomd.dll=0x00000000 +msador15.dll=0x00000000 +msadox.dll=0x00000000 +msadrh15.dll=0x00000000 +msafd.dll=0x00000000 +msaorn95.dll=0x00000000 +msapsspc.dll=0x00000000 +msasn1.dll=0x00000000 +msaudite.dll=0x00000000 +msawt.dll=0x00000000 +msbdr8.olb=0x00000000 +msbdr9.olb=0x00000000 +msblst.vxd=0x00000000 +mscal.cnt=0x00000000 +mscal.dep=0x00000000 +mscal.hlp=0x00000000 +mscal.ocx=0x00000000 +mscat32.dll=0x00000000 +msclus.dll=0x00000000 +mscms.dll=0x00000000 +msconf.dll=0x00000000 +msconv97.dll=0x00000000 +mscorcfg.dll=0x00000000 +mscordbc.dll=0x00000000 +mscordbi.dll=0x00000000 +mscoree.dll=0x00000000 +mscoree.tlb=0x00000000 +mscorie.dll=0x00000000 +mscorjit.dll=0x00000000 +mscorld.dll=0x00000000 +mscorlib.dll=0x00000000 +mscorlib.tlb=0x00000000 +mscorpe.dll=0x00000000 +mscorrc.dll=0x00000000 +mscorsec.dll=0x00000000 +mscorsn.dll=0x00000000 +mscorsvr.dll=0x00000000 +mscortim.dll=0x00000000 +mscorwks.dll=0x00000000 +mscpx32r.dll=0x00000000 +mscpxl32.dll=0x00000000 +msctf.dll=0x00000000 +msctfp.dll=0x00000000 +msctl.dll=0x00000000 +msdadc.dll=0x00000000 +msdaenum.dll=0x00000000 +msdaer.dll=0x00000000 +msdaerr.dll=0x00000000 +msdaipp.dll=0x00000000 +msdaora.dll=0x00000000 +msdaorar.dll=0x00000000 +msdaosp.dll=0x00000000 +msdapml.dll=0x00000000 +msdaprsr.dll=0x00000000 +msdaprst.dll=0x00000000 +msdaps.dll=0x00000000 +msdarem.dll=0x00000000 +msdaremr.dll=0x00000000 +msdart.dll=0x00000000 +msdart32.dll=0x00000000 +msdasc.dll=0x00000000 +msdasql.dll=0x00000000 +msdasqlr.dll=0x00000000 +msdatl.dll=0x00000000 +msdatl2.dll=0x00000000 +msdatl3.dll=0x00000000 +msdatsrc.tlb=0x00000000 +msdatt.dll=0x00000000 +msdaurl.dll=0x00000000 +msdbg.dll=0x00000000 +msdbi.dll=0x00000000 +msdfmap.dll=0x00000000 +msdmo.dll=0x00000000 +msdtclog.dll=0x00000000 +msdtcprx.dll=0x00000000 +msdtctm.dll=0x00000000 +msdtcui.dll=0x00000000 +msdtcuiu.dll=0x00000000 +msdvdopt.dll=0x00000000 +msdxmlc.dll=0x00000000 +msecl35.dll=0x00000000 +msencode.dll=0x00000000 +msexch35.dll=0x00000000 +msexch40.dll=0x00000000 +msexcl35.dll=0x00000000 +msexcl40.dll=0x00000000 +msfaxmon.dll=0x00000000 +msfs32.dll=0x00000000 +msgina.dll=0x00000000 +msgsvc.dll=0x00000000 +msgsys.dll=0x00000000 +msh261.drv=0x00000000 +msh263.drv=0x00000000 +mshtml.dll=0x00000000 +mshtml.tlb=0x00000000 +mshtmled.dll=0x00000000 +mshtmler.dll=0x00000000 +mshtmlwb.dll=0x00000000 +msi.dll=0x00000000 +msident.dll=0x00000000 +msidle.dll=0x00000000 +msidlpm.dll=0x00000000 +msidntld.dll=0x00000000 +msidpe.dll=0x00000000 +msieftp.dll=0x00000000 +msihnd.dll=0x00000000 +msimg32.dll=0x00000000 +msimsg.dll=0x00000000 +msimtf.dll=0x00000000 +msinfo32.dll=0x00000000 +msiprt.dll=0x00000000 +msisam11.dll=0x00000000 +msisip.dll=0x00000000 +msjava.dll=0x00000000 +msjdbc10.dll=0x00000000 +msjet35.dll=0x00000000 +msjet40.dll=0x00000000 +msjetoledb40.dll=0x00000000 +msjetsql.tlb=0x00000000 +msjint32.dll=0x00000000 +msjint35.dll=0x00000000 +msjint40.dll=0x00000000 +msjro.dll=0x00000000 +msjstick.drv=0x00000000 +msjt3032.dll=0x00000000 +msjt4jlt.dll=0x00000000 +msjter32.dll=0x00000000 +msjter35.dll=0x00000000 +msjter40.dll=0x00000000 +msjtes40.dll=0x00000000 +mslbui.dll=0x00000000 +mslocusr.dll=0x00000000 +msls2.dll=0x00000000 +msls31.dll=0x00000000 +msltus35.dll=0x00000000 +msltus40.dll=0x00000000 +msmfcnt.dll=0x00000000 +msmixmgr.dll=0x00000000 +msmouse.vxd=0x00000000 +msmusctl.dll=0x00000000 +msmusctp.dll=0x00000000 +msnam30e.ocx=0x00000000 +msncdet.dll=0x00000000 +msndui.dll=0x00000000 +msnet32.dll=0x00000000 +msnetobj.dll=0x00000000 +msnp32.dll=0x00000000 +msnprog.dll=0x00000000 +msnsspc.dll=0x00000000 +mso.dll=0x00000000 +mso5enu.dll=0x00000000 +mso7enu.dll=0x00000000 +mso7ftp.exe=0x00000000 +mso7ftpa.exe=0x00000000 +mso7ftps.exe=0x00000000 +mso9.dll=0x00000000 +mso95.dll=0x00000000 +mso97.dll=0x00000000 +mso97fx.dll=0x00000000 +msobjs.dll=0x00000000 +msoeacct.dll=0x00000000 +msoemapi.dll=0x00000000 +msoert.dll=0x00000000 +msoert2.dll=0x00000000 +msonsext.dll=0x00000000 +msopl.drv=0x00000000 +msorc32r.dll=0x00000000 +msorcl10.cnt=0x00000000 +msorcl10.dll=0x00000000 +msorcl10.hlp=0x00000000 +msorcl32.dll=0x00000000 +msoss.dll=0x00000000 +msothunk.dll=0x00000000 +msoutl.olb=0x00000000 +msoutl8.olb=0x00000000 +msoutl85.olb=0x00000000 +msoutl9.olb=0x00000000 +msows409.dll=0x00000000 +mspatcha.dll=0x00000000 +mspbde40.dll=0x00000000 +mspcic.dll=0x00000000 +mspcx32.dll=0x00000000 +mspdb50.dll=0x00000000 +mspdox35.dll=0x00000000 +mspmsp.dll=0x00000000 +mspmspsv.dll=0x00000000 +msports.dll=0x00000000 +mspp32.dll=0x00000000 +msppt.olb=0x00000000 +msppt8.olb=0x00000000 +msppt9.olb=0x00000000 +msprint.dll=0x00000000 +msprint2.dll=0x00000000 +msprivs.dll=0x00000000 +mspst32.dll=0x00000000 +mspwl32.dll=0x00000000 +msr2c.dll=0x00000000 +msr2cenu.dll=0x00000000 +msratelc.dll=0x00000000 +msrating.dll=0x00000000 +msrclr40.dll=0x00000000 +msrd2x32.dll=0x00000000 +msrd2x35.dll=0x00000000 +msrd2x40.dll=0x00000000 +msrd3x40.dll=0x00000000 +msrecr40.dll=0x00000000 +msrepl35.dll=0x00000000 +msrepl40.dll=0x00000000 +msrle32.dll=0x00000000 +msrpfs35.dll=0x00000000 +mssblst.drv=0x00000000 +mssblst.vxd=0x00000000 +msscmc32.dll=0x00000000 +msscp.dll=0x00000000 +msscript=0x00000000 +msshrui.dll=0x00000000 +mssign32.dll=0x00000000 +mssip32.dll=0x00000000 +mssndsys.vxd=0x00000000 +mssoap1.dll=0x00000000 +mssoapr.dll=0x00000000 +mssp.vxd=0x00000000 +mssp32.dll=0x00000000 +msstkprp.dll=0x00000000 +msswch.dll=0x00000000 +mstask.dll=0x00000000 +mstcp.dll=0x00000000 +mstext35.dll=0x00000000 +mstext40.dll=0x00000000 +mstime.dll=0x00000000 +mstlsapi.dll=0x00000000 +mstool32.dll=0x00000000 +mstrust.dll=0x00000000 +mstscax.dll=0x00000000 +msttssyn.dll=0x00000000 +mstvca.dll=0x00000000 +mstvgs.dll=0x00000000 +mstx3032.dll=0x00000000 +msuni11.dll=0x00000000 +msutb.dll=0x00000000 +msv1_0.dll=0x00000000 +msv2cjav.dll=0x00000000 +msvbvm50.dll=0x00000000 +msvbvm60.dll=0x00000000 +msvcirt.dll=0x00000000 +msvcp50.dll=0x00000000 +msvcp60.dll=0x00000000 +msvcp70.dll=0x00000000 +msvcprj.dll=0x00000000 +msvcr70.dll=0x00000000 +msvcrt.dll=0x00000000 +msvcrt10.dll=0x00000000 +msvcrt20.dll=0x00000000 +msvcrt40.dll=0x00000000 +msvcshl.dll=0x00000000 +msvcsrc.dll=0x00000000 +msvfw32.dll=0x00000000 +msvidc32.dll=0x00000000 +msvidctl.dll=0x00000000 +msvideo.dll=0x00000000 +msviewut.dll=0x00000000 +msw3prt.dll=0x00000000 +mswdat10.dll=0x00000000 +mswebdvd.dll=0x00000000 +mswebndi.dll=0x00000000 +mswltres.dll=0x00000000 +mswmdm.dll=0x00000000 +mswng300.dll=0x00000000 +msword.olb=0x00000000 +msword8.olb=0x00000000 +msword9.olb=0x00000000 +mswsock.dll=0x00000000 +mswsosp.dll=0x00000000 +mswstr10.dll=0x00000000 +msxactps.dll=0x00000000 +msxbde40.dll=0x00000000 +msxbse35.dll=0x00000000 +msxl3032.dll=0x00000000 +msxml.dll=0x00000000 +msxml2.dll=0x00000000 +msxml2r.dll=0x00000000 +msxml3.dll=0x00000000 +msxml3r.dll=0x00000000 +msxmlr.dll=0x00000000 +msyuv.dll=0x00000000 +mtxclu.dll=0x00000000 +mtxdm.dll=0x00000000 +mtxex.dll=0x00000000 +mtxlegih.dll=0x00000000 +mtxoci.dll=0x00000000 +mvcl14n.dll=0x00000000 +mvpas.vxd=0x00000000 +mvpr14n.dll=0x00000000 +mvttl14c.dll=0x00000000 +mvut14n.dll=0x00000000 +mwci.dll=0x00000000 +mycomput.dll=0x00000000 +mydocs.dll=0x00000000 +nabtsip.sys=0x00000000 +nac.dll=0x00000000 +napmmc.dll=0x00000000 +narrhook.dll=0x00000000 +navg32.qtc=0x00000000 +ncobjapi.dll=0x00000000 +nconn16.dll=0x00000000 +nconn32.dll=0x00000000 +ncpa.cpl=0x00000000 +ncxpnt.dll=0x00000000 +nddeapi.dll=0x00000000 +nddenb.dll=0x00000000 +nddenb32.dll=0x00000000 +ndis.vxd=0x00000000 +ndis2sup.vxd=0x00000000 +ndishlp.sys=0x00000000 +ndiswmi.sys=0x00000000 +ndswan16.dll=0x00000000 +ndswan32.dll=0x00000000 +necatapi.vxd=0x00000000 +necgmmut.exe=0x00000000 +netapi.dll=0x00000000 +netapi32.dll=0x00000000 +netbios.dll=0x00000000 +netcfg.dll=0x00000000 +netcfgx.dll=0x00000000 +netcpl.cpl=0x00000000 +netdet.dll=0x00000000 +netdi.dll=0x00000000 +netdi90x.dll=0x00000000 +netdtect.dll=0x00000000 +netevent.dll=0x00000000 +netflx.dll=0x00000000 +netfxcfg.dll=0x00000000 +netfxcfgprov.dll=0x00000000 +netfxperf.dll=0x00000000 +neth.dll=0x00000000 +netid.dll=0x00000000 +netlogon.dll=0x00000000 +netman.dll=0x00000000 +netmgmt.vxd=0x00000000 +netmsg.dll=0x00000000 +netos.dll=0x00000000 +netplwiz.dll=0x00000000 +netpptp.sys=0x00000000 +netrap.dll=0x00000000 +netsetup.dll=0x00000000 +netshell.dll=0x00000000 +netui0.dll=0x00000000 +netui1.dll=0x00000000 +netui2.dll=0x00000000 +netware.drv=0x00000000 +newdev.dll=0x00000000 +nlhtml.dll=0x00000000 +nmevtmsg.dll=0x00000000 +nmmkcert.dll=0x00000000 +npptools.dll=0x00000000 +npra32.dll=0x00000000 +nscompat.tlb=0x00000000 +nt1003.sys=0x00000000 +ntctl3d.dll=0x00000000 +ntdll.dll=0x00000000 +ntdos.sys=0x00000000 +ntdos404.sys=0x00000000 +ntdos411.sys=0x00000000 +ntdos412.sys=0x00000000 +ntdos804.sys=0x00000000 +ntdsa.dll=0x00000000 +ntdsapi.dll=0x00000000 +ntdsatq.dll=0x00000000 +ntdsbcli.dll=0x00000000 +ntdsbmsg.dll=0x00000000 +ntdsbsrv.dll=0x00000000 +ntdsetup.dll=0x00000000 +ntdskcc.dll=0x00000000 +ntdsmsg.dll=0x00000000 +ntdsperf.dll=0x00000000 +ntdsxds.dll=0x00000000 +ntfrsapi.dll=0x00000000 +ntfrsprf.dll=0x00000000 +ntio.sys=0x00000000 +ntio404.sys=0x00000000 +ntio411.sys=0x00000000 +ntio412.sys=0x00000000 +ntio804.sys=0x00000000 +ntlanman.dll=0x00000000 +ntlanui.dll=0x00000000 +ntlanui2.dll=0x00000000 +ntlmssps.dll=0x00000000 +ntlsapi.dll=0x00000000 +ntmarta.dll=0x00000000 +ntmsapi.dll=0x00000000 +ntmsdba.dll=0x00000000 +ntmsevt.dll=0x00000000 +ntmsmgr.dll=0x00000000 +ntmssvc.dll=0x00000000 +ntprint.dll=0x00000000 +nts.dll=0x00000000 +ntsdexts.dll=0x00000000 +ntshrui.dll=0x00000000 +ntvdmd.dll=0x00000000 +ntwdblib.dll=0x00000000 +nusrmgr.cpl=0x00000000 +nw16.dll=0x00000000 +nwab32.dll=0x00000000 +nwapi16.dll=0x00000000 +nwapi32.dll=0x00000000 +nwapilyr.dll=0x00000000 +nwc.cpl=0x00000000 +nwcfg.dll=0x00000000 +nwevent.dll=0x00000000 +nwlink.vxd=0x00000000 +nwnds.dll=0x00000000 +nwnet32.dll=0x00000000 +nwnp32.dll=0x00000000 +nwpp32.dll=0x00000000 +nwprovau.dll=0x00000000 +nwserver.vxd=0x00000000 +nwwks.dll=0x00000000 +oak.vxd=0x00000000 +oakley.dll=0x00000000 +objsel.dll=0x00000000 +oc25.dll=0x00000000 +occache.dll=0x00000000 +ochlp30a.dll=0x00000000 +ocimg30a.dll=0x00000000 +ocmanage.dll=0x00000000 +odbc.cnt=0x00000000 +odbc.hlp=0x00000000 +odbc.inf=0x00000000 +odbc16.dll=0x00000000 +odbc16gt.dll=0x00000000 +odbc32.dll=0x00000000 +odbc32gt.dll=0x00000000 +odbcad32.dll=0x00000000 +odbcad32.exe=0x00000000 +odbcbcp.dll=0x00000000 +odbcconf.dll=0x00000000 +odbccp32.cpl=0x00000000 +odbccp32.dll=0x00000000 +odbccr32.dll=0x00000000 +odbccu32.dll=0x00000000 +odbcinst.cnt=0x00000000 +odbcinst.dll=0x00000000 +odbcinst.hlp=0x00000000 +odbcint.dll=0x00000000 +odbcjet.cnt=0x00000000 +odbcjet.hlp=0x00000000 +odbcji32.dll=0x00000000 +odbcjt32.dll=0x00000000 +odbcjtnw.cnt=0x00000000 +odbcjtnw.hlp=0x00000000 +odbckey.inf=0x00000000 +odbcmon.dll=0x00000000 +odbcp32r.dll=0x00000000 +odbcstf.dll=0x00000000 +odbctl32.dll=0x00000000 +odbctrac.dll=0x00000000 +oddbccr32.dll=0x00000000 +oddbse32.dll=0x00000000 +odexl32.dll=0x00000000 +odfox32.dll=0x00000000 +odkob32.dll=0x00000000 +odpdx32.dll=0x00000000 +odtext32.dll=0x00000000 +oemreg.dll=0x00000000 +offfilt.dll=0x00000000 +oiadm400.dll=0x00000000 +oicom400.dll=0x00000000 +oidis400.dll=0x00000000 +oieng400.dll=0x00000000 +oifil400.dll=0x00000000 +oigfs400.dll=0x00000000 +oiprt400.dll=0x00000000 +oislb400.dll=0x00000000 +oissq400.dll=0x00000000 +oitwa400.dll=0x00000000 +oiui400.dll=0x00000000 +ole2.dll=0x00000000 +ole2conv.dll=0x00000000 +ole2disp.dll=0x00000000 +ole2nls.dll=0x00000000 +ole32.dll=0x00000000 +oleacc.dll=0x00000000 +oleaccrc.dll=0x00000000 +oleaut32.dll=0x00000000 +olecli.dll=0x00000000 +olecli32.dll=0x00000000 +olecnv32.dll=0x00000000 +oledb32.dll=0x00000000 +oledb32r.dll=0x00000000 +oledb32x.dll=0x00000000 +oledlg.dll=0x00000000 +oleprn.dll=0x00000000 +olepro32.dll=0x00000000 +olepub32.dll=0x00000000 +olesvr.dll=0x00000000 +olesvr32.dll=0x00000000 +olethk32.dll=0x00000000 +openenu.dll=0x00000000 +opengl32.dll=0x00000000 +opml32.dll=0x00000000 +org10.tlb=0x00000000 +org11svr.exe=0x00000000 +org21.tlb=0x00000000 +org21svr.exe=0x00000000 +orgapi.dll=0x00000000 +orgcsw10.tlb=0x00000000 +ospf.dll=0x00000000 +ospfagnt.dll=0x00000000 +ospfmib.dll=0x00000000 +osuninst.dll=0x00000000 +p2d.dll=0x00000000 +pageswap.vxd=0x00000000 +panmap.dll=0x00000000 +paqsp.dll=0x00000000 +paralink.vxd=0x00000000 +parity.vxd=0x00000000 +passfilt.dll=0x00000000 +password.cpl=0x00000000 +pautoenr.dll=0x00000000 +pcdlib32.dll=0x00000000 +pci.vxd=0x00000000 +pdbrowse.dll=0x00000000 +pdh.dll=0x00000000 +pdm.dll=0x00000000 +pds.dll=0x00000000 +perf.vxd=0x00000000 +perfcounter.dll=0x00000000 +perfctrs.dll=0x00000000 +perfdisk.dll=0x00000000 +perfnet.dll=0x00000000 +perfnw.dll=0x00000000 +perfos.dll=0x00000000 +perfproc.dll=0x00000000 +perfts.dll=0x00000000 +photowiz.dll=0x00000000 +picstore.dll=0x00000000 +pid.dll=0x00000000 +pidgen.dll=0x00000000 +pifmgr.dll=0x00000000 +piparse.dll=0x00000000 +pjlmon.dll=0x00000000 +pkpd.dll=0x00000000 +pkpd32.dll=0x00000000 +plustab.dll=0x00000000 +pmspl.dll=0x00000000 +pncrt.dll=0x00000000 +pnen3240.dll=0x00000000 +pngfilt.dll=0x00000000 +pnpwprop.dll=0x00000000 +pnpwrenu.dll=0x00000000 +pnui3240.dll=0x00000000 +pointer.dll=0x00000000 +polagent.dll=0x00000000 +polstore.dll=0x00000000 +ports.cpl=0x00000000 +postwpp.dll=0x00000000 +power.drv=0x00000000 +powercfg.cpl=0x00000000 +powercfg.dll=0x00000000 +powerold.dll=0x00000000 +powrprof.dll=0x00000000 +pppatm.sys=0x00000000 +pppmac.vxd=0x00000000 +pppndi.dll=0x00000000 +prflbmsg.dll=0x00000000 +printui.dll=0x00000000 +prodinv.dll=0x00000000 +profext.dll=0x00000000 +profmap.dll=0x00000000 +psapi.dll=0x00000000 +psbase.dll=0x00000000 +pschdprf.dll=0x00000000 +psmon.dll=0x00000000 +psnppagn.dll=0x00000000 +pss.dll=0x00000000 +pstorec.dll=0x00000000 +pstorerc.dll=0x00000000 +pstorsvc.dll=0x00000000 +psxdll.dll=0x00000000 +pubdlg.dll=0x00000000 +pubole32.dll=0x00000000 +pwdssp.dll=0x00000000 +qasf.dll=0x00000000 +qcap.dll=0x00000000 +qcut.dll=0x00000000 +qdv.dll=0x00000000 +qdvd.dll=0x00000000 +qedit.dll=0x00000000 +qedwipes.dll=0x00000000 +qemmfix.vxd=0x00000000 +qfeupd.exe=0x00000000 +qic117.vxd=0x00000000 +qmgr.dll=0x00000000 +qmgrprxy.dll=0x00000000 +qosname.dll=0x00000000 +qtim32.dll=0x00000000 +qtole32.dll=0x00000000 +qtw32.cpl=0x00000000 +qtwcp.hlp=0x00000000 +quartz.dll=0x00000000 +quartz.vxd=0x00000000 +query.dll=0x00000000 +qv.dll=0x00000000 +ra32.dll=0x00000000 +ra3214_4.dll=0x00000000 +ra3228_8.dll=0x00000000 +ra32clv1.dll=0x00000000 +ra32dnet.dll=0x00000000 +ra32rv10.dll=0x00000000 +ra32sipr.dll=0x00000000 +racmgr32.exe=0x00000000 +racpldlg.dll=0x00000000 +radmin32.dll=0x00000000 +ragent.dll=0x00000000 +ragui32.dll=0x00000000 +raocx32.dll=0x00000000 +rapilib.dll=0x00000000 +rarv1032.dll=0x00000000 +rasadhlp.dll=0x00000000 +rasadmin.dll=0x00000000 +rasapi16.dll=0x00000000 +rasapi32.dll=0x00000000 +rasauth.dll=0x00000000 +rasauto.dll=0x00000000 +rascauth.dll=0x00000000 +rascbcp.dll=0x00000000 +rasccp.dll=0x00000000 +rascfg.dll=0x00000000 +raschap.dll=0x00000000 +rasctrs.dll=0x00000000 +rasdlg.dll=0x00000000 +rasdlg4.dll=0x00000000 +rasfil32.dll=0x00000000 +rasgprxy.dll=0x00000000 +rasgtwy.dll=0x00000000 +rasipcp.dll=0x00000000 +rasiphlp.dll=0x00000000 +rasipxcp.dll=0x00000000 +rasman.dll=0x00000000 +rasmans.dll=0x00000000 +rasmontr.dll=0x00000000 +rasmsg.dll=0x00000000 +rasmxs.dll=0x00000000 +rasnbfcp.dll=0x00000000 +rasnbipc.dll=0x00000000 +raspap.dll=0x00000000 +rasppp.dll=0x00000000 +raspppen.dll=0x00000000 +rasrad.dll=0x00000000 +rassapi.dll=0x00000000 +rassauth.dll=0x00000000 +rasscrpt.dll=0x00000000 +rasser.dll=0x00000000 +rassfm.dll=0x00000000 +rasshell.dll=0x00000000 +rasspap.dll=0x00000000 +rastapi.dll=0x00000000 +rastls.dll=0x00000000 +rasuser.dll=0x00000000 +raw32.qtc=0x00000000 +rcamsp.dll=0x00000000 +rcbdyctl.dll=0x00000000 +rdchost.dll=0x00000000 +rdocurs.dll=0x00000000 +rdpcfgex.dll=0x00000000 +rdpdd.dll=0x00000000 +rdpsnd.dll=0x00000000 +rdpwsx.dll=0x00000000 +reboot.vxd=0x00000000 +recncl.dll=0x00000000 +refedit.dll=0x00000000 +regapi.dll=0x00000000 +regasm.exe=0x00000000 +regcode.dll=0x00000000 +regsvc.dll=0x00000000 +regsvcs.exe=0x00000000 +regsvr32.dll=0x00000000 +regwizc.dll=0x00000000 +relay.dll=0x00000000 +remotepg.dll=0x00000000 +rend.dll=0x00000000 +rend32.dll=0x00000000 +reputil.dll=0x00000000 +restorrc.dll=0x00000000 +resutils.dll=0x00000000 +riched.dll=0x00000000 +riched20.dll=0x00000000 +riched32.dll=0x00000000 +richedt20.dll=0x00000000 +rigpsnap.dll=0x00000000 +ripagnt.dll=0x00000000 +rle32.qtc=0x00000000 +rlocal32.dll=0x00000000 +rnanp.dll=0x00000000 +rnaph.dll=0x00000000 +rnaserv.dll=0x00000000 +rnasetup.dll=0x00000000 +rnasmm.dll=0x00000000 +rnathunk.dll=0x00000000 +rnaui.dll=0x00000000 +rndr30e.ocx=0x00000000 +rndsrv32.dll=0x00000000 +rnr20.dll=0x00000000 +routeext.dll=0x00000000 +routetab.dll=0x00000000 +rpcltc1.dll=0x00000000 +rpcltc3.dll=0x00000000 +rpcltc5.dll=0x00000000 +rpcltc6.dll=0x00000000 +rpcltc8.dll=0x00000000 +rpcltccm.dll=0x00000000 +rpclts1.dll=0x00000000 +rpclts3.dll=0x00000000 +rpclts5.dll=0x00000000 +rpclts6.dll=0x00000000 +rpclts8.dll=0x00000000 +rpcltscm.dll=0x00000000 +rpcltspx.dll=0x00000000 +rpcmqcl.dll=0x00000000 +rpcmqsvr.dll=0x00000000 +rpcns4.dll=0x00000000 +rpcproxy.dll=0x00000000 +rpcrt4.dll=0x00000000 +rpcss.dll=0x00000000 +rplimage.dll=0x00000000 +rpza32.qtc=0x00000000 +rrasprxy.dll=0x00000000 +rrcm.dll=0x00000000 +rsabase.dll=0x00000000 +rsaenh.dll=0x00000000 +rsasig.dll=0x00000000 +rsfsaps.dll=0x00000000 +rshx32.dll=0x00000000 +rsmps.dll=0x00000000 +rsrc16.dll=0x00000000 +rsrc32.dll=0x00000000 +rsvpmsg.dll=0x00000000 +rsvpperf.dll=0x00000000 +rsvpsp.dll=0x00000000 +rtcdll.dll=0x00000000 +rtipxmib.dll=0x00000000 +rtm.dll=0x00000000 +rtrfiltr.dll=0x00000000 +rtrupg.dll=0x00000000 +rtutils.dll=0x00000000 +rwnh.dll=0x00000000 +s3.dll=0x00000000 +s3.vxd=0x00000000 +s3_cp3cq.dll=0x00000000 +s32evnt1.dll=0x00000000 +s32lucp1.cpl=0x00000000 +s3mm.dll=0x00000000 +s3mm.vxd=0x00000000 +s3v.dll=0x00000000 +s3v.vxd=0x00000000 +saclient.dll=0x00000000 +safrcdlg.dll=0x00000000 +safrdm.dll=0x00000000 +safrslv.dll=0x00000000 +sage.dll=0x00000000 +samlib.dll=0x00000000 +samsrv.dll=0x00000000 +sapi.cpl=0x00000000 +sapi.dll=0x00000000 +sapnsp.dll=0x00000000 +sb16.vxd=0x00000000 +sbawe.vxd=0x00000000 +scanpst.hlp=0x00000000 +scarddlg.dll=0x00000000 +scardssp.dll=0x00000000 +sccbase.dll=0x00000000 +sccsccp.dll=0x00000000 +sccview.dll=0x00000000 +scecli.dll=0x00000000 +scesrv.dll=0x00000000 +schannel.dll=0x00000000 +schedsvc.dll=0x00000000 +schmmgmt.dll=0x00000000 +sclgntfy.dll=0x00000000 +scredir.dll=0x00000000 +scripto.dll=0x00000000 +scriptpw.dll=0x00000000 +scrobj.dll=0x00000000 +scrrun.dll=0x00000000 +scsi1hlp.vxd=0x00000000 +sd32.dll=0x00000000 +sdpblb.dll=0x00000000 +sec_sspi.dll=0x00000000 +seclogon.dll=0x00000000 +secsspi.dll=0x00000000 +secur32.dll=0x00000000 +securcl.dll=0x00000000 +security.dll=0x00000000 +sefilshr.dll=0x00000000 +sendcmsg.dll=0x00000000 +sendmail.dll=0x00000000 +sens.dll=0x00000000 +sensapi.dll=0x00000000 +senscfg.dll=0x00000000 +serenum.vxd=0x00000000 +serial.vxd=0x00000000 +serialui.dll=0x00000000 +servdeps.dll=0x00000000 +serwave.vxd=0x00000000 +serwvdrv.dll=0x00000000 +serwvdrv.drv=0x00000000 +setup4.dll=0x00000000 +setupapi.dll=0x00000000 +setupdll.dll=0x00000000 +setupwbv.dll=0x00000000 +setupx.dll=0x00000000 +setupx32.dll=0x00000000 +sfc.dll=0x00000000 +sfc_os.dll=0x00000000 +sfcdll.dll=0x00000000 +sfcfiles.dll=0x00000000 +sfmapi.dll=0x00000000 +sfmatcfg.dll=0x00000000 +sfmatmsg.dll=0x00000000 +sfmctrs.dll=0x00000000 +sfmmon.dll=0x00000000 +sfmmsg.dll=0x00000000 +sfmpsdib.dll=0x00000000 +sfmpsfnt.dll=0x00000000 +sfmutil.dll=0x00000000 +sfmwshat.dll=0x00000000 +sfpdll.dll=0x00000000 +shcompui.dll=0x00000000 +shd401lc.dll=0x00000000 +shdoc401.dll=0x00000000 +shdoclc.dll=0x00000000 +shdocvw.dll=0x00000000 +shell.dll=0x00000000 +shell.vxd=0x00000000 +shell32.dll=0x00000000 +shellstyle.dll=0x00000000 +shfolder.dll=0x00000000 +shfusion.dll=0x00000000 +shfusres.dll=0x00000000 +shgina.dll=0x00000000 +shim.dll=0x00000000 +shimeng.dll=0x00000000 +shimgvw.dll=0x00000000 +shlwapi.dll=0x00000000 +shmedia.dll=0x00000000 +shscrap.dll=0x00000000 +shsvcs.dll=0x00000000 +shtml.dll=0x00000000 +sigtab.dll=0x00000000 +simpdata.tlb=0x00000000 +sisbkup.dll=0x00000000 +skdll.dll=0x00000000 +slayerxp.dll=0x00000000 +slbcsp.dll=0x00000000 +slbiop.dll=0x00000000 +slbkygen.dll=0x00000000 +slbrccsp.dll=0x00000000 +slbrsrc.dll=0x00000000 +slenh.dll=0x00000000 +smartvsd.vxd=0x00000000 +smc32.qtc=0x00000000 +smgr.dll=0x00000000 +smlogcfg.dll=0x00000000 +smmscrpt.dll=0x00000000 +smmsetup.dll=0x00000000 +smtpapi.dll=0x00000000 +smtpctrs.dll=0x00000000 +snmpapi.dll=0x00000000 +snmpsnap.dll=0x00000000 +snprfdll.dll=0x00000000 +softpub.dll=0x00000000 +sort.exe=0x00000000 +sound.drv=0x00000000 +spap.vxd=0x00000000 +spcmdcon.sys=0x00000000 +spcommon.dll=0x00000000 +spcplui.dll=0x00000000 +splitter.vxd=0x00000000 +spmsg.dll=0x00000000 +spnike.dll=0x00000000 +spooler.vxd=0x00000000 +spoolss.dll=0x00000000 +sprio600.dll=0x00000000 +sprio800.dll=0x00000000 +spttseng.dll=0x00000000 +spxcoins.dll=0x00000000 +sqloledb.dll=0x00000000 +sqlsrv32.dll=0x00000000 +sqlstr.dll=0x00000000 +sqlunirl.dll=0x00000000 +sqlwid.dll=0x00000000 +sqlwoa.dll=0x00000000 +sqlxmlx.dll=0x00000000 +srclient.dll=0x00000000 +srrstr.dll=0x00000000 +srsvc.dll=0x00000000 +srvmgr.cpl=0x00000000 +srvsvc.dll=0x00000000 +srvwiz.dll=0x00000000 +ssdpapi.dll=0x00000000 +ssdpsrv.dll=0x00000000 +stage30e.ocx=0x00000000 +staxmem.dll=0x00000000 +stclient.dll=0x00000000 +stdole.tlb=0x00000000 +stdole2.tlb=0x00000000 +stdole32.tlb=0x00000000 +stem0409.dll=0x00000000 +sti.dll=0x00000000 +sti_ci.dll=0x00000000 +sti_ci32.dll=0x00000000 +sticpl.cpl=0x00000000 +stobject.dll=0x00000000 +storage.dll=0x00000000 +storprop.dll=0x00000000 +streamci.dll=0x00000000 +strmdll.dll=0x00000000 +suexpand.dll=0x00000000 +supervga.drv=0x00000000 +suwin.exe=0x00000000 +svcpack.dll=0x00000000 +svcprop.dll=0x00000000 +svrapi.dll=0x00000000 +swprv.dll=0x00000000 +sxciext.dll=0x00000000 +sxs.dll=0x00000000 +symevnt1.dll=0x00000000 +synceng.dll=0x00000000 +syncui.dll=0x00000000 +sysclass.dll=0x00000000 +sysdetmg.dll=0x00000000 +sysdm.cpl=0x00000000 +sysinv.dll=0x00000000 +syssetup.dll=0x00000000 +system.configuration.install.dll=0x00000000 +system.data.dll=0x00000000 +system.design.dll=0x00000000 +system.directoryservices.dll=0x00000000 +system.dll=0x00000000 +system.drawing.design.dll=0x00000000 +system.drawing.dll=0x00000000 +system.drawing.tlb=0x00000000 +system.drv=0x00000000 +system.enterpriseservices.dll=0x00000000 +system.enterpriseservices.thunk.dll=0x00000000 +system.enterpriseservices.tlb=0x00000000 +system.management.dll=0x00000000 +system.messaging.dll=0x00000000 +system.runtime.remoting.dll=0x00000000 +system.runtime.serialization.formatters.soap.dll=0x00000000 +system.security.dll=0x00000000 +system.serviceprocess.dll=0x00000000 +system.tlb=0x00000000 +system.web.dll=0x00000000 +system.web.regularexpressions.dll=0x00000000 +system.web.services.dll=0x00000000 +system.windows.forms.dll=0x00000000 +system.windows.forms.tlb=0x00000000 +system.xml.dll=0x00000000 +systhunk.dll=0x00000000 +t1instal.dll=0x00000000 +t2embed.dll=0x00000000 +tamaudio.drv=0x00000000 +tapi.dll=0x00000000 +tapi3.dll=0x00000000 +tapi32.dll=0x00000000 +tapiaddr.dll=0x00000000 +tapiperf.dll=0x00000000 +tapisnap.dll=0x00000000 +tapisrv.dll=0x00000000 +tapiui.dll=0x00000000 +tcpcfg.dll=0x00000000 +tcpmib.dll=0x00000000 +tcpmon.dll=0x00000000 +tcpmonui.dll=0x00000000 +tcptsat.dll=0x00000000 +telephon.cpl=0x00000000 +termmgr.dll=0x00000000 +termsrv.dll=0x00000000 +themeui.dll=0x00000000 +threed16.ocx=0x00000000 +thumbvw.dll=0x00000000 +tifflt.dll=0x00000000 +timedate.cpl=0x00000000 +timer.drv=0x00000000 +tlntsvrp.dll=0x00000000 +tmapi.dll=0x00000000 +toolhelp.dll=0x00000000 +torisan3.vxd=0x00000000 +tourani.dll=0x00000000 +tourstr.dll=0x00000000 +tourutil.dll=0x00000000 +tr2032.dll=0x00000000 +traffic.dll=0x00000000 +trans30e.ocx=0x00000000 +tree.com=0x00000000 +treeedcl.dll=0x00000000 +treenvcl.dll=0x00000000 +triedit.dll=0x00000000 +trksvr.dll=0x00000000 +trkwks.dll=0x00000000 +tsappcmp.dll=0x00000000 +tsbyuv.dll=0x00000000 +tscc.dll=0x00000000 +tscfgwmi.dll=0x00000000 +tsd32.dll=0x00000000 +tsddd.dll=0x00000000 +tsec.dll=0x00000000 +tseng.dll=0x00000000 +tseng.vxd=0x00000000 +tsp3216s.dll=0x00000000 +tsuserex.dll=0x00000000 +twain.dll=0x00000000 +twain_32.dll=0x00000000 +txfaux.dll=0x00000000 +txflog.dll=0x00000000 +typelib.dll=0x00000000 +ucman.dll=0x00000000 +udhisapi.dll=0x00000000 +ufat.dll=0x00000000 +ulclient.dll=0x00000000 +ulib.dll=0x00000000 +umandlg.dll=0x00000000 +umdm16.dll=0x00000000 +umdm32.dll=0x00000000 +umdmxfrm.dll=0x00000000 +umpnpmgr.dll=0x00000000 +unidrv.dll=0x00000000 +unimdmat.dll=0x00000000 +unimodem.vxd=0x00000000 +uniplat.dll=0x00000000 +untfs.dll=0x00000000 +upnp.dll=0x00000000 +upnphost.dll=0x00000000 +upnpui.dll=0x00000000 +ups.cpl=0x00000000 +ureg.dll=0x00000000 +url.dll=0x00000000 +urlmon.dll=0x00000000 +urlwv30.ocx=0x00000000 +usbmon.dll=0x00000000 +usbui.dll=0x00000000 +user32.dll=0x00000000 +userenv.dll=0x00000000 +usp10.dll=0x00000000 +usrcntra.dll=0x00000000 +usrcoina.dll=0x00000000 +usrdpa.dll=0x00000000 +usrdtea.dll=0x00000000 +usrfaxa.dll=0x00000000 +usrlbva.dll=0x00000000 +usrrtosa.dll=0x00000000 +usrsdpia.dll=0x00000000 +usrsvpia.dll=0x00000000 +usrv42a.dll=0x00000000 +usrv80a.dll=0x00000000 +usrvoica.dll=0x00000000 +usrvpa.dll=0x00000000 +utildll.dll=0x00000000 +uxtheme.dll=0x00000000 +v86mmgr.vxd=0x00000000 +vaccxx.vxd=0x00000000 +vaccxxab.vxd=0x00000000 +vaen2.dll=0x00000000 +vaen21.olb=0x00000000 +vaen232.dll=0x00000000 +vastmxx.vxd=0x00000000 +vatlsxx.vxd=0x00000000 +vaxgi.vxd=0x00000000 +vb40016.dll=0x00000000 +vb40032.dll=0x00000000 +vb4en16.dll=0x00000000 +vb5db.dll=0x00000000 +vba232.dll=0x00000000 +vbaen32.olb=0x00000000 +vbajet32.dll=0x00000000 +vbar2232.dll=0x00000000 +vbar332.dll=0x00000000 +vbc.exe=0x00000000 +vbc7ui.dll=0x00000000 +vbrun300.dll=0x00000000 +vbscript.dll=0x00000000 +vcache.vxd=0x00000000 +vcd.vxd=0x00000000 +vcdex.dll=0x00000000 +vcdfsd.vxd=0x00000000 +vcomm.vxd=0x00000000 +vcond.vxd=0x00000000 +vdd.vxd=0x00000000 +vdef.vxd=0x00000000 +vdk32116.dll=0x00000000 +vdk3211w.dll=0x00000000 +vdmad.vxd=0x00000000 +vdmdbg.dll=0x00000000 +vdmredir.dll=0x00000000 +vdodec32.dll=0x00000000 +vdowave.drv=0x00000000 +ven2232.olb=0x00000000 +ver.dll=0x00000000 +verifier.dll=0x00000000 +verite.vxd=0x00000000 +version.dll=0x00000000 +verx.dll=0x00000000 +vfat.vxd=0x00000000 +vfbackup.vxd=0x00000000 +vfd.vxd=0x00000000 +vflatd.vxd=0x00000000 +vfp6r.dll=0x00000000 +vfp6renu.dll=0x00000000 +vfpodbc.dll=0x00000000 +vfwwdm.drv=0x00000000 +vfwwdm32.dll=0x00000000 +vga.dll=0x00000000 +vga.drv=0x00000000 +vga256.dll=0x00000000 +vga64k.dll=0x00000000 +vgateway.vxd=0x00000000 +vgx.dll=0x00000000 +vi30aut.dll=0x00000000 +video7.vxd=0x00000000 +vidx16.dll=0x00000000 +vjoy.dll=0x00000000 +vjoyd.vxd=0x00000000 +vkd.vxd=0x00000000 +vlb32.dll=0x00000000 +vmcpd.vxd=0x00000000 +vmd.vxd=0x00000000 +vmhelper.dll=0x00000000 +vmidi118.vxd=0x00000000 +vmm32.vxd=0x00000000 +vmodctl.dll=0x00000000 +vmouse.vxd=0x00000000 +vmpoll.vxd=0x00000000 +vmvid.vxd=0x00000000 +vn73pcmd.vxd=0x00000000 +vncs118d.vxd=0x00000000 +vncspcmd.vxd=0x00000000 +vnecmidi.vxd=0x00000000 +vnecmix2.vxd=0x00000000 +vnecmixd.vxd=0x00000000 +vnecopl.vxd=0x00000000 +vnecpcm.vxd=0x00000000 +vnetbios.vxd=0x00000000 +vnetsup.vxd=0x00000000 +vnopnd.vxd=0x00000000 +volcb118.vxd=0x00000000 +voltrack.vxd=0x00000000 +voncb118.vxd=0x00000000 +vopl118.vxd=0x00000000 +vopl3sa.vxd=0x00000000 +vpasd.vxd=0x00000000 +vpcb118.vxd=0x00000000 +vpd.vxd=0x00000000 +vpicd.vxd=0x00000000 +vredir.vxd=0x00000000 +vsami.dll=0x00000000 +vsansi.dll=0x00000000 +vsasc8.dll=0x00000000 +vsavb7.olb=0x00000000 +vsavb7rt.dll=0x00000000 +vsavb7rtui.dll=0x00000000 +vsbmp.dll=0x00000000 +vsd.vxd=0x00000000 +vsdrw.dll=0x00000000 +vserver.vxd=0x00000000 +vsexe2.dll=0x00000000 +vsflw.dll=0x00000000 +vshare.vxd=0x00000000 +vsmp.dll=0x00000000 +vsmsw.dll=0x00000000 +vspp.dll=0x00000000 +vsqpw2.dll=0x00000000 +vsrevoke.dll=0x00000000 +vsrtf.dll=0x00000000 +vss_ps.dll=0x00000000 +vssapi.dll=0x00000000 +vsw6.dll=0x00000000 +vswk4.dll=0x00000000 +vswks.dll=0x00000000 +vswmf.dll=0x00000000 +vsword.dll=0x00000000 +vswork.dll=0x00000000 +vswp5.dll=0x00000000 +vswp6.dll=0x00000000 +vswpf.dll=0x00000000 +vsxl5.dll=0x00000000 +vtd.vxd=0x00000000 +vtdapi.vxd=0x00000000 +vtrin.vxd=0x00000000 +vwin32.vxd=0x00000000 +vwipxspx.dll=0x00000000 +vxdldr.vxd=0x00000000 +w32.dll=0x00000000 +w32time.dll=0x00000000 +w32topl.dll=0x00000000 +w3ctrs.dll=0x00000000 +w3svapi.dll=0x00000000 +w95fiber.dll=0x00000000 +w95inf16.dll=0x00000000 +w95inf32.dll=0x00000000 +wab32.dll=0x00000000 +wab32res.dll=0x00000000 +wamregps.dll=0x00000000 +wangcmn.dll=0x00000000 +wangshl.dll=0x00000000 +watchdog.sys=0x00000000 +wavemsp.dll=0x00000000 +wavewrap.drv=0x00000000 +wbemdc.dll=0x00000000 +wd.dll=0x00000000 +wd.vxd=0x00000000 +wdigest.dll=0x00000000 +wdmaud.drv=0x00000000 +webcheck.dll=0x00000000 +webclnt.dll=0x00000000 +webhits.dll=0x00000000 +webpost.dll=0x00000000 +webvw.dll=0x00000000 +wfwnet.drv=0x00000000 +wgpoadmn.dll=0x00000000 +wgpocpl.cpl=0x00000000 +whlp16t.dll=0x00000000 +whlp32t.dll=0x00000000 +wiadefui.dll=0x00000000 +wiadrvud.dll=0x00000000 +wiadss.dll=0x00000000 +wiascr.dll=0x00000000 +wiascr.tlb=0x00000000 +wiaservc.dll=0x00000000 +wiashext.dll=0x00000000 +wiastatd.dll=0x00000000 +wiavideo.dll=0x00000000 +wiavusd.dll=0x00000000 +wifeman.dll=0x00000000 +win.com=0x00000000 +win32k.sys=0x00000000 +win32s16.dll=0x00000000 +win32spl.dll=0x00000000 +win87em.dll=0x00000000 +win95bb.dll=0x00000000 +winalign.dll=0x00000000 +winaspi.dll=0x00000000 +winfax.dll=0x00000000 +winhelp.exe=0x00000000 +wininet.dll=0x00000000 +winipsec.dll=0x00000000 +winmm.dll=0x00000000 +winnet16.dll=0x00000000 +winnls.dll=0x00000000 +winntbbu.dll=0x00000000 +winrnr.dll=0x00000000 +winscard.dll=0x00000000 +winsmon.dll=0x00000000 +winsock.dll=0x00000000 +winspl16.drv=0x00000000 +winspool.drv=0x00000000 +winsrpc.dll=0x00000000 +winsrv.dll=0x00000000 +winsspi.dll=0x00000000 +winsta.dll=0x00000000 +winstrm.dll=0x00000000 +wintrust.dll=0x00000000 +wisc10.dll=0x00000000 +wkssvc.dll=0x00000000 +wldap32.dll=0x00000000 +wlnotify.dll=0x00000000 +wltsecur.dll=0x00000000 +wmadmod.dll=0x00000000 +wmadmoe.dll=0x00000000 +wmasf.dll=0x00000000 +wmdmlog.dll=0x00000000 +wmdmps.dll=0x00000000 +wmerrenu.dll=0x00000000 +wmffilt.dll=0x00000000 +wmi.dll=0x00000000 +wmicore.dll=0x00000000 +wmidcad.dll=0x00000000 +wminet_utils.dll=0x00000000 +wmiprop.dll=0x00000000 +wmiscmgr.dll=0x00000000 +wmiutils.dll=0x00000000 +wmnetmgr.dll=0x00000000 +wmpcd.dll=0x00000000 +wmpcore.dll=0x00000000 +wmplenc.dll=0x00000000 +wmploc.dll=0x00000000 +wmpshell.dll=0x00000000 +wmpui.dll=0x00000000 +wmsdmod.dll=0x00000000 +wmsdmoe.dll=0x00000000 +wmsfr32.dll=0x00000000 +wmsmdb32.dll=0x00000000 +wmstream.dll=0x00000000 +wmsui32.dll=0x00000000 +wmv8dmod.dll=0x00000000 +wmvcore.dll=0x00000000 +wmvdmod.dll=0x00000000 +wmvdmoe.dll=0x00000000 +wnaspi32.dll=0x00000000 +wnpp32.dll=0x00000000 +wordpad.exe=0x00000000 +wow32.dll=0x00000000 +wowfax.dll=0x00000000 +wowfaxui.dll=0x00000000 +wps_updt.dll=0x00000000 +wpsapd.dll=0x00000000 +wpsmon.dll=0x00000000 +wpsmon16.dll=0x00000000 +wpsunire.dll=0x00000000 +wpwizdll.dll=0x00000000 +ws2_32.dll=0x00000000 +ws2help.dll=0x00000000 +ws2thk.dll=0x00000000 +wscthunk.dll=0x00000000 +wsecedit.dll=0x00000000 +wshatm.dll=0x00000000 +wshcon.dll=0x00000000 +wshext.dll=0x00000000 +wship6.dll=0x00000000 +wshirda.dll=0x00000000 +wshisn.dll=0x00000000 +wshnetbs.dll=0x00000000 +wshrm.dll=0x00000000 +wshtcp.vxd=0x00000000 +wshtcpip.dll=0x00000000 +wsipx.vxd=0x00000000 +wsnmp32.dll=0x00000000 +wsock.vxd=0x00000000 +wsock32.dll=0x00000000 +wsock32n.dll=0x00000000 +wstdecod.dll=0x00000000 +wstream.dll=0x00000000 +wsvv.vxd=0x00000000 +wtsapi32.dll=0x00000000 +wttss22.dll=0x00000000 +wuaucpl.cpl=0x00000000 +wuaueng.dll=0x00000000 +wuaupd98.dll=0x00000000 +wuauserv.dll=0x00000000 +wupdinfo.dll=0x00000000 +wuv3is.dll=0x00000000 +wzcdlg.dll=0x00000000 +wzcsapi.dll=0x00000000 +wzcsvc.dll=0x00000000 +xactsrv.dll=0x00000000 +xcall32.dll=0x00000000 +xenroll.dll=0x00000000 +xfilexr.dll=0x00000000 +xgiinit.dll=0x00000000 +xiffr3_0.dll=0x00000000 +xl5en32.olb=0x00000000 +xlrec.dll=0x00000000 +xolehlp.dll=0x00000000 +zipfldr.dll=0x00000000 diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/default.pal b/PL2303-Prolific-DriverInstaller-v1.5.0/default.pal new file mode 100644 index 0000000000000000000000000000000000000000..6e07f346332f0a04c466c2a5d56a2c721b96b1e1 GIT binary patch literal 1168 zcmciBJ8l#~5C-4^e2~3Eoq)s=5&_}{E18mzkdctdHz42&l{rA1V`EfD;1JFUhOcKg zHxV;CkN&40-*nHue{*~L{U+kw>$iuy7>?l>j^R)xhGRH}V>pIGvlx!y7>?l>4qfdEsa?)8%VNHo zr+J#Ed78(N(L4>%25TL+PB5Z9Y&Xr*Jk8@anx}c1r+J#k<7l4dX`be39!>TcSrVyT z&ZCctx_nh(!JC*g_QEFkT=nU&;%Byp TFUR}CGj-PEulIK!{-xeuM&DoD literal 0 HcmV?d00001 diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/dotnetinstaller.exe b/PL2303-Prolific-DriverInstaller-v1.5.0/dotnetinstaller.exe new file mode 100644 index 0000000000000000000000000000000000000000..a08afe3cfec9e0fd613556750c60f5a193860015 GIT binary patch literal 10704 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 literal 0 HcmV?d00001 diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/isrt.dll b/PL2303-Prolific-DriverInstaller-v1.5.0/isrt.dll new file mode 100644 index 0000000000000000000000000000000000000000..d3c684f769063e8cbac8e058990e4c2e6bd02895 GIT binary patch literal 222144 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%0AGol2U_m0xAmg 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

loS_|aobRoe&zh2GFAaCR&XN*(zkKwi{a8N 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 DXI?BRFu}V&~%A_ zTto#yK}A6UK|nw#*K#XG5J3?|)Ypv#LFF#6zvs;CEos{K{r>gyBi-GZGiT0u&Y3f3 zW;eS%9-nTCF_}!U_$SLI(>fgKKL`6;`=7I@uGe&ZJ=5yC70uQ~xhtCW9XV>8E&utk zPdz{M8QZX-&ptcWV|#Lh?RoFBwo%X8T)q0(o*6rQ#9c{A33i3`_p9f3dH3)?$?Cr^ z8;(m}fa@Emc@(gzUT5<_HPE*>8?D+7gVIzsR zs!49P$uxX&f~otV*L$jEXHCsbH$)@dNqhiwm z6au_eeWFdAl90rIT93+!c5SEvS>pTArcOk^BHC0&hHylihSa43<-f9M6Jd2WIoi}j zE&E@NpqFZ)yUR0Tf(P|;FDrUp!BG)iZDuo>M&9-O@S&ceCey}xC52l(YWyTVc?({t2SF6xQo z=1@AD$uxxM`aGPQHtcrP4?%q@j!kNy%YN9DLj0zqo=9BP>2iAJ^hJ$nMI8PtL_Hb% zp=xv|?|OdR^TSZZY_&3>=ruA?NlRFUCeSDND z&~1@h+$D&Yq!~ZJc4GhjLST9U>IHGH^!N%oCaq$P56RY!Hxie@xk8{{KGk>R^)uD_ zn^CVaug94S;y`1BSG-6LD?fd(6BNV)>!&OwVEFGQime({h~+)sM!KE{;Wk77sr z)8!6x4E#n~g;F8#`Vfp$+4_czCV{vOAYsj1rIPdpBXHYoLSW7Wv~UHw#7dcuf}$@J z5Z(6F;)C8~LEIv2k!;?0(ks8Jfv_cLb9@mc1ezoWqmG?DD$9cJsbom~Iw>Lqtb5@v z(uFdU$x(FL(^L@Wq@VyA4Tht;#ci^+9!5q{nK#y5cYHDwue1=vb69IJDHBw(wF_W{ zxXXa(dKv?QD5SV7YwAK_SIO&Tq~15*qquHvvO6%Du3h3DLEJC>_&dqKly;ULmaU~2 z{a|#+3r2(>7)WoUCCVyM<_-+BJ95MU89Cx;9Di{Raz5c4ICxO-1<-KA!AkwPm%V!n zi6%8*UiKHl1(Yg98S}CkaK82V=mDH(gL9zUEO?o87x;fr~oqiCN6nNc%l7%S1 zH4N-c?gJeOjf&5RvN!F7BC<@_7r6#x5^RELgLLyBjZm2Abo-=!FLD#-EPVe_edQpppO_M_Av`$1s|>A z7<+~wdh8B9Zbxp8gzLLE5w58$A|%bg1p_pV`@_$Pbe;5)T3px=I71l1xtNP7HG?4J z3^2Ch4F6o0WyKi)bPpo04QN}GsZ0a<-(>(=>7kDT1UbcqBbxAzK0HRMF=jXu@;k_R z5Z)nMe}L=-8#WOWPvTA=I}vGU@y4BApkS`ZK^I%ZqeY{_$O`Nf=AMj-^Dxlb z$HkSPfm8vvWz37qT;i@56EP%Deoc`ns*293zc0yer2=#Y*T>YCA*AnVgeMW5lw3$F{*oF=@c4>zG1OEj+S((FHXrtNpYFyfhAF%`0_5X zxH4T}h0&f^U-#H(ei6$qV)=!cU6_mBq_*tbc410iobw6?zliq4)a?^n@N#_$RBo77 z2qd+{AxA882a>u|fhBuO!OO`UBC>!(?2_06g)Z?1idGq96tRmL?c0DHSE*u`SR8Cp z+96VNpnV97C%J=FART?w9LU*EC_I%0C1rwnuBz0h&KR^>9a1`AB43~d`d8flx&naG9x6szyly%86sQX@{i(jz#lPRCtDhx25PEEF+w)uUU$w zV>Gantw5BW6sspst0(D%N9${zmz-JGEXB$B&^F+*=aRrc-EDVlXapxk!Y5$jhVhaH zW3rL0elpcrK=Ddbj76X!A)qnb{*T&`_cFOrxpM?X;)|vkxq?R59 zbx?6WP`|-A^+nPn!pQ`GZc2~LjrN5A#?zkZ>@39qnaVt0wmQH9?Z4F9Kdeb|!Ha(V zysa~8o}B_88s`M2GErn}3~xMDZ)_z|#eLFmf6KB<+z-w&*OK(Ov>&5l7cm7zQ)Cz% zziB9OibeLhV4v5r%+#sOYbFZ+t0ohA!&#Rz7-@A^+bQJnHUrS6nx6n3RCBl7h3G3= z|F|Ix^WIp?YnYFOJe*x3u|rFTWoNczuU6*dW=rA%L6r5#5lji4wk9vM(2uX=gLV{^<1UfoGTx!s*_z>?p)b48=xk!x)`vV9S%*S;u%d_Tj^!a^Axi1hf!4%1yYyOB zD-eY={9zneqdOuZ0yFhT7tVsk_KmQT!)gW=*xHq2uvpgxFw9M)7s} zZs)o#y?XSQttZbQ_V~LZy>Z$5SEY$(5zpDMar-A^WCzA4X9vc{y2Zt8un6!`nx-fg zVq_z5xHBhZSc)p2H<@}MH0EQDt$2g#vH0!*jz}jCkj5t#(L$C6!{1zT8Vpr?F&H+W zX&3@M#2u;+$0B0L*4vSWg~W}(vj+7SgAMm#fq0Sn=%?fFNR7yR)KeiyT$vEG87RbL zlIUb-CFTYjP+56fO8YHEPf?53J1j*N&nYL^U*IJd)RTqk3GIq8;(uW=XVwl&@ySsv za^0_(hjy=|SduR^pc^!7j`>-(x{y7EXt?wlgN9r8s2b)$DyE@J#2Syy7+q7G7q^&B z$g<})sQr(E4C}cR?O41E-leqbkMsdlr;Sv@LDd5Rt%TezkkssR98~)aQS4`XU$tL* z-jq;njfTO0tIv-H?OcdHvh`UcA0gURj4^2U>uy!M65<8>AumXEB0hHlzD!#`S2p+* z2q;cc6vRwxDe8s---(M9uk^_1Br4xjRsyFthE+>(0xEOFS@uhechVw^EZKTID%#}i z2!8*JMN`E2d{#>n<2fo(c(g17ME4iqk0 z0s~35{uCExjt8*Iu1yJ#5C@j4Tz*!8U-L9K%KP^aE75C$vDap3gR3{d~T--@Z4uOz~t|=nsB5aB*h0$q?H%X>iUf2EtzrG zYb^&+%WyOARHNp8j5pbOHYQApenu&t)p#{vQefs6qdzW^8o><$TzHARNAN)$Mza91eI4xtB*=a1Z4C)`tq&rIw=#74oSfjamqrbMR9nT(( zvrt1i*VTb=sx70L9`xt{wJubxJho7cQt_xc*unmtjUE(Mj(;kR` zp-VDIpZzJzrG4!~^e*>dc1Cv}a4krrAGeX@6e?c>%UU5hgW)AxZ$iutnN%j^86cUa zu}cR#bk$AoY8>ixQF?PxI_mX(Q17NR!ijl;wtAfYWT$2AEcK&W6O902()j=22*pevmChrRfi$7Z{q7)`Fj7ymfYVjgG6jt>a#HR;Q{_ z!R2Un8edhn;Bt&N7WHOlX%TC%GNbtxZyi_3q^PQvoy^|2lEG0`O**9zeN=Q+gHEaJ zET+obaf>(BRWddzyJ#6}=t(M=6dh-oT^7BqB)%%fRq`Mke?mD+^h3Sn-QO6jU3EQH zY*E4JJF*(KhWukY#*J+K6Zc9&fbB8d0PJv$mzj7ez&_4N2(&IB(1C5nh3Tf(w?I9) z3dWAf-`MC6zx~Ptze}gRSf&W>_TL?x`&4AvwPkZ06aS8I@n0Wi5dQ;}V=#xwg9oGuVIv=9f{&!8NAB$ntDcRS5hXVad#yj{UP*cglr zaro!FYGQ|PiMTO1W$O#qRNR#Wq>2tMB5Aa)dc1%HYbwrKd#LSF!; zaPu)ESVOYL7ig$kW9BbPa`CuMF_T!Uv8Q}6!JG^KOzGwDcSnuzhO#m z8DdcS=vS)J6Nw%30(dlB!3S$ZR z{*^ExIvIuNqX}_w7#D&PG}@?S0=fKHEYn2w9o2@;-G*Jk9M;q5@SYA1HmDoisHz)K zdU7z=mV&<@!WYYToDBoFD#9t5+X^rT{wQnM4=8CwZ{eSs;3yIz6i4T}MAQ-`wqt0c^$>=aY(0N5Os#=W7|Xs%Cd4@W9)aM9NWJ*9s!S9JvsMH4Qw_x&S zhs(Qcph4bkUy>{|;+`U2WM=MwWcZ@Jo&*x$KbX6#*rsU;(j(`EBIXv+9=0-fDjAay zYzYoTK3Xejh>~^vl{*jdNqoUL2(Yeeq7?4L>XB|Tyjh2)hk0yz$YSTio5o{B`BEG@ zq^aUSta4IUJxNyQj7K0UqiG2zU<=8${i@+&h#of}ZphZQ*mDYT&shTuxGY_#;?ip{ zn*I2SFf`_*95x0RuQ2pfl0!G4q{Au z9uG<8V<6#no-_z&p*~~4<_rcc^8fQ;*i3lbfXy_GS2}p1pSM?PqKsp892;)~7xryu z0g+9OaWf=XqG3~@U{azSDQW^6Ud(TPz!P(kqfiYYLtJQJFqk-92ux)hrZgu09%fn& z(`~wJN7m3d;u1N5su2yvm_j~QSZ z2{s(^MDRivEtYFAxmg|d1#+^EcoEbl+9xoKs&1mYU=v)VJq@Ml$FYBU)`bB&p_;_8 zy2RJMfW#jTtj(}DGKn+7C0+pc)V8PAfDM=Uaqxn~?LN~aew)?N&9$sbZ#?s`su6T^ zy~ut7HnKNKbl`3VotDhA|BQoWZB!mAPqI^IG@bv7bMDy!G7O^4!A>OIrI!Yu;)>D^ z>akC?UhU`=C71coB;z#DWLz_#Hhpi056ITszr!rFyq`heovT%Sp9U|>T7aGh9~;8L zc4-tn4UkbcmYxQn0W*aAA8n=S!;^%^@LY!hBU|5R=n@~WKui_<@h;0+H(UMJ(N*Y$ zZiAN|uTA=qjNco7g-QR{qXy~Cn)J)SOOt*$dC+jS#-{k82-ui0yv*Pr(%~TjqD|aA ze25dqpRIy`{i+MNp#esrVH9jVM_Qjct4gV?M7nb+1KrO`!@-Grl$qFN4z%ZvYq6;X zq5*mwW*jXYHOe0!qfRJ<=;HThJ++7Uirh`z;$E=GX2T6xNFNa?|z8Y z8G~g301gk9wDhG3BwsmBz!AZc7Z z65p97mZDFn8+s<-YOmT5r|~RXpZ_xq@$bM#i(+S2fCIDMEOf(C8q1~(eyexlLFz{K z+~6#jYEOlLwyL^xQ;|-8vaDsdgXeusn$w&Rt$Wuy8q)`fX^r#ea-b<&zdju%V1`k^ zUK+1|9t{`p7&<2b6SB>#nN+%bXB7Fa9#G|Lubbgt+T~|TF91)-{w)u5WTKx?=Z0I% z1=#B!G+7`%-#nD9mkyGk-1yt|7VMq@QtDv-5xfWW2h!s9G9%g zQf&ZavpQuOj5o}HBefZjo`vNz;K*ujc#sDg((&KV;D(DIsZH2MOxSzFg`MBqAnaPz;=h-Vw(lqGzBNa_1M9(f3mKR#78c^&jMoA5ful5Dkw_f3z9X(Q@gjaO&z zf{rgP(NKAf)rIB-!+2hRr$s3*XokFiPIngB@tmuvxsn**FHc=aV-K-!_jk52o; z;)g>YpPQBOIj}+8zsbC zLAOCRlP23@;uU7Dp2lS4Fl{fexc(wYtEoZe>ZzvyAAy>iD;Y*rGJHCPx$w*xGZ!Au zGu5kSG#8$&G?(qGa!PEZovO2E3c_`UaT4LIG@TX#!d#S;N7)Ky8t6iw(kBdOxjeV zv=3_1{?Ze&Vb^Uj#yNwj1lyu)A<;A&DrAGk-VQV|#|unSyNb zcb6smmzqO=43n*GxNK9q8IWA`k&0wj^pc(RyJhy4YLe}PP?PzbPq2(dn_!A2l-VGZ zVB}h^U>bhFZm8b+)9s8c_R{CuxLQ z63MzI=f9xVf{B|QF7C2y18UpeS5bS4*oC52`b}iiI_i@6&_39vx+DhF=3%hP)}6S2 z6M|YxqZpkuF-{0@U?q>zMk<@0t}- z&;G)Ikgd0bi~5qwfY=Oh;t}v3V)tL8OJE^uOhP=0raZbJ$g9zXP7z%&7qRGq+1(T$ z&!P)fYKG`SbXs&tQ-&FB7Y@`rIKNPlEi}5^seAb$Py{D-t%ifaUZ*h3Wb2JThS|&8 z#Q?%owWDAfcty5XG6dH0!8;D9_Tt4nod}Byoq1YEP_-sGzj>%OIbBT7XOD-;S<%@b z=dTMCK!PRUMXAL(#7@?&A+@lq;pG5xxh}#Iv<>z~vvtWW`EN%$-^y>+^lgH|eRf`W zxE?QTgyXsc%DQGxJTGj5W8s;_ERMfZ2NJZtZYf$GM<=+avrUcc+QWeYq+?aMM@1)| zacoWV`~9^6k%bX1Tc7wL42bPc0}#jFRe_k49UilrmTSX2I25&EL&V@3Ut?s*)_;$M z_4K&0r{}butl$+f04_0wi!ebO&Qw=J09?gqCvuNO)(IwdezWf582qwp3w|G0iHvVA z-H6h&G=Ec=btEQ8YWK~2*z^@wZ91NY*x*Bw>cd1Rq1g2t}@59VE^Ff1(pMVWl zu_y6j6T_wyK5KqrobU=ks3PFKnX-Zv)y(@AMnA=Bs;NQoZ~1gUir>w;4pH2h^%EZI z+Kpd~Otq7-t8OUx`I>rx-!}467!T6yEQ;3=tq)%5eCs!wb3Y;-I)*C?{ z9MQQp&<M{H2xUzVdEs?24N^@Db@UCI3y;}sHO(c z-s3z8v@35b9qJ>(nRU^Vn6Ouci7>maUKlYG8J7xaEm(wLcJKabm`&1qECG42ofF;G zxIg+HMv-jYb|eh5JMTAO=466nJ_!EiP*iYPHYI0^dtjnmKIxExH-U~xy#y9T)fb5K zQY;nX=QnIWn<^6dl7mk1|9O7-FqUdxLfaYE2x8`AFNHqW8aaAap5Ws&oZd^GT3kxn-VYb{1QB7#MkaT zY82@sya#o9;epyZ&10QTKOBbZnU01|>u8;R0$woP${DPdu>9jq5<}Uow$MIniAlM) zRD~IV|0G4*z206%K+(-{qB3l>2Xn!>@XR-C2A_tByYS2p@F+{sWp(bpPd%Yc3pRJ3 zR3~xVT;L^?^RS8hwtK7T9GZcSMSPL1GrkE^`%~pqFu=1@09blarBx&az*{slGQ&bXp4f zDYkhDG8!_Yv>wNyM{agyeamhneWyo_hd~hhw^KD33|Yo##0%Lv`%oAL=Q0c!+@SUo zTn=6k;n9y(rO(cepfp=Stb=W}jP$LmT>hzcUK}waJ)y^+x4<^oxw_z?_FIlog8N^v ze8^%a!zg<%aN=X-pDa4VSi$~;ZogZWsH(J#q>5rcdQw!eADzN}_yG>HUjmLvNz8uu z0hqylM5o#BGz)*+e!-8_9#_p$WK&lV%zhv1A@L0m1hYu)8bjhz3|iTG`0FqXI^1Wl zUw5^i;F*rhe&2qmijan?YEH}ShnT9{@3+gU{djRi`<3Z|?z@=~{55nICU~g*&S2!p z*81VHPq^10`!sOk_Dd&rY?jw{8a}*4Vi|`3kA64mlJp`;E@f7e#4rR#GBMsb5C-92 z_ZY-5Yho+|FARZS7ON1RexoJ`5$ALW>s(YJ5>v2*>gKlq5+cNxq<_HF{x7CPvqAF+S^HfN;kQRg6)Z z7@JZ)kEVpN_bOnBv=gbtVtXsZ_RTc!PGzT#y!Fv6tIYqLvI}|=>$H@nmR3r1^h(_+OL%VW1pnV*j ztvjo%aE~a9*#>MedjO@DA{kR5o9ymaPui;U;AnLo9Ds1cXx@T6>;&lup9gQeyEfB3 zjo~L-XH|p&^G|z&=@K9&_n^=2Wx$NkV%V8!RArp{LCYU2sloyU57pt4OkAo=0eA@p z38p_1$Hz3^ujG%%P0<0G4)(!JbXv3TeT;!CTMz9EQ=q+3fgC0!tPwnY4^!ZrX4$){ zDKJ-4faNZ9spT%Su5bfyv{P}dTFl^!6>`!&uS1J*=(%Pse!^ugAZ)D z8Sda(?ALha{F4_)^v@-H#Xy4BC&AZus3v%55W0iOp0hX10xPie z)^?1`1FGz!iCwjMc+nztsLcmuHC2>(_$ZuPnTP2V^YC{#P#%SqfvI6bHV^-RQ$3F& zI&B^vv7MWb@~EL&kF8bNLgwK@Om)hgiUbe@SEW~j!7z!mKxC1vJ@$lQu<*Lt>|F-g<2Bir61!^lYw@0{%5gD*DvJFuR8{-YDeQ;n!|aFfY--Se*$>mP!G1)i z+3$m`y8V7$sP;G-JsOh$9z~wxs~3Wy8wi5`w5tY#!G6Oq@?>jZR~QDT+8Qv3QTqvg z1YWS;{spQCQfUOGnf(qJ$KQ+psP^N<5$#u!sX5*Zunl&sE_kT@KElYuec$ph+0%@& zcLgUNJF3zm*>BOisw%feQbn;J;8E>Ir?4NKhS?8}Z>nFP*$+q>>_>E({eCOc?Kf2G zaj8F&{f5HDmGM^!f?ztyU1J8a2m;8~ik)E?v}t3oUl+BX;O}=c`(4*uD3w(y(-?b3 z+GBV^%%jEs)ye>zX!q0_{FU_+IbQ`uY zmzSVQil;)_8Od|joyTgba9X&SonDvmv)Uqd%GWr>)a08f+TO^}DzdwAjB>hw-s^{; z4)!9!YP9iY_>yc5ZVyvZxYMBIV6fpz#()>3zgY`RE>>l<@fdF7Ms9RDhLV)?%Je?b zKBiXlTKV#d%=_nL$o*#9+T@OBa<>bYdwMH_+#i7rm%BT7LGI?7Z_=yhv=oc^=0t!b&wXzK^*Llo@>@(7e+OH z|FI=Zi{5t_%rFvcxcek>EqO zCU-KEyJNWAZ{2Q?dj;5Vx%+|_+-L7Qs@$_#l~L}I2DwL)+>idvr;~|x3b_odfVx#tnD&{+Dr-rWJv8Dr^HR7o4C5V15d zkKS%WQ8wBTOs|Cp(@WH53fd@p>5cvqIhdMs>pTYPU^FCK*I&7v+Q-UolK#{Xg&mZ_ zHD+E|9#6AVBa~W-zOAFoJio^&C))07Lab5}4UyUGbXlFI>e2~KQy<%EgZ3JRqHJxt zISks#b_2BY3sq>HsS30f^=6o1zIXv-Mr7ZoDQ74ZmTYAE2I{s!=KCZXZfRk<;%JA! zEnf?pyZri`)Bx-h&=>p~8FW#n{W|nVTQfF>>)*_%KiDYx6R!~c4e@Fk$c*~GOu^tKDh$_u z0oPv-Dh`ACo5R%~rpKr@;HIem<uI1f>c0V1(o0kr5Z64mzWf`KXeXQ(=fH@ybVS)LsnNatyV38Eq6T%{6H0(Yx&d>fnWDwP~4$kt$nD z)`e+#=2nB2b-;!@>?g!4RLd{;GLy9Y@ug5L_n=DJO@)dnmxY`1-*6?%smUBPQIu@) zV`NiS>b;Hxb+CS|N)}=~%GO0|!<0-gD%lKdxRN_;)s#G-50A?)hAR0Rjj&&-5K0>6 zo>+q|<$uHGo)gq)IT|Tyb~+we%}aW}g`f`J3DFAAWUy?dRRW?Od%Fu#8FtbcxePn0 zRP&bsu}X;)t(z zl73Ax-tpQ$3iqekJIc}Njo1s9vO%G~mHhj>Z2vs_j|eIB+)6U?(7g_=sLF!z_seEk zD`10`h{0+!x|FVrM?-p%78R1Lw{p`NANYA*mu)Y|gPz-JgZfvDJ=t34i!i94x!C}9 z5!i6&OeJ140yU^t^W2w1JphCd^{iiox*N%>-kRr7A2k`Et^@H2YF-!->T!BZKHhzXwGvP}?+QIn+NzhT4HHrD!bQgSxmxh59EHgh6dKdi6UHpP=T25up}% z2NXGSX~(v?R%mPAz<24e48T(Jpv^^nzPz zL)x;2kZ$*R7}9ea8<1WOHr%QE5U&uY9?Yj|?$nb(2&cYfii)%s1z|`duK^1sezb%5 zgfuUVi1clGE^r5vqlWnLEq0QnI8a1Jn#B)%>_7=A+^H`{hPsN3wtid~)W*Y z>c9D&6Y>HP9#yL$(gY26f0oH`^K+kpBKT73o)rSBO(5@T7$!y%K~# z`k^8f>4hi=LwcUksRu%QLYfywM0z*h^CqMpW^&Zv)KQ?5(m)XzY39_?VNhR-4D}ph z^;>=z)aGxiK|NoWZ4JnSgB#Zdb>&Ke`mayJpzhz$0QFd~;ZEI{5C{SF zvDZ|n?;&|ZojTU&)PEi3Q1ilwP`}DMAgF&ItMnepspo)B+5w8lP+Rg`HyjH?`g&xf z#}KEN!70S4-~FZ<(&Kc|+#nC0x7LRA2m}tNXEz8<(9J}YAVGdPVpgPpAC zUKr7#0=xr)aSpgCAXlIIvk4v#C?Y#leI&4Z3rt}yH7T-7J%&D|RFd5|`FH1l8?hdu z3wL=8uztTGwo)f5TdCu2;9IGWU_nxNW*}Rf99P#QBh@v@KkAy~Rdr1=m~wDhz&xlf zPOwYD7bkab)N9j_S`8{=OgjX~3(6`ItHN->7KY+e3Q7%KIW45+kZG7>7glNl;2CaS0; zpeiyd5FH+-WSpBTRaAI!L{!%6qiEHrT2Ofsd*adzP*g|7d0|^EKR_7j3-E}L*?fL11guE zA{hyldBiIu?O4L6UY_Aqf)Jn$e@O*x6ACn6;%jjjOn0J}D)=nH3nOCnls>oTGdXI= z@S0-3UFr#n>R8dX2b(2K;p-OpqBd<9_dU|lrxZ=H8)u1@`^dB*>z0nXaEJ1M^~9vw zus($$iSLar4#V18*MRj@u;Eyz5w8%eC-V89V?7Ln!1~ez73+sl5Qa6j3UsXNL41ns zyf7lxS-b<9kz<)0HDJ98+uqX25w&9-t3k`xi1NQ$ff4I?^eN2&uMn)i+*1wfdb)5= zfjpR;SR2*_80UCz-uq!#*Tq(Z_L!m#Y&h22ZwSXa7t@zUcyTzxdg^!;>;Ir23~MZj zbgbWp_=GhtjEJ>`cR*Or1-BYwKv(R(OD}+;Hop#Ey2#feVttGzpF2r*qhI&fT@CA# zAXFa5`ga(xUYr04YusdNgy-lvI5UvIrj&*zmsi7jjV|0YkOwpB)`sGQ`V_5Kr1koh@XrQV>30I^t^ z=d`T<NX9z&!Ar3d~$oMFwW05g7Wm3-=ga91)mZdgOMp9%}&R zEcT_Prl6=9n7TCp^8xFkLi+g$08<)U8!%Teh-9n%oiJd0$c?qh^=+`>z&rq60H$TW z3d|%_MFs{?ppmi^>99=&h8IT!=0QHmP_#;AJ=Ors5$qyMbwE)wFyk~|%lTehme@ZyNT ztU=nDPW?1%M2;uurbHiZi zbKL+7y-}INg0CzREa#t5Vd;gc$gp6~P=_UUiwX-bjtI-$HVqc`MrFPQSbcZuBjk9} zw~yBV3tmfB6D;*u2NlxWXdCQ;S*m7OR$&0)`xkG9!P4oP0hT^s!(q7yT>;CFV^ml& zP!$=LAB?b^-mJpHizC9a1nH>aEk8d-J=WkY)3I+YZ3ad4VFYin)eOrN)={x=@iAt&7alCWrARd;1j`Y2U zyz;K}MTxGBP>}5J73=Sp={Jm1jyEeh#M!oU{iLUGm5?%2H34d3+zh4{C zhx>EDbD%xV-!)C}ZMSLPr)J;z7W`xE$@CHFlzz^>&PVZ`>H@ICN1|^F(7UU@!zu%Qh@WSeaLd{z{`PcB}15l{QaS+D5BB-o3A z%wD{XFDu|TL9nSmJ4JFFL+``w9=zWA2?z%(2!T0RTjNtTWKeuNq};_`gKd&Nz&7bW zma(6q4;&|rZe&?Ac?Zt%xe#&kY7qOo;9~-KA$ip;&UGY`Y`s~L$5Ju|pLbH&zfSC7 z1Kxww6KsV*pGNc%?@h>^g2YOIf{q^I&h&%QyWcYj-Dr~ZK0<*DzTkjRE~FDC90hPg z-Hr7728V223rjEv;y1uFrmCJhAIdRR4K*;xV##yW)FZlYR)Qsnlp`qv-gA06= zzO%1P_OlD`eeg)xPmVov3HpMvqvlW~9XFjh`#@ZfN0MiPmCT*Eba_*f5goQ+bzK=8W07!y(ya1XK80-V2_lWeW zV$+4KQQkXwr=pKKZ7nXuUtd{N)~@mOeS4zdzJ5k2tw1Uv`sNaYvQ7ow`&0(8-Zs@4 z#1(*!v%uH$R2IL1#RbM9+Vh0kKHB?m&F$~=?TPknpqGqBb1`0NxgMP11U^I`zyKfG zv(vYY%69s;;}9h+8bX2+j+soQaf21W0lklvL~&iSd>ugKz1gyUQ74=vj7zqxU+SPU z@RiQ7T{NSmymi5dtW*^%03pH8Dyv5Ne5=tY%I8}GIiq}He_WZlp0S=bf+#ZEaRUok zd%Vf;GjUg`5B_2*iLGB%S2=ackc2GMbR5R=%%eDi*iYq%AZI8yaBjFE6=?)awqZ}7@EGQ}b3KCd~$WIEs+={;@&r2A+l~^)5 z1CJ!qoY?qbun)XG5{8wn7rg9yP@DDo(xcM(-gp!29BNJBY1ma+{ydt_9>bZV^e~pn0@7o7+rmn}W z7EF@6fqvmlQKmq*^V0lWn74EWeG@51++DCIO4^3Nwjv76Q?sRT{imxVOd`{iw0DQ#PZwA~Xex&M3HYbjjjV6TvVuSv;~+8TX&0zO8S zZ*%s8B94L=T_#Jbda9zW7Jj;(c@wlI5qBk`r?Jevk2t_sP*-jCqPBqR7Id z%ibny%L})PYyxoj^>b!zd*L=N!jf3ev#zXx_EgK{OwP44xK=#` z_M>$64M;YTl%!ZM$=75#h`T^0-zA5)6J@@8r6bQ#M??aax1f19z4@UY1j4^M2(J+X z?9H0)FT)>8aR7fgo9W?f(seddjcf|Vx#)|UyNXuj;?(;giLvjBEZc{48seQR_%;-v z*5rM?V8bTVo4mz>*uB5B6ZvXUnK#L|fm$K@jYirPwKN|W#Gn^armA+DCS=G0+7Gc9 zJ14>`h-qBrAM&~T8H^NdDJlSSxG6&6UQZURAw|IyFao)ntMx#88&?)H$oR)OveC*U z=O|f9vz#*jRoxB$F4sYc_O$k$xCR=U5czy);<%#0bYd-5h={p+rB|_-A@}hlsjfrL z+|yBXjU-ASiN=C&73?R`SLj6_;jzR_9b61!ru64$BucN+t!%Y4hCWm`5nmfZm>Y?~ zx{8LKCDlWL4|y(&IS!|mw>kRI9_jTu&l>TJnrCt!G zQGd<#qdlWwo|>4HD@?X^tInhnDwqWOvUY3U#iNd!Pdl1dISO`| zao1uCNby|wiRiqR(fD>oR+*=fqo4wJm5@)@!I`Zp7TLy6zAsr02j071NzC*8Z1%K5 zrK_q1HOFOMOEbFIDKE~*h8Qqz@ zi{EG8{Hv?^FRb$$odx@B1)FXsb9rv{eMtUut*Vi;;Mbqj(s`)1A-~`B*c7R0Bm(u@1zJyO*?w4BO%vp+M^?vC#oEq|_u?9Ye8uE@Nfy;%- zG}s&-3uLi*>-t_Nw>MYC`#z+Ti{fNTdSRws7}ZJ0m7+Y*h|*v4l4Mp8trj3JK4BhL z4>YkJvt|8foXEzA%qo$MMBB`A3gmg`)x|1HX|yB5;KSV#dIqcg8% znWU&X^d4XIlUWD(R&~OpNuaUwHVhopnA(mY$@tgm(+@znT;OgR0w^$}y#bTyayrP5<5Q&?k^jq25pEIlv zhRn;*|0v#nJt`s*`GP{X5N#a=T_94H7h23Dtw*9;tV7TtwBGO%)4DH-LRt?f1WOy& zx)S>_fo{KYt)=tX)Xy%-ihM<-_*A9X%c4~9YtX1&vVF5;O878E#2tDO9i(HCvzU&itiOmpoce?D&n&T6Bwmj@XG?(6-NNzr% zPRRnE@giTN?Yni@v?Kro$dIPZK>IYE3kB|w0)|L$(N8{)xYQLZYTqKN!kk29gvMc# zQk*##R{-k4$plnR0Yj)gF7T0az6_gr0u5yApjS|449|wWLU0?*xLv_m;O=$?kjvJ~ zaJThlj_~|s@)aRD(Cw-;+eMx3m7LVM@2L!yDOHL`u@xv=S3jjUnu|tgfLEhQL(xXu zrY$FR<#nGY1K1$U!3m@WFeeun!6X?ANzzXX{w0^trGH5pbn-7T!R_GW&>LN5?eO&V zNl~6VeV3xVPp>y6BY)fNT-T*nkN*CdL=Qg#nUJ*uYiQ!)&0bFsg%ibv64}-lfHs`y zL>@SCHbUl7#w}sp+q4Jx9D0J(%ZrfMV__s7k*zH-TC;XorasE53|lUE6I3nREzUr1 zEce-73x@Tp7D6({Q8GHmztl|XFCB=#QbHHN%Jj<)I8($u;#Oov=i#bbf-zr9JAGqt z8s%pjEPheIg`edf$eVC3Zr$=n>=r3n@Gm9r^0SSIK%&FHl)|)vodD|~DCXjdeb9S0N&v{az9^oY904iKU9xp4^SQl} zh)uW8Sq^o1ENcyKIfFAGONo!yis8kx8~B_vkQ*)CgSFDmF0Ls5(*EE?DGyuKDhpZN zwX|{dJ@aBLD&dR(^Eo_nDIIW7{Sm0ImZgrx|R0o|ZqHhwdY zDUE0J2_sZ!W@%@g^B4?_lx}Tgu+3CJ8AvP;V(|4{?8c_=maQG34d=3bxXPuc#^ox` zXfV6ZVi|}}Gl5U~L24F*X1)#iK-lD!h~jNfU}uTk-M5J5b0tN_fd-gKDBjH-4jFR# zLD{-z7_{;&B6<^El*s0xIk>$R=oXF7R!Y4b)N%LzLSSYADy3Vnb&cy>Ad%z zqH;P_UdI#7s2qap61x7AUGwl)e9+SgVPl(zKuqd@X+gF=z@|uXE@%aDLaI*yl^{~K?`K~XxsFM%RMaVwiN%mo?eLmC92Et~lLxd*`6g#mC zH^!dwDDJcH`Rg*EST~NOdXta?BF!P3Y;D7)PZ&~25!*Q~?2Pg}B#487{+k7i4EAln z$p1mC#YR7#vt)6Ykt|V2#&ePbDoH<(fLFA~241jSzkC9&H>dhUrE15i%pM1XB6kon z-!#EvylLVz@*Lks6wwe--%O?}+Jb)5hBLPJJS~OJu%od2ZzN75Xak&iY`>A@tLSqY zsp(vaU^&rlld`FA`uG-%sp5r>E^()10i{yVYAw+Oddj427SonCeWwsk*z^s=wio?%>IKS6Qd_jo4veuUg6va}ImN@$ zO(+w@=_bSz@azhnm>y*7b>`h~nt5@WTKqc|sN z+$VAFB=ov0R+(z@jt7n119>v1zoyeOVvmC2w)il8s?0|^k&vw zQZLLY>=l84vmt{QI~!yIJhVIE;Vo~!7?z3V) z9M=-NMkttq*b2%FMw#?AD@F=_6l7mHID`{{NTA1dw^&KLJ($QaD@vm~V#{Y8eQd?# ztq)zM5RQ+cFjz&}iAQJ#9)wtrgtvi{-J}K83{V9(fq+s8+%rWYkt(@S0FfR+-!$-% zsUM*)Q>UdOw&lX3Al{Z|nbhr>c*wjmAzrE5-oY*IED>yIoPrvEKHN!25d!$Yx*`K* z^|G}!nBX4d*%xnvM~Mf>X!C5eeMR@=Z-YqeQRb?<++r6*oj3uF-GT1;Oo_d0Wgrc# zuhQ2edZd>oxNKe~Q4X{N?g7cTeVBsVhq#USi$1vA;tzcup%CtT#Q7-Oc^;WwhQ0S} z&EygXLuoNLa6Kthu;tsrm_iZ)C`~4Z+gbcSh1Ymg1j>hS88Km?Vv^2~S_v8JeNLQiA zWSyj>h{-N>1*ISsUjmP8(QapWRtWfxGYtUAiie$D;-@r>aPz12E`NYdv4sc&RR}Rh zq;uHM?-q!?+bMqIgtK7oD5hCt%O5dLar@VjfA&IL`De4-w|E|%7gO$wN+G5a$*;@* z0jU;f7D)RN0(sqCoE~z3y%9Dp}1m$QF-RS*bnMLmF=!7)IV&0WBo%#s`_-)9s23clu0!Qg3X$+&mz?3GlhjSv?ld&~K9-~S zZ3ptU(=_C>kvn2n>XBS}#|If5c~p*ANhzgGx?+aw;Cp{mZYg>ne}nJf4x=FU$QJ_E zMEI=K{bsN#x;>;7shyBGzQP@L-iETy}W}{wz_R|6Btmt(;9a)v4i^~8YS z_n@iyJ~pM$xqR(*8gWpz-iLioL`cU-7F54uu@Up$2~0H3jf!)|perY`lylg9LJ&e! z!ZS$EqaTP7kGk@LA#f$62eLE}rP}UW7E}PqxfseA&7dn*%wYp!!(a4M+Obqt_G@;twG0cI`^<$2mV5tCk5i)Ul9X}cF4*Yx}hdvJ!PBK7$hzL_KV zh9qAPTgd6yy}-oC0CtdW_Xvj7lPF_5o}&Pv>fldA(_lurwabl-gqU`SRS2!z*Rbq? ze*mRG+`VxmuQi??+QUhtH9a%2p3@Md%R6b$FL0sc?f2@CY3w7TKWiUApeYFMHz-L_wL{ z&H@~E2yxQ&yJ^-V<5#^} zT;{Fo%w&&0d0IO~c7hzUi_^DgI5amo{XTLsJr?EoeMeE=L-d`%AxE6aP!N-TgDF@n znnlSa`H{e$v7`7Uh^Cy@tXWPLOV=lsabU@zG1!27+!q*aJt$37(64_1?E=;p5D%#6 ze}mtROtR{=+T#|Sow@YJVdO2?Jx#h3qRZ9}PvfzyH)$FZ*U~JJ^*2DRG?5ifSi1hr zRu;;-_N%-2y7n`OjwiX)Wi4B`@@1{MpcPWEy3P8NFJ?P`3{Cm!_J3c@_MpYA87=u@ z)``R*QQ^+_2*jN^F>ZTG>m4q!3?6=b2}XV`%UE>@%bsh|*0DKJiFO#x=G5=~DC;1P zoo)C7wM=;FlqU%^Y}?TWM$%s}HS!A<^y`U_np@4_)9X>G^+~dNr8J)HEY$NqWNuYR zby5RVWTziy*0bx)3Rl?+O(irx88B6dZU=XEl8#L$-v`?U4A;W;dJf0b`y;L%!UTE2gAw~P#z zHsbe7NAZv+ZC*?!BP$yh%))qE7B@08?eny1lAijAp^h;{I}|xFd#mqI2YYyLR}+1ipt^2T^T(F4ij)&O-_@(xhoJx8>sFXHpV{jm{vj5Y!-*d@aK znFL&V@G!PTKE#DUpDM%=*2^|Q+{)6x9Ptts%os-(uMw{2oTYzB1+7Vw*68$eglWOo z0`7|Y9SC_3BLu41<9~Pq7bd1&Xy7QiK>py5_dFmJpZ1U|ULDLNe}lW}k~Xr|%lv^r)u}PLjR!gx0mo)5syqt_%ueioq*Nf*K zTc8>LTnpV81H^sp*pzYM)ymlQqwI$Eat_e0-$;|^Hd>s{Vr%=V27*{m@ZApiW5hmY zsR9`rA(Knl43ZU(vMESU(W~i!?q|p^l72_8*=4ucA#AejAWfOg+$@ zB4lJY!A})_j5jz+t-y?ACL3zE3}LHOx41_Ypb*T6_8Rgar9G%qgQsz=re|C){keR$ zU2JoU%^*V*WXKUEXgTQ#lJ;-*H2lAqNN6J!&kG&(CQ{mh$4G{xnyL~$#~NXuw6`84 zE56`q0S=o-u~jJB-WvxkkoU(^TeCL~J7&oj$+?N{O_dIg-Q7SJ%jy1&;J1d*U1QA4 z?IE6k^jomUz&En)Mn5@X5RpQ*rb7?Dkz}KdB+AZB%Lvq@x}YLIvMGB>Hrh*yg-6oH zU##~A5fRu2o~Ei6R8r5|gzmE3pMr<`J@NPFw+J)ou9N>8$dlS&QA)D6#%*~ke)VT2(dcx0P1$YFunVvs~ zQH4o&8Sa(0>iB(P6#)SbykM6`(nVmk?6mxCTa2C9Q&ke96vOho| z9+0AeAH}y zKfs*hADx`zAIE+d!#Dd1PnE$rNU_W5r(FShq#EfXOAghf@drG8lO4#jA$5GG$($j8vQjm z9MH7=-^ILyEHBjPA6|r*eYlv!ki`5?v)aWhJyr{vhd)roJO z8;3EXe4k+-JfeKF7pwTa1D^tZ2mS~7mLMu~`Dh@&0r`Rh_&}!COg2aaxuk^JgsR`A z2BA!vP<6OaNB;+*8ioi(-#ZKL1P`qo;o>i2C82K?kb z6{{8O?(Vcp|ASaxJwjN$V!>n!S6_P$V&(H;NUb3eeqbL9*(4ieqTeBw;Q}`ju~9b~ zn@8gu^gBfLr@(6R7rwqj=7Yq}PszYn1!yk>?hl}+fVT+gvUnJGI5ECAHzDz75)r1j z(^v^$T_Rf-BWrZymnbL(6%k9bIVBZ=a+^x|5~pOdqCz>EQ&JHq-%=@aIVGEz6iO$j zq#{s`RVi=hlx%KLC>wK1DgtG;N_iD`)gUJe&kE&f%sdbN_mh|QkVk}v;NT) z+sGTR8Zqe)WUmZ@R(%<37P%DGZ*WQ~0_!rBQtrbjDIlm|jpUS61j;!oUELIVh>2$U%*Wj{{I98{q!V~O#b0wk zi1J2@yE^W&%r2v)s=`9?Tf>^=&z@{S$~H9V-U8iUm90ZCXfRrWe-X@;>^V+0NNCM+ z=_aN?Tjn@;nguI|?=bWQY^-6^Z5-BrA?pN9_y}W$?x#Nk0W53&(4Of#4ChJ5{q*DH z6S$uZ5dytp-Qs>G1*TUU2{8^rTyP{uds;%~_tAu{j30v>^eg8H7A$j8vH5cvn@?CC zUjw6Om@b?PAMkfGMQG)Z-3ozrD{{qhfTisM0B`I!;Fp-di}pZL_#X`F^mAc=z%zF`Q?&UxSfQRwdPh#H>ibY z+t{Nd{pisM#IYgT(*~`nYw^46fcHFm;%2{etug6_yF^S@s#hw0MTPNM64N|t%AO>I zxX~moGNv@`c@h&zEXMsm=FS8@%Ia$P*@gs2oPb1eK?fO>irSc<1`>4!W^hIlSwzJa z3kpo3A|T8lRMg-kn&e^JuobJVT4`(RzOlL_?8uG_AX?G7JaJrbDFn67_doYO&&(tQ z^!5F|_j~#M$TQDve%`31tTje^mt zWJpSC$3-f5M3ErSol30jFGGr}y)Q3}`V%B5dsmVc?Mda@iJZ!uRMyr-ynLuM=kHGS zQh@5$e~Dt4N98>Yk5tP?Bd^}5uzu5m)=`b9TBwQAYR;y~Xef`H%eCj2o zqRRyvT=R<5+t@+@Pp|Td`ogBw8QK&zXQimwQ=ww_#Zc59w$-FE2(|t~>6szJ6;Z!V zmXVFIkI|b0(Ev7eL*W1@5g(|1MlN#`AANPk%L<=>Ag*X#uZd`Q76l?4B2ol_hdD1p_fnLuGyR;Q>&IUyyuA zQS!#m?8+)tuI=o>S78gU-6+b2<($NZ-___9Gtes}w!sxi+lAUQ#U6U6MetE#sZkzd zYnUmCqOA-a+miG(Epb>_h<^=@fR7rI7;ew6G6va1uCyroA-Og2JgLl4S8}Xc^a{cy z^`>dDeZUM}fC*P*!axPXM!KJuvv^Tf_t&5-W22VVNj||&?wtl|f4a5Os1u~*c=Jm~ z!X?%xH>254^+=~vO*0U?*C+yBk66h>1;JS7Rfh#kRE@7jpQh8OnMp6Ct!?;Q~v1nWo0ZTQvR{3@Qeai6m)DSUc_mS2S0V%T^<7S(c0&BfMT4 zr9U1lWRXq!QRp4YraMN9uYh_7gpV{G7pR;CXR2g&UdmLqy|xG9&z89~P4}uX`kuM5 zi@;Zqsq&*Jtb^{&IZVvuR>u8gM8k*;dEa8{oI`ONIyt?2Vw<;s*ChwBGj0}$$^?&oe z>W1sm>pMg0(`_b-3Uq^^vWVC~`_WI*Ut@&6z!l=?cwsyU^|BZ@tv^@60 z{e5LOx?Y4p84(9N9Pun;wRq$OjospY7g*akcJ}w|NbjmkaxHY<+(8tKjpk+!L;&L;VIuW^lW`5~FM3rlD}Tv8{GS!v zoc9=>Q-2Tp$yyWg%HCACkDtIt;#T; zv{(i^t>$}sq+MnZd+p^kc_B>#$8xG5zCEIh?a_`A_>QAkeUZ6V@JIFaZ+wl8MLYbx z5}jMjkAd3e%CE##hqM(KvNo^{9L>k(+ae=P{;R6zF@b6Fcc@=9cLr%nl%7S4b_4ag z0n2Ac=uc7sNV_Ci#g@$NoqM@k9B zN1%$`kjKJAT%;z_j4kBsbH`eP-i7cOLTri)s+Woinh`$FK5cwf@&GcM-JCmK$jK|V z6;FsN9X3bK*sNb|A0uW@af5m4%0!#v#A}yAkVu!EZU|2#x{N(G6z5I+HvsT4E5I6&(8Alsgct+(@AUd>==tc|pWF4f= z6NrkJB@$Ky2M%ObFPB4!8Ida=$%|ZJlj(ALe@#>l4l)rxFwg5G>T@ym_>7_XzH%{$ zT}l?8^MZAFrNKN%lNYlaIeh>|$x7pb?y=#VIN4yHzyd1n;y`NQ_jU_AnpM@hkxcWg zjsm@`|D!2K4>~6`miDQoM77q(nt4%!sBVxNTm8>dB-?H$?_$W=ExoNjUH=Wf*qG%2@FWnA+h8lR~E5a-lrN_%( z2_H*5oKAh4>eZKchx++4TI=V_S8w(8jA5r2*4tNo4%TPKvxD_VswITZDZOtmBa&xC z@3a``944pMHa~`a65kVH5M3_ZGb5ZIeOUbnh!1D0TGGeRGpgKo%rDS#sOk#-q*$@| zKT@4NW;&XR;n5GK+znZ2R0}uumu^q;BlHMQC4b5k$B|zwN9zPqOCw(=X)d$xTNc3) zXv~_eAIY?Y;BiESMex)Z@2cQ?&9C5_P_D+w_iDrgpF`jqO9NE%cdEg!MBw`~715*` zATnMB9vdiGBlGIAAY;fp0(bW=$yd6~I`cO6*X$~1>M9j*7bSs9!8Q{((7&`YHpvDm z52g++mkv;{jhQvSP3(sSwLuJt=piPyt;s^5V$NTt(gXDpTF5^LfLCw z$AvNVjE?55C#gUXFuKm>kvJO2;)pZurwJ4r%;%Z;98|rVF(a>k zdfq<8Ybu^Nk@V=p@>hubwF`o0fPmJ#`#aQOs7|8DZ!jO2!-!Vrj(q(M31>2A9OuGC zVgFB#`2S{`9m&tcc#3cAze_i`kFOi)?n!8nO1C@TV@D~V^TfP$Qs>SRrNG=*t{VS{ zT2hU(2Vn{nYgBlfOk568AXVUk#ErCqAWqI2#=8M&h80%UdpIW)a7h%MVbQT$LCLcx z5F2J<&5&ud*0U~g6DrPuTEPo5@GRmSR*EmV^bo&1B1em%7aNtz3a8hYSJa3Y*y&u1 zqzz>^hUz)avl0-7*&q-Y;mRdK!@ldn!}#yxe;NNz-m`Vtg)V>t!F=Z+H*+TThrI5E?L*SVopJCQi1R2ni5)IpJbEFo8KU{ z7`cga)W}_+#x)Dg2b3h)Vmu|IKn%ubyX*nA#azMQdRayUb-i%{-n*NO9cE7|QYxnm zi@M(mF`ac-o(OIzAto}xl@EiSNhEYamQMHw3DwKp6wV0awoX!Z5}Orl%DPwe!OQq+oTBnSEBuzNe_{Hs{pQ0y+dSPzPcP5IzG39ExVO5dq8 zw$USRp~1b(V3r!DNew%UEz%=9p*THq4Mq!OO$VS48aN*nAbt=w)w6)c9XD|`y0n9 zt?0uD?d}=&9DRaXnYoJhF{II+F`7C?VSIp6U#K+%)3ikkoOeb1#O5i#Db5}XuZ5jr zKu8ol!9+e6=x|YY)}m|SIn_^{!V}eHrFl;jy#zA=n2(adz;m=bIi(}Dh`-cR@(SD- zh6-j$!?C;7F*K1`2ri#{tlYmRB41d!$GcQQnn?4)>yg)hXl$x&RKbJuz$$jh@#fda zx#rg>QfcTjZP2lTZ_6_BAm$q)1r2>>FJSy$0b&#=eZ@kO`7F~R<~Ujv0#eyc(j_<+ ziJxGuc?Y%FY2@rd&NZIg2kj)C>1s07?w)mGz|dzTtACqA$fxChfM9VVo^CNO1W2jd z!r3T@pf+(I7_yg21s{UP*uB()+7JR5w;vR8%w1K@W6ZBofh*O#P(pZ^KcAZGs;8kp5Nt;nOl^Xlx8of3OJC zwIcCb%*AtogZ*D}(amLK_+Fwsmx-!0+Fil=TBr*?nmz8F-G%W@OSjV!4mYf`DUP=v z1{-|nmyp-jFrKrTHSarXFmPFhM44FK%ptn1k+dZf3UfJS?~yXnq|4W^I#D!6DbWSR zDd zh#tO_ZqM&Y2&&;Olsim;j3|pee0G*~4jm35ew-%@^uv!gx3jj3&k#+F1)syU$L0;o zNUxL;Y3Y>0bB3YHnXAua+isB|=rNz70uImlf|6{l@c_6o;bV$cKHgZWI67!*`9uLX zub^^K`9?`BtjEGKen+dbgkzJE&5DKP0rRVogF!iEL7l?yWYDwjXEvP)QW8j#2!c#H zG~N3?$&%5bweaYZqVlLUxYmKb{ETL!t30;mXtgm-vhPw}zs#?I8OJPUt2Hr4gb|6k zL>djys3N@#k5K|gAAuusoWc|&x4o-}#0{Lw6d~Ri_X7W;aAqX|iBAAK)55dJ4mR^P zWzbSCq)7ZoQMwhsgIdNm^DGhpcv=!*H7-R+9G^XdxzQD*L_h*v3>U+gmMUa?HDto~`S@c97RuLzIvUxA| zc#!$0q|18|@6DIe-L{6B1I$(UWbZI<6a$8RD)w}e#ou6()T=|p;dgkvV(UHiH)B&> zjk_AmO`mRjHjU8Js@-$3cXLR&suu2~9f6%S9kZyjA?zTo`9jD{^y>wrWO`0|wux7; z+6h+14#wqX2=F9IL}(=Y?hb?<0r#I$xUqK@n}WdL+|XvkWji1D?HuL_!P> zc=k?yIBOS@N}(^L(1TK){ty{NVm?Ti28mIFJp(T5>n%Y9*F?q6l^J1ca()ZRknUk5 z2mT^(6S%0yjs#MRJKK0I8Q3uv)>xKgy^EYu8)99qKN+tCrdJ4MP{X@7YH72 zY8d}0HGIe6LNYY*TWJ5OI%{a?BkCKEWvM4x7#W@-1ILzp4SUS>y2ul%PIEbLDn#q4 z#PgFTPkzWsIHn=GB2yi1aEgDwHP>?aOz%ny1d2=)T}C6xA@BzQLk>m*3;i*Mx{WC8 zjHwVl(d}mnd7-SNFOn`fuZjK*8yZv;gxn$z)QuPM5*YZy1{}shnjpw(qYx4ek z-qk$X#5?)VCcm1*6gf{7(Ht>l@=jB4w0sg4AigkjKT)cq;W+7M)G30h#{D1&d)4Nf zW(v7f&q)B`3QFE@f;X6Nuw^5rT_5Mi`~>tjW)}vGNqMv6`iTw{V8c_knV%$Eyt|P} zYN1qPyh5s??(g_QL1!JdK&sq3vh77T16ZZf+9g0>a&DU)V=obYg@5T8w*YB^cl^!@Q2mtgFHmpFy@<}LSKChtK&YX z)1=4dSMyOeJkCQmyu6R<%U9I**Uq3Ljh()-i7xijJo#~lhyW@7558l4r0_aY5=C$J zMOC*aKsPV3k8^z;A4TOS^9Hl!aW!Bf6bi_>zsIPTN+zgx81MbkPRw!E9vQZZ21kHZ zz?kQLP?|%c{^A;`>3+8LbA51mg-QKrqT3rsR5u| zy8lL=DUHr1qMqYvTBB5Rw&)bty(D)`?|q(x;ELuxA`c#gR-xy zvTv9@rA6eI0(^_vRln}%)$G7;0@}HQoC{LYFOQ6$>T&|?hwL5&v)5GheIxQ7U!HwS z5mCNul!$(sjz+<^04!0F1Sd^EAzvS%BD;QxqWc)W0REc7i{)lsSat{!&V~&;ol(C@~o%;6LzYx2t z`C|kRL78xhVD0crwgImWSZ-2jLFMcXXMV7|_8lq5q6kv3h@nyj>4I&F%iJ+9Ig8*l2g-%8rOR=&4%+Du8SwbI_! zX*WySwN~0cb=qx`c7>Jpj!yf7qy<&lVq=d^`>Uj#Wu?8R)BY@JJ*~9&b=sdKt-z}9 z!?gMie5!H#D6PH^tTZ#NzHL@ovrcU)v2hNxf`yW#wbEaF!`EY#%qr>AVW03FF+ z8D(i+O8@Oef5#ggsjm{j(&li9VtqPszhsdo}$of^jTf z;-%X|OdF4R^|jK4^Tl95mtR8%hFEHpbtDELRytO9#rQ8XA?0;!YJxH|&t#YrU*|Te z9^_pvEktrz6bV!$&*R;fOlaHczo(_Qx}WKl-fHTg(ZQ`QXSxt8hepmvYK6;U7a#nBkN)kNS;}QH7EViKPOmwVnwX@@2oB)~d9oTMm>rO^@2~ z>vOH{a4sfnJbksaG%r-%6d4klyIclYDJy_~LncW($4cu*+PhX-FDvaH(l%LXPAhEz zY2x!0T6%p4DQ~Ag{10c%Ly~^(KXM~SgrcgUQ=K(2mG)v@q_b5)PHuQk=-h!Np=CKu zk&dDM^97>tB+BKdUVjlfca}S}ERUe-c8&`|=RVOf^;#A>cV6evvg}@|q}~G0F?KV( z!bS3)ET3ypQ?Hu;f?pfm)B)kZ*wTIS_{ZEQvp6bKE_7~2cBIqV=t4#pukxM~Il@=} zs3h=^v4##UZ`87fpG`|;8qd87~8;+I}6#KeUv0&KQg5KDs=x(>TUTM#VCGe{uKSmgxV? zZD}83S3Z(fE}<2zfNa50Htx4gAU(ENLdsmM9B7pZXsKSVCfpKyuo|7d7K6=~l)m}# zRRWG3f$*2DyoYhjO0(%$_KTD+zrGXDl8IMg6-bkbjFYXBVn2xE2bGmL9qrZm-Knb1 zMd@``FWCQY3y~?+= zt~^ZTbi^}K3hGL~K;rPF=F4ZdrrObi+M!z4)1jKb6i0?OU2)*F6xsaQA95|no|$jP zN1EFPwyyPZS~;lj3lwg*)`#1xwR-tZfTuUkf&(-}g-*=aNlZGojjDOu2g)l;sF&6? z^o-pl(nIvreTV8AYP)o2TCemG(djbJre3RSoHbox0j;}-2JCK;UXlh5)jc$DRyz&6 zjZh@RXM6pBVtOksGn{Hb4X)Q!ZS!B#wM1W4 zuhBR3>-_EdX>8-!UgcS>D?ggb8=?Y9NmK@VSyT!-YhPfNG(-i`lBiI;EGiXiBVL0- zs6@?~GTnZy=tT`tLAWF;bE+&V@I_`dM1>Y5QR&mNsDK_B-=HW_qI$MW0UjA<&mJ)= zKCr{;MsxPRSi3f?A&Rdxxx@;72cL~C@gh4-EG_d$Q+8ij&<>)MxLc%{YwQXc!|gNI z^lK+K>bMfblpwBb{R~%n5ZPhuVmOYrm@5L!U%HQmd(kkV@I(Ik8I3IOGr65CN1a02 z;x|4N={dlqglL6FJ>?x5lY{bB?Q4h~HM^Y|WzE70Wu)ALz!vNmyIFQjJ7{?@P-+2WY8KJr7 zUEhJ*TfWEC@E$625n)U!=wUpms@d7iA8xFt%zQNFm**BQldu-;0`32qdz7 z)jPe$VynjEsnJ(P_|LFhjdosIe)^_g4_{r_eU|(=+x!sERCYMN5_tLvFx%L^piD!m z`ITfLKFhP{8RWPgJ8EPeL`{>&H@9;8Q zL?^qIsY%RCrTg@?e$#0sc4=npq8uQd$nB(I_auJ(#?7B;>h)TFP4}6n3si<lONv)Vhc`zkQ|+hzNi*uH{>-`R!pqx9PiNJtC&`o?Oe=I+GM^86+_WA zgq2#$|CO1c==a&vH-ctNiu0`P!;{C)c))+O#1!`_msl5wkHAj4+{Pihet&pJR5&Xj z<}558>?^fd|3^P5W8TG%1W3z!%(^{h-<#3{u8{w@Mq>Tq9z|ox+hp>^V+;Q*tSI83 z1p#{YGKU={_=#l;!e4(mFVR(HY4q(b{w^L`J2BN-8LO!6%a9tFV0JNk?(ZaMg2pdF z0~C}U_ZuZ>HvLn)In#W{ik0u!nc8cNO*aBiv%o@MD3NPz`T^G01iPFZ{?bYBYG*nxnvKg9>n-~sd@@EA6=+qN4Gm`tEzSxDCbtB!w zMep?_ErVOS!>MFs)5dWttrdXc%H~sV%iv4xgbI)HNe2!ymv&>^7$e<2?a z>h&;p>S~S=f?ND*PGR+O8D4oZ@5L05NuC`-(qgu!8GJRzN^XU!t*H%U#L`h(8Tc7s zXnLw$)0vm)**8|7hM0lUofb!2`Jbxu2c-Nvu#hXsn3>W8JZ^L-7*$vhjP zlGtEKn!jd!7!buREYsJZo_;i*j@9cubt;1{x}{;hJ6Wb?yL@-)?>2+3&>6p?LS1wC zgzEKq)TOh93n`V8pBvB0chsr&Lm)3)sV@e$>gCE@B9I7BXR5UbgWmPa=6pU|Zg|>f zx7fPiO{lZ$hTJ7;T{GDpn&)m;a~l(Hw)w$snY0_~q5`_PL&(vl9W)=!1fs$O=oW=C zV@ss>NmNCLxl)dj=6q^YlRxDVDPuZM=3_BeMp;Am0IgF&Pk{vtuTXGose3@EYz_sE zn%&`^(c6bHoig{`Dx28V#;x)e?kZPws-Ik*_BToTzWQaGHn%F;0OhS3=vytIZo{UMjT^2n(4RQ~ZP0*RuOO?2a9A#5>rB&bU)EB=5 z|FSc1=&(P2s6PVR7IO+2JT=_3Qmv@j7(c-pewO!PgX-gOUcRSJ{n86h_qU3)@Ql`8 z`f6;8MpJr3l2ypGT}X?>Wd!83{`qPbxDo@l(-QQE#^xvC6wbwDD>w?-AuOOc1a*pK zQ%@-!ym-W=!Y5p$XX$p>uQv6Ww zHxb2T(@PdNF@H_EFcPGKVzt6UJn&X?I`W;I7gJt=jzK}Qp0fmc;Yz|mYw*8k1|B#`*&uy5s=9r9s5aaWIbyTps9guEhOG6k=b2==_1tawi= z%cDpr&G^mjxL+ov&woZJFl_0wQS{D>@vTz_S{)DMC!qQxngf0e~ z@h{qh{(grhbTLQNY+O9-8kij|M5JGesKmLb3zkU8&8*h<9E-4*Q2ooPB1!p98s%YQ zeq}piShRn-a}wJ=5{6OqG@Qw(fCj$a%G{noJyjev&sF0ueo4@15Qvz0LSHqI+{e>9 z`C`}YnF$?SSS~@H4&jG4i!P8Cw^@bhMKz#nUqtNyZg#Z*Rhq$-!w=Ut*(qp$MBn@y zUH(V(&F{Ok?wcu?&tww(_KozuSqD$nK8IJ4E|cJ(zPW}8s?fq|0BDMz-Qd{dTtInGw#3W-!-knNdI$ZdXiTovp1L{i z;(-m7F4_3bWwf9$VO~5F`ir|!G0nKl`LByoET?GA?({1=PYmtbQeDj1117w5@%nt` zdLzBuUro0G+1WC}E9mhu^IBPopp}Xn99r8BI@VwQy7T5~>=Wui6?3eHCNeU6(xR8U z5g7FzVGGv`6}sK;7TAS7$U(?-S4d=J(pShL$2WOt{D+@0I@wemOa^o1yW$vvabRF9B0isbGGQc(iF1tW0=Ag;L$v99W~2G~txO zp{uf2rN|bITHLpXGdb{P4YPT`*roP3`{vc;I8)sr^9^sz^`-+@gw|XfyC&1Qcnh@V z`U&UFM?q^CdG~0qjJRB_{1*oDG8fRAPf}I@TdTNfhlyawums#aopK8zyZr zdtcaYi!kA=otD^CT}XQR>=j*@P8#VBn2&ST#ir2Z8f4*5(uof7_DK zg8Pq-gW$G7KF3=Br51he<3os^)ae}I50*IY&_SRvF9i^xmuhit>lVd-F)4X_r`q-4 zpQ6J4puc?)De(3z)SC+T=n-=qODwrnh*0B9vDC!VDp2WmVM+Fw>7N=i18%t`QS>)t zNNrYuM+pht@C+u}qX8`IAh2 zK`=EjQjuddA4$@pH2W~LxW%Hymzxhki=x7xMvGf-O%y%Uu{A9^HfdVa(pZWXuRd$j z;u_N1rNu0EvTR!9q-b$2`IEGmhuf{qBwEqJ(top(ROl03x)2tbg9v>SP7$`2g1@#~ zD4_+}dX_Qr=B6a4Kp7LhXkFwhj6lpCshOCc4~rP>cB}a)u?|#yRKk#RQl<2sL3PP# z`sM{{4BL!>#j59GQIOf0bljMk1UGE}??MMg6zDqRn_%+;sIc`I{-YklSFq|SZDhE% znY~JF?k^gop1i{52h5wNP)ihjj?76{q5no3!suV!nBHSOpRs#vIqB{8nCvjv^n6At z!FyEjCx5cX)ZNmYIvtY~fEI6@n~_BRhx+Ok>bCpp3@T44&WG)*f`YWZI@X3&({&tG z3asyJNb9RJ1|PbwwkP5 znbhoxJZ1Nllk|4`>R2>VyRY_1CAzQPc_po{&hRVz)B8#kTYEjX<@*!~Y^ib}O{C1z zgK`~Wp?#5p(#WBN}?!IjQf=UM2M0cQN?HeFuK1m$s5) z@KT?=Xw@RcHN?h|#OE@ED;3TOvS^>lG|@j6kUlF zOGo)<7Rr7aOQAgf2^;0pNpBbBGDUuCB`|JKdnj{0S7KwGEK8t7?=iG&8PAe&$YMj&8;L3g%_cAht5fZ7MSM#Xy)62K zl{=dhaSSX+t{N-jS;z$j&@^!}mwT?#&!#9_ne1ucLK}AL81C>mV#_#sd?&piB!8A= zR-))d=n^H*?m{|jIF+yXD+4g_18t8rJB??ueCuL3(WP_8P7=*J)Dcy z`%$w2`WMm!)mwGnE_GW4fJ+=Cyme9WX$bcq_h@oE7d28Azj3(`RT#MW3kvy+4}7FF zeUj^K`q<%Zc*|S;p0oO2PH*)$ju|=L>J^UaZyhtTt5-VGs$ZT+RyUa)#a$a(Y-qQ*r{O@{DHMg2v5Ktd zN7;S9p;hm5iAc6TYZbLbvb|Z~rO=5kRp=~VCg`~7=Cwj&`*7kz>(%IBS4Bv63K+#5 z>YMR4glmd}*~eWJ!Ju1`R5tPKR=johi7y~s^MbS@eX>9*W;igmIRE#$)xern7Rf#o zl64i5c?Nu?@$UQscz=RdF)5o-D7Q z)3~cMaHaD4SyDf;%|6H=5PGc1|+DQMCA`$Fg}=U!YRlm?1yY>wy(Kan#+lw z((dPYp;u?fA{dqTIp?!;Z5+e>=ss1J=Vt!DmWE|c63ay!)U*~vdw~jLc5d@rC>HJ` z@b{2ET?L5_q2-xR#g7*2+^l$EXnEmN@lK)To~PnDq2(FRB^&JyUG}e)@v>Nmr=`v- zO~{X$_km$!I0FA>r#rOmb8oM;-tx7P>`>{q!M-~pACn_|nfkgWwC%Ih*RPUa`>U_3 zL)$)0eT^r-a>dCuZ^O!vcU#>0oD=eu?w0Rn623Fq?eqyiESpc#=}B^QQ&1xl7HtlX z6grg2pW}rXzX;9UpL<4V?!Jnm(ADZXBzex? zASbTHhlz83s5!frIUD`jp0mfW2ul?8`u2Zt&VINm)qQ%-j(S-bR6BDvPF8b(e6{BB zq2{c=;U8&pmbs_rtgm6RHECt`#s`xvZO)Rd^_*?@b860(>}JY(pHIzMVYzC~itK1T zWrtfx!hkj<$LO?|WP6j$|35}(`*Z2uw9ZJvx$Z?p@lA*1E!kt!cuUW*!dvE!72c9L zG1-s8Tdt?}R=i~jHCw#JyCkC;#x)Z@5Hi+=vJ>83+;`U4n!{ix;Om-D_P*5D6o(n0 zzOD{s!(r^QDGqbId?i9o$e+F2`krJlA0@#&!Ciivw; z`ox{d#Ql{$ai_GIxaS>e-r9RL>caE6pQwEd!*S_eCaXRlQwOVO`mT}`1H;a{pon@s zlI0saiHV|L?ne@FV^Y~8A~p#@|O^qOKeQ%ye1Zv zQgSRh#Ax?b{2l2Y$KT2B@%)|R28Oepi^A?Jc?-KIFbmlv>@5ECzYf*U$mH`cv-opy zHh-?B`|D>o_`|V;`XRa1FDv!Jxwt7j1AT()U?hk+s~C@_oJ>z{uFBs>8_gv*6?MkJ5eMCKGh;r-$|GF|( zgKp_G>`g*c3*Jc zO3{kQB@McgHMc5v>AG9RC7Co)4C-zbGZim4tCzL6aSyvR=Q`suyvlRpaPM zp-^%VRjky5=#ixg`kMy$+&9eZjh4RT(n~J6WPfvV`7omIx&{X37W3rYDC)TFoZ&0e zRUK`6MPyJHi!vFLms6d%1kTf!Td^DRaH)*R``vqhhGUyD5t8vPQ%5(|+28i(%t@b8 zu+^NoLsHV_jO!a~&YXfQY=6!aSaW9Sl0(dyw+{UG=FIr7TF;q^2lbo@&|s@MGarkm zwxyrWr*`K|+2{WY=S+M>J9FkYi~q}W=GjK(ObO-wJ9Fl}eeKQ}<2AZJE@tmaIhUf&(6gbjPE^Yjk8QScT#pL3>2 zBk#+~_-C}(W}RP)Sw~_*ENJ4Zu>)g=dF}J+aKP!#MYqe6312NyzhK{MYL9E}={*r(DV>e`Zt5@fGOZF}MD@62_eD5v!+*h*NU$VysOTW@v zve8%443{5^s9Ig|d!J!SlQVrz-^U?;`Kytj-FQ!%Q(meeV6P_IJcH(aOoA(kg+A8P zuviG^X?Rk|>1+6#(q^Ck{hC{44Vr0J^b1i@esdLA4NgY?h=1 z9(WhhDlKA%!Q8fpn`uSljfTvRJ}Y*E`xUPiNIZ4VxgSy^=s7hm>T1-biF_I>(rtl! zirwvgP-WTdBe(n{m!ePI3+_Mj>ZyCo{V-2o-9q@bfJ zm>~5dR8?ub>Tg(C*>`JYOb2Hh)X=RHb>i8v!CTiQTqUdGf%4}Z`E#25=_!AXl0Thg zxqJo+$JBTq{!WRX#NTV;5k=hHCCt18hOs>#d8$-lS6q&8$^^1af~x>3-GY5%voRlAtN z%?^b5_g25CbU?2Pf)^HVm&MY8oMU9ZZ!%weiUrGn4`=p-h8qv5=A4hSMTmf3;f!!+ z&j2+YXPgu7X#Jddni%`1smS(>67JRBY!(o#gWI;n@I4r}NUOD>w1!$IBmei2c1rE| zDp{&9Rq7Z@vC4v#sZ+qe))g7#fiJh>G9wr%)DS!AE53Pq;GDYIop@$t( zrqm%#5=D0*c@8a8#J|zv$2|ZUNh2~vtaS(pS@|=sZx?$2gGpq{Nb=h<<&!5;=!;BQ zW@Q&EI$38YtCoRizC>>7l8-5wB1N#H|8$uWrjaz6aygCs56hI3Gz3bfy!m)*nIeQk zrU*HaDMC)KEmN}pdotyPWrvU{mjS~6oJ{G>@!wrO z|7Dp{zelE5=|}C!lt1FDWXqJ*kNz)`DPe@b|3#Vd=?AT4%IkP4*)nC*KibHY?sv43 zDUb90Ff!#Cj-|CDQ(l!8k}_oybs$q_9A2ix@nuMpDKZ@`nIb>ilPRC>O-hF^amlh| z%C~<%yi8e~D)mCD)M`ro*JKLJ^E*VR#g}U--$s;d?j@Z62SiDGYkEtTT=aHZS@MFU zXjxLNFav~x@cGX0J$W|elW|Bz> zgQv-2C2L{eTy&4*Z8Ecw1-q^FMOge8$2%A8Mc`ui;qYYZ)x|8EhaN}WzoBmN?Xmi5 zC@q8xiu+^kb9}KWS-#lJY+vkBN9>{wgJP$h=qdS(dxLU3)oXHnB_DW~oDJ6gl22se zQS!aNWQVup6)_iG=_&a_mKf-tYbv%Id({eq-Eu%Ge={<|2HiIz`nYBR`KvG+HTi41}$m3UTUnB##uSM z!T*DG>{d&Szc4#!nzC;}_Dw0q=m8cnpo>pT_mNxG_oD>Y(+goh>CROU;RH?@(1>b7n$1+@d|Fo;Nv;?+nWxYct2_!L6>|Nt zv047uL~K#ha)`x=r093Fw`8wBHVbc|##|8^B_AZkgtugeuVe*MLM%{?T81Db)`^g~ z3L&vh%uv8M$61SIJi~^fyDcdGhG(pZED;tDJd|XZp1Q>ne*&=~;U*9p5-tO=p`vHh zEtdEZzPgvU^1%E6C*=QTM8hhcYlSoNe=`syW3*TjLNDMhrcK%tLb=RSX%y3!Y;v$n zk?jqZDYCKQYj{$&G<*$9uxc*%Q)2QkKS;3=8S#}hyS%x!9mbEUm9nH>?fIBcVTI%+m`>jRJcx5<)9}7zr z!dWJv$uI!B+`n7x(EBDi35h*f<` zULBkjMzVof4+o1!alNb zBq!!y?kd9o_q2mWD(6E@&gZ>gbt z(7}u!I#wk<@WbAaajOit>KxvZ7+`WdqaQG)T>fun;OY(0<4Knd(c&~G0xqN2V4i|a z*2XnEh3hAO(71Z!)Ll7&I}Ub@m;2-7Jo($3li0S?H}7DemcF@<3V&kXIGt&Ia~%ij zYl*|;8^!gUz=lgAbwII{h|VK67hWBI0J4;>EYenwkGX#$t)0Mr29) zcOnTI{nn&b?AN&m(^l z=iNuNi?hTb5MO%ajGW|+tV>}{6oB28Ml(Y6rq@YDEg)n7yY?2|E_Rup&d0R~w#`Pdjulci+s1S| zpA@D^^Mzcp$%_4Lj+wEPIYMEpS2%Z}M41msftcg3{1z?ZE?&>g#TaK{t85}b#Cj?0&un>H~i{~em)Jw7(w*=Brnzs^Sc89uc;K3-gR(D<0nD$ATJ1!9g{_$}jO zIc7q}Kl#L(4?B=OsrlfYtLMXux3!rM zc}cYY%%^te!{c(^t~I~BO3=Pm3b3EVZ|UZ%cx`7s-1-+aAACCVy}ZeMIE&YV=fm}R znplUP567%Xr2Ep)^sqwXUWRwC*phH0P}xsYkYg(r15=d zUOK*?Uu)xAPkOuf-o5f5eE+^s=D!r+{$l!C&3|5#_%7&hSbY089*nPFRz*J%-*3NV z{v&VF<>6T@=%jz2Hq!A;OtbO5m-Ke=UC0r&HuL{-a5N`M0q#Gr@V%VZB)*S04#rmk zwsE5}UZE;@M41y5rdtal7jwQ%|aGo&ExNfb?!ELbMXtfb;Z(FBr=)e?bPMv0C#dNt8TXB6uLJ)>L2 zk5p&kB|+L-4n-!*41 zxqmIWH<@4G%3P$6#_FJ?TzJ^~8aj1OM_<`|X(Mu-7n&Oz%ln6alf5PoZOV(bTriz0 z(q7?`_#xyp2DW5pZ8OVTt~+l=PWgcAPR-uT zD>cVsfpJZ~*yWjCW6r9)xKrK;!)sKm!pq&*Ny(9b=;J!H4AAE;U9s?(J_WD3;N2TN zkTs`!aNLGK)4SON=T`L0Sdp1AGk2ij>zNbpY^NJJJtbqky8Ls_u@+k4E>JFvLSy(c zbM!YFJW|tS&n?La)6RLfFl<3}!4ooYh@JTglo(=D!ae;9E?ueNo8fKA&QxSL88Y<0 zuA49W4WX7d`c1Ft?@0(;&c+4DtsvQ$vm#I6TVYhJ5LCDFlg8ITC$KegRv4QU${H-a zxm5*7!Vqd2oa}z>|>D)o0(l9Cr%NSd_9fL3v zf9#%LwGct=BBg)d=b;#_&(f`@(b@{J|7tCRX-(RR@aU@I)?u8jXc@!`xI_KFBT!zj z6s8mD5@>2F4DIIxZY1lgm4T-9h0SPjc61H)ZLz0T8U?>2FK*4Z@UXA8+O~8*852ca zfzgg+o2s8^&4Iq#oHzeTrdt#T<16p~Lm{?br8Avp7H(}TrGDwJ; zS)qD(c2gD?&xQ+hQjSW=sWR3Do0=Vw;rd6mTx*xpDWE>)1rzHddxOzExm83+%?lbU zR|*ugp&Fo}$X9k^5Hs1rqD+K2jYN;9lRfPEs92 zT28W)><${1>Y!*d(os4Z!eyp9C|CEz9cfMc$o}zlY7t88rD5qHl#1bn(m@cen{LLN zS6SaB^1AAt8LhfU@Ra`9n@C)z`-i@eZb^2N?w_W#{;9Ou6Z*CYeHjUrogn?lPSOcM zQ_}WG+D=K^3S6p(r2B@`k(C-U-9dRIb~#-CETez)EK2mg<1eWhrDI?Rj2?ql!;a;4 zw^LU#nlA1hFpeXDV&pSsWg#iBzXQ+9qu{+2GDjuG^drZm>S=x!f>_g(Io$`_)q2Uu z<)ueZwwbSi@)hB%1bD3K(+oqgb8Fv?bbX8Ru0ZYjfblW9R-}_ThYO6Gzkr&dXzy`U zik?$YBbCP-wdzrDkv!@hLwSVOIy^k`vJypmkf4>^hs7)0ZGZy5sF!5r_~HIzMcr}M z-7EDOJ$$P`|0p2M*54Bs7orU9oppjmhY!r#RL0k(Y@AyrKT|v&hqVsX9 z0h0!u_si1V<_B3B8RaYIwKz%P@_=-X7wHHh@{3U)Pv z<;4H>I+yLqn|{u|%*@DX&c(yC_N~Z_^a}Owa@`4mSU$@43Q)VQYgPXX^CDeC{{Ec^ zX5lU07Vh9(T7Y^@n9-FM!UyT_LM0pMKiYGKAAvH@Q4M~+q>$j+$m~G*T6hBBck7A<+K_B2Ns-3T$g;HV5jRVNU!k&JJud19H`>^oI0| zmp*JWwwS{TkFX|1rjS(^+fSiVLFTB=zUx$031hWS>JSi z2U+9!_Q!8B(X2S|BEhYqt>apW<@rvA*O27vJqLhHYrDjf;hai5+_o4UT5r2@T?t zk_33mMoKMVC3a!?wiGeA^U!(0HifUm_bSHy0H(0jJQ7+4Y7@rJ@QE6WPBzvlRDLd~ zsL9s~73M?=k3p^R(DNuM(eL0c5+%hi#)~(&G}HPQbUwL_WY6>y0{eGG-^~qosO;Mm zs4om;uMrS6|C)=v3DQbxpLXeM-O5Ei3)$ zc=RWhxm^PF!x_&AWmFZOJNdsyiGLKS`r&)|-xApwzgwxGcLb1!{HKISOI3s)JLOFk z;%UmuUis4!*{Zdekq|*+9=));i|$EI%4EN~_6_Xr(Q#wB3^n@O!i-1 z<|Z1?H0JhGbY=VzFo3#ZwA6P#NykoLrrz|qDZvl^=a z;_lBZ7?q<)je8m?rMs($?u@7}-yk|Y(@KhtHNNs0EBWE!CI}uCKI2s${rEqc|HYA` z)Jle*E^`xRKj9{Kb)e$%SHmB`;ckF2{)?|=q4IBi##hFx&YEfR8Gt7SqMH(2ke=nQ zeIIp3&d*m8(_x~s?jmx;F4z+~cT~o8`Od{_8!GemMBjB1<8FOm+={@s^?_Kob%@%r z6mh=PEvxC99A@D#;}vJkR^$W1)mif;b*LW?+CP3}{}^Kb=w|mvX! zpc*Un?-Bg=Zu?9f-WGn-ycuR$nuvdevUDQW4pB}v1&nXi)uolOYZJ|XC&T_V#n_!A z+0o5N+Y^1|MAlosgyD3P(+4|Po9EfL#^tPG(?vLS!0GGp+M{B`-Y44LO6P4Ms;Dl@ zaMoPG53jm~s4>%5{>7Y+n}@Wnoj%UBD^xIwkLoA^G<-(oILGg(Rv0-qQF6SJ&AyRr z?p=~${@p2ZUY6qhW_Kp{=(s})62AmC?=$u{n~K0woHdWC9}q>v3_TjYEZUsytT|cc zVRIJA%z@~EY-jB=WQ=*;@xfrEkGg}FgZ2d&u!`sR-4cpoD`M%_n8hszdjow}2DY{M zjJ?gjrL1=;ODTHeGv^Wpat6T*0cfmuiKNc%9dZm;H;MU*xtV_0mjdkIxKkn=E`iV) zvvVlek*;)3@4(;u86AVh`9hcY88&so-5|OroEvn$d{ayOXb8unP^EPUj^j56g>Pz6 z@A(Ll*|~xJ?@(!;s#N~wPtP(WI{EB89mg~7Tq4$(=!g4#uh3x7RDm*uh-xNB?`FUhVpu5b}vImxYi!IBs2F{};Gb#|9QhTl(La?af|MmmPrj z#ECR7*KWmXRCRK#R0Y)H9x4Fo2+3v)Mp!ti%ZtP3N`4t5YqE>unAsHC<|8PAsP#4T znGrJB!X5CVIz?h8oT6$*ppJ&<83vt$32!tv-klBH3jH$L$eYno_R4*yvlt>VGu%zR z_Ra9VAjQO1+Al5?%?j&`u8jEmK7&*_S?lrl{mkF@6F%ohjuN|fK#upKUcDY#>dG*4 zQE*bJGBkZ+9}bXAk-YHn{LMM2U~z`I`2Y+z5t-z#-FM^oNdJInGsPe-EaPTzeNKzm>}-3N<>OPv~VO9gO#XKH)Mor z6VBRuA%)ji6)@&0IVV1aAAKSgy!+i-MH0?kB?2-1#B?Z{I5l#tUvq9IoErVJA1AB_ zol+5BI4G814>f(U%D~omHp-{U5TB>Y_3#^tA^Kr&FbR*dUW_x*%{kuvJLCBjtyV>S zfvxIu^Tm8sUE>P(kGAv*_l>sn4WAHgIX&DZ+EVPSEmfuSn)~WnntQ2dX7h1UZrNwK z&0SSOR&ytLj%OyJ-DAQo-N!u(VyP91ARhY(?7S2=zbh+Sa=OTwTnY%6Ggddh!8d#9 zwh^iP;_r}SBR)?hYCDCcd$m@)`a}ojC1$Z!%c_ILW@X};AJ22XwB9V+2V^aYNKVIW zt%r%#!qVt|NdNLQSo)Wz;s34vRR$#e8q(FTE)X;jU7acF*HO`Pdp{@YR~M~*J$=6U zrB=R(SUg(fOMA)}luX@cB3oD0!kP`oDGPb%qcF3CgO7KQ%_!Z+-LdQ|4dcI${;M*Y z=^pfkO5+<#AsZ!JkLXvd$D~J#Bgd$XD0?+mC6W;Rt3MipEN0&GHk?mo{YpROy6KvP zFcfFavGNg!M-khNrV&n=wV%?_-R@>$*L{cngXUE+>bin}^QA*7ULVaTb5ikQh3%}V zp`_Bceoq7H$3Xi>mi^;%JI_-4#}a0qQks#UVU0=ULTMtXjFmTYNdMp(pJ4jBvr4YfeJa(c?LoEwi+w6vL&F}iq}3s+V-)? zAS#n!mi?Mn>dxYtzr~GArGCxNsQ&D6&z~Wxy4T%S#4r+Oir8(wgB+GJCJeH3(6|DH z>VRCuvXt?KKE`@(b>99pg{TqEnzb~A{$jTpK!q77l^YwHQFdF`lq?oL1&y+*Mf5Bb zC|Wf~puq@dEJjElOJ&0Z1)?N2_*;0xYQ`ZITia4v_^u*WJT+euT#o_nB_kY^xY8HcAz;^rjAxDuYX8^AI~RmwUrf- z7}?u*L-U(dcv!W|l`|ZDv7%U1E&x9Fa2i*qARJ$4DJs`$rQxQjTsLTyi$_xB;x{VS z4garHuHv7hauuhmT%MH5CBv0k+nKR{isMR{hV_V6X=Q z`qnV?tz(Og8Eo?_I()%|Nq)J7<|8g>$4g!+ktl4-W$tAXdYOd4Q|8Qp!7Q7;I*I5Izb={cTd%#u^CAfl0y`)fV!E_Q=JHg z2l5wniocV?NAeeiiZz*5s2=8rxB7ggPOU|6Mx9b?7}Tjcfgg3MTCz0cisn>tcBG59 z`lif&qA#r#?aLV-Us0+Pl@cY1C{aTz#)pSgObTC6F*Q7>A`(8oVph1kVpRAX#7L#c z5?@kd@-%EQhp@k>0f!wxqe@YfMv0EZGF3zXQUdAVto=eTR3ZLECW)HV$cY?Lk0jF= z@n6EB=a(zN^3+Iozr|fG^~f`Oi5CVK?<%?xjJ%C<oal2p`Ote%<8 zeRx8_+~yNiLRRz9@)TtfAuId)!mRhHRz%z?X{zLE^JlQ6q;k~!5X95!kl5(NZrnZ4 zlLL;H;&iZPL!Wey=Xt|qlxyjc)j@^(=5#}sdNIdF!>Gaq67$K zUG}dQ@4k#2xdi4&ui?q78aFIw|IW(nZGmy?Dtm1Uj$3)5(XB9G3@S7Nd4cR9dHcNC z&TzhSkvBWKXK!FZW%jzt(pQ4UdYWN7sN;J!(6mKMeX0yECQ34FGv`8wB>LX+;q@z?jr)QV=EcuZg z?U)E)(o5Vl^Y~=<*ox1{e}mLfG!nl^y2vR71{#iIz^Ohnjz5gG?7~bNG+u!Vx){+J z<^=w5l)PZcsr;yS3hwOnr~Rx` z(l21+#)>xI)4xf#TjehfUpYM-yylt-<0oAio{(0_ug?5cT5TIQo_gk~t=>;R^Ym8l zR(q}MOKUU*@3hGi!V?Z^G6iqz?{*bd`H_>ZnJ_id4#ZaZw%_gI8#OsDm=L~b!mL#B zF=vkP&k9eNGGo%zDW{(|a%vcgPP}sZjNy?9kqP4mxO$IwSv4G@e94b3pG5eKai^bt zo=uG_r;M90Ir+(MOZq37c*eMjiqlWGdh^iv)6hs36;xckXDJMVLkEql9CNXMM9?db zkz)pWFY%2T;T`GM-Pr2;1wZ0@)li?mYRsUa7mXY-v@&C3tMXF+4}BjT96U5t{NVDH z!HfKd`Y!Mt?z^-?^513azy$B zX;pqu<%q+6AK_Ou_%96(vbv{r`|@=}5;Ykvt-nkChx;z&M-3f3I1Rv7@agXtrG0K) zzkDA!!tWh2W~iO%pz_vtyOD#w55L5JiGR$+!Cz<$TYVS$Ugixlh`bjM(NMJdF6|%g zyZSctqO{_z;SW|-`F%mgzUoEQK&$$PT{7YVoA8RdZRjiT1-uve23HQf%py{&@&e!C zzDs#EKQ12W9eIfwWv$A~cg9b87asH-KijHQ@z(fB`C%i54)c!~8T9Kx+^W3vJ#*`l zi$?nGLE7qj<;5eYdra^m_{GR}=+CSl9K0aad2Pp^v@ft7YW@tW^m|9N&T+|bUS^nyi{Se!?|KlW=6lxy7@3k4iFft3OV2U3TT9@ZhP_libeg24(hk()|kkFZEUiePeuz5sVq(XU<$aQdjX~$`A5hG{|3B>Gx4&(A3D}@vbRT!>(UX z2)m|FxHd9jM%Z=DglncwpY6IT5(-TKyfiBRs-%tlFFCapNl!0nE&qR2+9rQ#oBXA1 z^7m_#zh9gD{o3R|t4;p1+T=g0P5!gnKP)}}PkY}2-&S$vJF?@%aUASC zOl%V1017oBrt%};goIkQY@|g=ys|?KnAox<$7*Ctm1N@3uoxV=F^ak=Wm~pnyP;(% z+oju-vLz7OI^N&|kiMVDY%wMCbps@h`JroeM!RZ+@_ zE>U8<9z&Ul1OiHU!0q>IaLJ(PX)2-;00{Sne8C7T8}demLW3Z(6os*8Tf|FM2mcX1 zs*66~=IP_NMMC5z)1u$z9rP&8gT3xxc*u{gz6ZGt47dk9k^#y;Q*=6~f?w2?9>p;j z@rFV}!ALsR#*i=KRT_u<@OGoDM1iNz9*zDw_-%@W{0i07UR6yZbNp=szb#%g48cqt-`YGx7OrDMSLw95Y=hAs#hs! zCM|Vp6>f~L0c##8!hn|4r{pg^Q&Rs>81kr;MUtCaYjg4^>7^rOrB}m;C1~+BG#fKR zmRufQsK}aCir+g3p5R$ogi6ZKt)DJ?QeNt-iA+hG5?f_5rBaeNg=$bn${(~yIq45w?H`h^lhj}Cc#DRqDrzuP$CK%+r--+7<)&YqJ083{n!4I=YbDQ*YzwCR zp4VrM)oJBUbvRj{PO~-@<-G~?A_3tXf__a_`n+f~)+F)i*)bR#iYRTq&4X^gTG^(1 zhV<{O_)~eFNS~Hp7C%(=LGtMMlla+kOZvBLG>md2%S$po8zsR3_m?JnbJHy}a&S6Y zVAm$QqZM|ASE^p6a;w&Vu)odaxV72Ug{#f6ex1<`k_k{%{>4g7g#|=Uj_L^Io$$Gp zMXNYPkx$XjtmqWIDHJO?=KkYc4|SmbEQHMIGMv+F__^wwUs2N@G#B%0R9OZw;0U*V*U_*3zp z1wS|c#zZ;zPw&rU>7Pk?jrddXp9McR|Hec)_)qUY<>udrKNbI3@N@HTOq7HFx}2Rv zO^K2EH{wsle-`}Q{2LSH;D5z=@^8eSivKM5x%oFH%EABj=gGeje=7d7;OFMwm?#JT zH=HN`M*OMx&w`(ue`BH?{MVl+|3>_&_|Jl$n}1`X9Q?05PyUVgQ}Le#KR5rzL^=4c zo^AuIws%JSYywPypDuu=uA^IRdz^vEv<6wtFTL%{+#qDbpGqDheTjd5@)(I^Fp%U= zJATy-sx!n>7jJrP(`f`4uNh48OU zKW+XEiE{Ceu1V%uZ?*l=#-EP>nbPMHKwJOom_njV0;u%0ZJo9P%@ltj{A=k?n}0*1 z9QO(W%f5G`>eQBU(1}O8Z`6%+!5}882+K(bXEs-hm ztNSSO(-N5?zZD-vep(_^~QH`K=|B3Uw2>lba^aKZU$iDb!-^G8ird&o!is~45CcBE`rufXe;OXpvszSjPLt5;yWpP4VV>cgEkMg4R3UB@#3XS1S>YM7|iYS(<+eR z5VmZT)(Wk73c znG;ATeg42!Ejw7xF%Y!e1br#`X$e9qKbi5<_|eFRWtTbR3q`^i@=v3u%9jm2so!h}Ny)`c`}&)2#`=)&&-UQ)RuU?(TZzlYXz~IL_0)2g%5^Qqm7YHtM=@$rA zx%3MJwfhZdk$%V-*y;^|Be~~bQ?c_$- zLzX%Xr|N@^o&iyETTn)uLRe$uRhDkO-Jr2ldCiEgUo3;1#M)3J;f;aN7H_BvTN0+) zgP`M&bLJ0(HOr!O{A7rS0|*w9aUyS3G+S%a$HIyy(?2VdrA9f(?{T?*lH4{HO8UfbwrMD5RtSnF&d7z2P4YW zS1VUcfxC9dAMpkKK5r<=b2j-hYqW@E!`~3ZG72x3lNRC$3m_M+&$bOsP0ej>lqqc@ z!AOa38q!FauD?jPbRpcy0Y6nb+~Wsan6_cv-c6!Ese}oo@Z-CYOFe^D>uy zL35Q$zn~fE8};i)>zcIB+WLz4Gd5W2j-bE*-~W^*!lr7&`r2y4`r4bSYicaQzU`rH z?Ex(BTt@yNSk=Vq zl27$ob7y^t&IN|Q_Cgr%~_E2ws8MW$LZq&>6JQ~1sX zvEJVoRwAJxFPu+n?~M8D_cOFb0zvAoCRd0X$|H}L+ZMFj4g_;#?_}-6>kE#rwNYCA z!@Dj^gK9Z3q?cWr6b1CRrT$P~Z*_-IS33fHkB01Q>(!-ckHC*;RJ@+`Vyj2xQjf0g zAR)k?bm??_;v(ez6k3D`%vg1k(>u61(yw1LmnoiJ7}aE|-wgZ^eaJ`UC?q;0l~it| zyvar>bd5T$Q0`cIm8IT4d}m5OX7jbzDx89_VRm}jHZwa(LwdgM`g|BNq)+bRnVvLh z`k-zqwzv#NxQMwFAwANNzuGm-njHAHV6W7^TDNkk5j>6jxc-5vmY|IE$f{Y$8S%xg z-z>%RKb;*a(N`KDwCF<9Qh@)SlY2%ohzqX$6#Lot%y*7wmndJ)AE}f zKXBWuP21swy5H4K+cnV(lwA%&(nzNlNi^<2hS+G8+-U7Z@{rJn9(!U!4&f9xx|sdg ztH$?HNnB;CoA%cYVaEu%1&HQ5sJun!@zM`jd>px~mNP|RCEU+9!}WMMZrDA5aTK{X zy7|P5ZxAB}pC_5z5e`u-i32MQC&Q(f6qhb0GTiF(`;{JVZvbO(Vyaj4#K0}Kju^#E z>i6c5yN5{fAyqgzU}y&cUpR!upQvJ|BwBI=sT!cJI#&s1UfeX{LV}>N786%6^XqY3Nri4QJQ zuVx#R%I`ysNb2du{!;Cp%%uD+zCmBOf4$#B zN=SJjY7T>f1AS2Na`HH>5w`jw{RT~Q#1tjLzo=t~L9RO59hxEoWVJq$y?A0q*MXL0 zG%JBk)%p#5%c}Jo_^PV)8~D`vOp~9E<)nUi_f72X$~E3I^yhd2KA@C+D?@)y5Y!9^ zGso8@2Yi|1Qv*h+KVDm@nQJ?Bo2vC24wqHyHyo;ko3^pJVTLFbIpvWf_lHy1qRAT^U&JXk?W2x~yT6(VC zR!n2|Zd3V&;DSqibeqND@p}cTI{N0Lg(QCN_kSvRK0hmTuFpV4fGII|3w25)_g!Ae z553$hVotA{zkbUSJ;Bq<#2eZgyP5|*ZC<~(7YAH`aGx7z7^qostqD4WX+$F*Sj*3i zkS|AC#LGaZRn;?K zjbL|s&k(lA^Eu!t@CUtHm9#V(^NaN`DWNimj|yA!*2btWqZX)gNrD75E31?c zkm*nuOMQpZHxS{sH62P&z3K5q_#rNsT$AHn8KbdTia&HQ_{LkYFId>?Lb*(NT#CM+ zNV=g~2}4(xH-tkV)I(l2tdnnPS~fV7y(P7O#tR9zohChv6;ke_de*Q;IItmd&0fJ% zeTUjzw$a3yI-&>+%E=KO!6|UNh=S_nRmq`Dm{$el+QSNpheuQm{8>jG{+FAVF7kJj z2lWIW+SZ8^c~V3+RqGD~SysJrnYIO;ioQyipP43lq00HBudc2>FZ`OC8XZ0z$&{4t ziXzs5z0@jCc$`u{wY9Z6dYfE^_gyai`>v_h`--O2N=r(t?%NV}<4iE^#Z1FQ5?dgmwcOeOAw`qp2qBnou4I#^FVDP@3ip zBdk3k9^kK;eS@Y|BI6-;B+wi1rwB_0_Fxp(>h9fwagy(DuO%(s=eZT5WVGbeHbN$!2c$ehy%8Az zex+&zf^V&Ra0uOWI`Al&NHrFqPoI3kCmc{#LoyQ$eh*?qA7KdHDa?o(w6N5ptX{L` zCgO&=QC0FrYM;*sV^kSLQk-_gmwI5J7eR;D>$#4Q#QICV+yr{pm|u1z`FRRhAd>O$ z81UKZtf{ro2}g9wt$ry9m%=?1>8}b5E^l>K0Wobl1?efg*4|;QTw%RNxmrmE*k)UY zB7rJe*Oruq^5giG*8@3IJm$Z1vXq<;qUyvE7P$6~<|erarqN5?Hc{Y6r^$nwq)k%w zg}y&ZDL#B})MyVQhkUPOhejO}c31TsmQ^e6Tyux;faOyI&D-XQ3EPKE&pk%D73S~b zV{p5x=0o!H;nE9EXgsz47SfZfqT6bu($r^lTxh8Opm1>_ndSN$8Yzj0Z|e8f9oR;E7Rg97g=Z&pewH^a=OfP^krmj`pXs39wj@yI{FaCzLAy{ z>yGHsaFafsR`L0~qE>}`NggCpp;Tgeezel}eDV|c)6LJ-R#(5Gs*08f4^ved=v$6n zES+wsnPh_8K%mKF>e%Y$-;Mlg@iMV(^goc+9{;EJ2O0BW>P>?`r?QjnmyUlLoMYmH z)~HAD@^p)LNHdco%xs`HWr}op2R;0JMrm&YJ?f_16n_QzWHRi);E3JJ| ziHaJ)H|X&WC+mRZjty-skS=eeX{}8P3l*lxOVO&Z6i?Hb8rK5@xzda1X>*rOpZe*^ zNf@wc;7=E=VKZ6gjr{WdIE}qB+cz1l(lVx}3^mC!@k7yS@-%&s1JQAtYC$!~ql-=w zNlKHhAJN)%alT0;U3t+)qOkiw5W`wW%1eyBqcr<#DP&?NV}7I~>Q50rsrEyXQX?<0 z7#Q?rAezo%CVdbKq<@+`&&Z#MydVy<^CyTJIW+p0rYhey(1QU_m4Yf;^c!*4*JtQL zrua`w$xq$B0t9sP?euCVdm}Zk|AzVrT1lIAhDtnqM6OkgEMo@#GbPuFVYDAAytMpeRl{>I(9eXP zlfIrIGK5|l1O0S#9rg73M9+{~ic=Mkfqpvr6!gJRi$Acny+7o|@-RQDBfPLB_sP`X z)L}x-FfX*a9MbfU^LmkooR&{Fw2^-;x{k2w4+ejt^FAT8pbx{Q{8txqLB2~_X5cTG z-E{eb{OOLN%A+s;#I!^g)HCT53?v;PO|-OGE`fy84?m(Ws96gg_d8c;ts* zg%i}}M~-C3PZ!VmQAeg3`KkHn`O)Wx`N@-U8tU6_*U zs;<20ruu8tH+jo7F*S&(zFv*e)?FlFPnWZ$%|$P(yQ)*EQ-L*xSAacT?Q~9eT7p!l zK1GixS#q+hi%-G3h6ZUpOjw&^E;KDg13erx-Wu?U9DlaAU|GQ`SDV0vo{BC zSy1$pguiI$>2lR5H31PBQEH*JFNI-idw&{`Hw?cqe>g`+yE`5R?91mG>Te46It7nMadL{8^rx zhv((|xrP&^$tV6;tADK1KdwkUy0H9QeNu>)SY)jRQGvE$ojfg$Kvyb66QSxe7V7Zw zZjcu(oL&M>OEZH#Eq~KAS$cb=dFF?1FAe->^f#eiAw(wrbq3b(PWILFugCm<;cr^r zr}Q`QP7YLK@V6R+zt!mdtw!%}HF|%mIX{0h*u&^gMsaBWpI*gU7eT$HsXw)S5ELZd za3otFZR5^klC4lOhWoonrmOg}H0){?dR$$TtTx)5GFeAmA0)do)m`Yy@aY$|Db!$Q z#0UA@_-&!yF1)b0;e1{o>EAKwUMFF^@A*jS(f$+|T^uNye5)g5rN3$Y6`guD4V6ri z(?7`HQ~d|>54Dq|8ZYG^YK*d6BuV*)8Z%A*P|?*abOLng{6j_6SY3x*bDsWDL*#S& zM{fNZDmUmjO}}atCru&CiyAsrSxMsQ^q?sx$;LfP+0evilr>#GHA}&8R(Yi8x#dv} zmb9%(JgZ%k{ARJGCO)G)Tckn7qKpsqDwda+?D`Q3Ft&d;w_2UfWUHy4TOxwS`dt0o zi11@$?;yQD$LZ6!nb+$@ER7zrPe!McOPh~W`Q_u>^y!{-eua2qf(pFFXJu&;%bk*;daQCfaklB=pp=ijlO^qH2Qtb;Pp&xoFl zK4hWKrF6L*T^Xe?&^Mr~R8tm6<6lo-Q*(+m2KwM#%g)sF1w++cwkBIf0Sxqw=xG^b z=08Q>D1d>!;6H^vC4IqAO_vRmGMNlupl?KeRB`cb+wFG@1l2kh#}85zL-Z>KXWHS{<8-I$w7 zrOM!scwdXp@kl<2KTq{}@yC;^Ib@^1QcHj3dDCAx6@B%UHRs=R-t_TGTU7p8_-|HM zx@E8r9-`uU0L{VQSFzRzm}=& z)4~^Dp^E1G^_(|^D>5(T>Nl!4YuxuyqhsGjvFuE$=70aplPP<022t+WM{=o3H^>M zO(bn|#~Nd$+2vYKE2?-A%Ms5_sFM%VH6H6-*ybfuxeSYWz_P&}nNlEYp9jl8_zT(T z;jdfYuC(Ag)oQ6ywPTpiLS;>gPbwE^I{sxm-wNf!rYdV&8$Md6MbC_njVzE99Mk*2 z6z{}^T)(^us}}UHt%;E?-g^r1g~(On{c}b%tPh1!GUPFc_x}-vNRg@~1D>rme6L$P z57DyB4h)h1U;X<2K96U0w}fiGBVQHayCnRIgx`_yRSDw~ejwq($3?p3686aOZuvYS z;VucEknpI4uS)o@68=%ba><`XLZ^i5B>fhNXOYj3801mqB6!OWKf8_~ar#-hS%kX+ z!S^j}0OhuiIhl|3@bVjC+kjHZ22rB@_;(GZV3mVIem`#I4rcLI84IODxC@7|=M9TA zo0JevF7n}+kiMb8URsQeCDexBOvYw16Jw<;exuc!Q!`I}e#}U%J zj=t~6o}Bm2UjMgVpZDEI*xnz^{9aYhC%^S;?ek|Io%68)P5i{|)?2mD%ifuN|CXu~ z^PYE5`fEy0y?*L5Vjr$|tr`ZRBkZIFH7*+|{N~5m-GJjq zs}P9)BTLyHz|sv@vabV<++& z#uC;|;iVU`e!vya7PBzmNpCT`i^A6xv#kWXXR|$k%44(GI6W86Vv~Tss+q~&q34gy zWdBa^k{Rr_8G!M8b|=9d`K%vsWI;aLO3xtrFu}Qb>}i6(H?ac*Uo^2vzz3R5%svy( zzhJB%aQvr?Z2@dO1Q($2FEF+TaK-(MJp(urWNebcZ((d*Asd0(ST|rpJ<vNWb7XRnZnq!fKVG72UM1T9^j)FGlo+YMxZW+4KyR`<}ua|SO|D4 zAk@YB0ihPQhr;2MlYskX0Kb@xbfB2+0bCBBUw083InEdx0tEYP58xo+8-QS&)t7(| z!%y`Oqn%azsrEA3N3}~Pd+a}BI&XVu?Qr}O@G13g)Vr#0RllkpRsEf>zO;IJ@(EL# zo@{It>WxZfWjEsA%@W?o+SqNVxl-XS#BIdY!SQZHkHwlHo@m?%Jewg-gu7UitPL4z z$_TgAWLdt>Vq`~{8nvgWZ~qbyu0ZNSHN_bDK`9{lg#t)^(f~+)GXh9{LwhOlq({bzz;X2t~Og+c>8Z&`zQBvYrp3C z^2=wgyy$Vl@T}?#ij6y+K|k#{>BJY|{heFUV+w2ycY0_VCDauT4262Vop+%#=k5|= zong$7hrOYipuelOu4Y9|b$ypVusP5f==o${$lJBm-{0jP@LXTlDgFx7>+7xydU}Yn zg@tUP2Uq(nwyCHFMaax-YRs zrroUc>_w-FCyT}lgR{D4q5)}mz{G+OzrsA5%{R5OIcH~2&KfTW&gjl>&9jL3Vd&K~ z!^CEQ0n?m3Hpex~Vk*sNr9H*LIl!s7Viqf@t6(Ljg-lEL5zcQOTli2Z@Mp48PYEln zD`uq+6$ecfMXVw+n^l0<3h-J1UMp(KCQXayu*IIM+2Z!4Y;m2LEjB4^;o14)r9tGq zq?j%7%wtR1OW6|0yChV8_Tp0uCn?r+aS^+?eIdKJZa%yC>G@|%PhB()?z&C$X0my8 z3)#Hi76oT_7q*&a=CPTsJd3GhCM)sG2H%CO#5G6ia3(9NnHd!Fd>ryD)5+5S!wX#( zv!aJ)c5_-ac|l>5xv3TQmlJaiX7C6KF_%?}A3 zCwY5X;89ws8;hx|kd@)ZZW(l423?oA=8X$|K~K=ZLWC`J!G44XUnqkwl))FuYJgW> z1Ya(OFVBH5waOIlzej_UlE({ zlJceW+?v$$;+d@Yp~A_TvYm%$GonsZ89`jRv+ zFGRTky@ygIHyL*=m5Bu?6Z26fP&OV)l?lS(_FX!gEvUPcEihfoicb|yYRl+e(h=8Z z3CiL{D2sDZ7K>TMLnw<}{|li1`OyD7R{r$DQ}ZX`+g!#gA!B()8TS!QuJ1x_i;5~L z)0d)5FF~1Jj52*O10`OjiAUlgBhFdMP1uHTIG-p36|S(XL&X{3x@>RHGxZC}7Hg^eyfQE_(BWSR8wQuufYeEcG| z@M-vXvd%$yt3jQ^>jA1e<@4eq=;>nUsSJ8r$QJ)rXi3yaYR7XOS1Ehu9H3S(oq=$_yedD4cF zG+!GxT|Spx?ors~?U%F5>n>xL!?#k_LtfVs&;6{zw2ATBeX@95)ab%LP7&?71#B+# zHWy`YCj92Ve;<(s$bkPve>GqEpH+WzEn~0TshsFLnMlCB`LA@I=*N<33UCD%F*b^a zQ&;HwxAhXQQo^A}7z^W~bl2fhRZH~={mx3fQ<6--fu4$YO5(MOWNfzqPX>QzP*{rb zBCdFO9(w_B5dG{Om*%ku;KBury}cxlEdd;t_s0SK3o&NIoJj=mnlgc70sIuM`b+W< zhcRh6bcOp7z=IWxoy7fdz_&in*pkcg*xP{ahef{qfVX`Sbdhg2p!G|P9S6Q0@G1=A zJHXp=z;0aQ2=51cRNg-h_+xp03UI;S3Y;Z?^Bw~o@LvwN1sCxa0ra6Qp!*=;jK62> zVcZu3K8lON9|zp~gplz`zy)6u;Y$ENkLxMm>;Wu%QiPWR?#4wrd<5_eCLB5;%kKf5 z|0rowp*mUjSKPl&ucfM3Q%G#>{n|Di~$08Zd)NBBv=ubo6Yf%|=c zE8b-6gT;AlHQ-CQCSjLJz)$`}$Q}gz;!kl8oV|cIza@0r3iz|1!#|;iw*g-|1zSU| zNx<#D5NUS+{t6fA_AKCnUkd#!0el@7m6taGcfKv|cLUD*Ujn}zaHG8M27DhE;j@3m zuoV~G?*Y8>-^6_-;LUNyios7S;7hm~AdBrZV?Y0u(9hd|N6vuf3g{nj;vEcXaeo%@ zt$&B!fd4k&;@>d#B<{_CfA?F)%;5h?z!|?|>~Z8<4EWEuW+1N@01v#&*e--02K>|e zFeh|114)`1{Dr@6_FQR{c z5^0YE+7}A?t$;U`nb_di$&TFz{B!>0`TigOl%Km?gRYxr6#r$_b&i`|1xoZ9B|9!B5ee4Krw+f=mRdg zLWC=T6<3OI1@J#`5uFbJ<5!9MLbHk8xYWcv2)6-Va*c_XI|c9+OrGq59!>&2U=jDb z0Qc9Lm<9Zg1HN;;xc@z1;~EoN2p!r1V@=}zVZg6B#Qi?Np;mFf9q_V07krulOI?DW za=_Ox+Ol~?{Sqw zZyx}vMfl`uz+PNb7x@7n^@CTmgO39i4G5ns z1$5)0x^x_{c2MAK2YeS7g|mQ(U5AV4)B!FCn%Lu@vjngP7v)2*cSzN^bIN<#|Koj>n z0bj;NJe&l)0b?ObOJkxtaS_iu0N=nxJiG-sit#`x?soz1#YJgpjIjML;RnDkY|Ud9 zT$HvR@aMSR1WsXh9{VybqVqW5o=+lw)c=nI2Dap}cKFyZ;Lsq-8T7Ut@FXtc=PkgG zhmZ#0^?(sf&f7s}J75{+((93S3E(ernQ{LP;5WD89yt2}$A$%+-GIJrXsZz(1f0M{ z{G0@|+%4|w0Uwt4djS7K-hTl2%}=8~1AgJ|Jl2MbWGvj9$MPS`V^2Yr|6hLg(RV7J zH-TGctl&66?9cM!hxeRI;1R72vyUFGJpBxw)i<^Fu}*WLeJo-w-H4DSAA<2n_$H{Be7dDHWJ<^FcDfACsnh_Z2dw={QVT2=1Zyp~VF3rLjNzApW}ZD;uBF4Xs!v|Hpe1nQ}ctbTK6*)4tsPmQTEdpNjXRZl%G#?BGZw zG<75TP*MgosRw_qn`TqnC zRvjMNstWM@%UnlaZ9bQ1uKj^+%ww)};*XLjdlD(FHy*Y{kKa=Ud(bd3`UdpxeDGZ2 z^vPMsOX^^&AYp@p*&cjFOTwEZQ4;$sG;rowy+W%lN@=nhRKWdw*x4zyP8v{1ClfZb*p^E%4`D!XaGo*9njeD*_XHqj=uwWzcpLS z|K9^ks-PGuI9JZt>G$Bes^s^Gl&(b>6@RNhn{rDs<@Td0_IiPB=GZf}*lSYQkEqyJ z2<%nPbKojpi%tF~xGLGz2iMl?^e4r{UqRz{QJAG8k~YXOq2Bc~xe~}7DfCG|=!Cp9 zTJQ<(%LN^f(jF_j4*<5e<{u^cZxUj`rND^q9|cD@9xmB6SpY=o17Xw`WG=!>l&$$b z=dfhgH#o}N4LsIqZXlGsK(WW*?uoJuz+1Bd!ysf-vg2;Z0>b2E_mH|vz`^Ml`9qW^ zEw~N=@mJvOJisoq1LjghplYy>+007(DUMKJeL>i%0Tsa;s2dYy|C1N?xySKfkN(ge zJ)0<74powPaqz?oqkXK!692-SRMIa2d-OP$jgX*G4xTb&1V^fSPk;{uV8X`=1t=!4 z!(1u=hCT4Z$IWMfN>#(}C7glqMA?JiOXYbrXZMswfQ6jr_Y!4?G=Yg@l;q7s+4m?A zZMFrfSOxFm^`tX;+&;G5TuDub693|7c%?akB(|M>HZofS>NzC*ek=H}$DHO?$X;lV z+F+&VG5greXu+*;!P*mJpLqrt(SlYyA#J^L?1}DtDq2rqLZ6MbG{pOg5(#A0I_5Wb z*mg$DcjBfU&UVu+$TW88$GQlJij+*$kElc8a|u+c^cckBTTlN9InmQFo(8L^2HRtP zggAo&M+n9W7Ijka4)ad&_>_FyjmP*eXQ$NnZ%1(t=O~9_ov6@TQL)*_9yX5yQ7sb2 zx|zEU{6RP_)p_KBRTskpXZ;`Yz+IBunw1FSttZ&0=4j0WBpuWzD)ZYljBMhJ6m;F8 z5hu0@dQQp^N0iEaKbqvcK&IH zj-8haQ+j#r2Hcn3N>^V!%ys1_AB%13H*&S>HX~P;P0iJ7C~X>D?Iy0i{$84{-nk!nMqiDO zKqDIT&k_2kfo`YTF#e^vsPaVXOrH8xioKJ^z8Y^t?*VbqH}5HdCnNTsDfSbHO_a@l z0vW~%eu$9h8#YsLA)Lmx^R89#A!HjpWQU_uPt9IC5&!-N#K<0V1H90F-(l*~S-Y&8 ztan;FyEfg4-n;n8v4&rcHNFcpGz$lj$!C#CY;9ijjd(eTqv!gK?-2WQTMiLGXKgL) zgi*%G@G2H5N|fF8_o!Q`PwuBOlk>CJdu0d=)6eIH&%u4RSRvj5a8}wQ{{CDT5K>*GJ zkDW_AZKAtR8N-(Qu_B`e}s7M&r%rktG!K6VT}bo!Fn{#cv_9 z(SlP?a|LdLXP`TkC>wc>ZeEVRgZ7fALK3G;QjR2i)UVv3lILX%#mjFl$H;L5@@jC# z9Hq|a2~C#EW%@Ts%xGRLlo%V`2ZpTC#u>H0zV>MBZd0W4+GCN$*B*>qH2U7mp~Xi> zkHF~TXDYvV6e3WqZ|i+k$+2U z#x1v0UZM#n)TVLvu{9B{<9nQkX>%U(P)C;rvzdEtV(UIY{Iy?2SS zR=7q$`*Hz~UwbZ5@|`G2Zi_xjl0JAa`nqlGQ43sVJf45mj~lK$I{IS4&e7Efh#nmK zd>!EEsrty8(f0}?meKdhBbSf9S4oDeFKPbM*nxV)pSk+jC_$Q0DeGonW#g`v#L&M+kDQrhf5aNK z9bu!<4j?B+qn!lMIkCq6oQ(Ka^N3J80%25WuN!v_JHPD~phtjS0XzbD1?UrCvjAAo zOzC_AV78T>FwqL|kA8soOLvn6I?<6v^A+Ufs=<0^*QR9AnhAoIVSRAC8cYT{Vol{@Ht?APiG(Bio@1~dz^57nSM^`m{% zrlR)V`6`~##2hIlfNn^l>??murM?}#_~_h0P@#GS;}EBr_n8`;qVu`~4L?!XhG9Y3 z*HWoHn$(u8saw?47pwKk4v;_%hidbC+ejB8|9^j;dN`-h{yy-t;j2rYZ8uv=o}FbM zjpx~;FWGOLylWN-G=65T{q@s*V~hGm&FdI-c{j$3&JKz#WQn!4<%a{*da=VX7-nKa1c4^<3W=T-2UG?DWDd@TtnNU%r(E~NLuwMPMT=!>(F%4|PlvZ>R(jP))ohbV*W`kgsv)e){7e6bJ zT=anp`{?F!#=BSxsUHw4yAwQGWA+(|vTOGUv)9`nI1!l(f+0@usc&PJ4kc%onQI4~ z$h&__mD(ON=?~3KIhq?ZIlt_J+S`elxhs*-8N0bOQT9dNJ1pVNuRZoK9|Xl~{v=o| z**OS~C7U1*(V(sUET_NmwwlPK4==n4*gVCSXp0GyWvqw*(2M2XK%|S=>H}QXaAFfK=|E?sEf1m+rYfr%agO#}ZUCF&R za|C4v6E`$|j6YAv@PG0(6k7#e0#q&{4KvX!p#C~)Gds8m8>sxZCdxkGefnKuMgm^_ z`2QvN}Tp$TU&bf!eh81SBZ8$96t~ViCU@JUL@? z|Bi^o%1YrgyxaY9{4}in!1(ZXME1bt5Sfoi>;4A9L{;$v5#NdUCq(@3U_0x6lAPlI zLBy{{{I5j(FL`{qj2{#6OAvn@7y`x^c`W652&+;aL7B%r z)6L@~=&EwqMIKj(Jf6oBm*XH>HtT-j8I%WkCdpAT-8_PtJl;lS06D&kt}JYQtD481 z)OtpLd@Nr$*zq{4z_4cXYB*B5qIelXeft9p3Fs}57>b}qd>4ab8iySE)Hw)s|9&`Y z?av%zx7Uvjmlh0NJ33rguDU~mBZ^`+hW{OfV;!YCI~MNjD03WZtS33oT!{o14J|@~ z!q96HlOhW#vfuz_SkP&9L|?Lw-H!3#?uS$3n#TnTcqJBJ11{i&qlYaR+N9n$()&#Q zEt?jf-zz_&v~=t3y4|l66H|R(el@%2fh>` zzLB}nGk`C!)2C8H0ep@!+=K%yd))XwhWz-@(kpPtK>LO^zW@0`(rcOQ#9k#Yy9>KF zdjUJK7b?U8*tO}yo=ysDLud$hZiLaU?4@ig_7N_{o= zEC2qb#HG()2_%pFI;uk7$W^pfNl|XKt*^vpU&Oblclg=_eJ)l8gDUoAE8;-jZ16yg(y#v{8kloy@$yj_8=jls_W_iHEzE^7pg)^{6oQZ6;UmPMh{8|sk-O6MAg9m-?pW4r<3OD7ppg+mF$RHaI^rbIG(N~zDAAEY1v_x)<9oMo5WXu`~P`}X^ zTb1xo7@scI$U^zGyEZf@4`;x0i`Cht4RC~oly=|d{eh5)%uT)UWRz> z`5jcnlNs=d6hD~(6^pj2Blac~I*`xf?Q;+LBMJ^e_J%@3!3Yk(Kn2t@)Q3+$Dq(y` z4If~FPCP~87&3*YqOT7)eFOM@0M7Bt_RElJaLPnVS}L$quQHM?E0Id;ERaug-i1LO zLiMdEZL~Lb9ZK7P?j#Vdo(Tt99xrysMq~>`t&?bpL_7}Y!I!)@^D>Dl%KLGL2WN)( z`g|$B#|IZuR@Sy}Z7AhF7G&Z~5~4iF+daXH4^NwQc~OpSTYSMFWr!70qGB8r6{81V z6UUhb$&*XMf-(K+B+v&PMzSi^Xu7=k+_P8xs5METtF9+(fiMM1d9Xpyz8 zco?CoPSp0AT5Sqz3Jm!@gCE1Ekl|7hun2bx^DkNWdKJHK5X}(WGDtNV_suqF!-e|M zicJxa8Y!A2L6u?_~ z8el7HQ0DL^NQ0khU-(HijzMwA3>czrX4>*LP5qMzpVwH>?|=XPvuglzxRrcypLnr) z1pLz4zJr~7GUE??7IiXFR`3NHUmcHEEIyZ93y7Iq!o>ik^7Q9`pY)~&KSxvd558#5 zA1bu&F96z^rK?SJk2ONL6Wvr-=ts|D}F%&fvaxXxV z0>_O9hdz!;ffI#NFwy zVumYOA|@uP>sR4`Ys*Tt&Rvg=sd9r-W2vs@LFxyI6zaI5y%qJh(wpjLiDM=zH`-e0 zGn&*?T!X`=8i#!7U@b)}shiOlgdl6 zrd|`ai_TO+Sf<~9m2;%-%e%#E?fuk{FXU}QKgo$>Rb6gh*xMe!pp^Xrv9i;w#$w(< ze`4H5jFA3(C=hYCyV3pn;>_E(uE($h%`)4P=Lq!4uaASwr-r=Y2zFWLuN~lRYumPP z#5+Kr9Y((`ohFg{Eb_N`{qAke!`|K@I&q3VeB{RD#yv>U67qWK%sS$Lu*(Wu5kK`> zHw^k{tcEXZp&P>33lz?W{A#Cx_ZV2h(oIc3T_v2F~p2 zYU;v(wHJN;-Y%T7>A@H)Q_1@%!?2GBnM=CN%sy z^Xm|DE9Tw0@R$1DZRmZk$9SjY5@9>wr8&XOVY zD#!$S5k8|wqnQ?rcl;PnIWV^A!#D!_DmjjY)iDcOiK~t^;x7Xq6-e6zoB@oG+`!+a z8KYtUDQIfv4Hec7y1lF)m=qpBZrhl`bL!Lr|g?nN6>)9L){abl>7#J$uTJTYatA?%Mf2$d_ zx(p{m%|$xW3C;KDM}cs4a6opcfy_>JJ*PmYMZpR23$m+`)`@hR`Ph*(7KG%)*=A@1 z#g=PPA6AL5Yaqe-Yq62@x?a+!F)Gc}syd}7F^bN`b3ZeKXOXuDr}p)NOEKmpX*1b2 zmqi*mFCIusHc8os^h);7=VP==Hk;VMhY2OZ4eF|NDX+!;T$BLpZbmHmW*9o4*}9ai zXV0KjKOeyl?RhcCv_6493fg>t^2aQXH9Tg2Ecn>SV~;%c(`CV>gDs%Z+N^&Ygxi-I)@vHmz z0pEQmhte~BrszA9g|y^ICh`f_9OF8l(I&jZ9IZ>SPwo}@4X;{7yEd+Ojj_xyf;k=| z`4zv+an--fm~6YM?4k7m9wj+L+cEAu#{Gx5f4p^cSANq*iw2(mU@UjXyA6~%XX3fiJ5(n$T=+`I!j?D+NLO;RIrg%nc)C1zQR(eX=*x@h63yblQhT1;@ zSm*u&@{Ln?@&umOgRNh|7tZlYhL{8Y(YF=Q@)9{i!%G2ty8#rN;2NFH2WVZxqtbVEBo(EcUPnE?yY|rqn7Jr{C znq~txhwH;$hbAXoz;3BxnbR_h+hp!QoEYnMv59%c!^zryL|ucm5!M~Lh-A#(xF*aT z_+4@h@1hg5`NV4VjrFzdu4pqiMs7qgWK7s#%T@b@($Ei+2i=zME+ zR_a-mV~o^TN)`S`ZP_r|UWdtBlQD)l;s9)8>tL%ePEuR6z@6zD|8jj;WFAR1$Qqgs zJy!kqz+U={`}X?8w(`j5u);4!`BC#-s;yBQ?U-XXVPC9E>JVkUllEvU%bT)C*GE|s zIacGL)w%RddYldmqEH1I+8RaLFUc_<(ObLo_QvR-1u}rU*S0w~jSgb{g;haTVsvP* z20>4=J#?0_%-f=w>d|rcfnCm8wlBHKjF!7BTK4D80zFh~VaxE`m3%6y(In$bT-R$O z?kYY_{i@xeXH~{lXY{D=N@ZqS*(tf=z%Zds(@_83-~Dwr8g)>Y`Qkkq5u?fqv6*(u z(jAYlE9k7F z^K@RcNBlXqN37K!+Uk)1ieh|MIL_K1z~Vef$P<+1Zz`WVH{3f|pq`O^s*)!f4-p5r z!!R@_4Ac2%>1!=^3jBsRpIAl~7M{^$@7vn*RA99CX?K#s(~#M*#vP9vd2Jq;H?FLH z{>H~qtb4VjF6JrExCIXq7VP7G@zsv9E;ql-L->2)gO%#sbYxG+|d< Date: Mon, 20 Jun 2022 15:15:57 +0800 Subject: [PATCH 12/12] left right fix --- app_httpd.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app_httpd.cpp b/app_httpd.cpp index 53e2d11..c839122 100644 --- a/app_httpd.cpp +++ b/app_httpd.cpp @@ -462,7 +462,7 @@ static esp_err_t cmd_handler(httpd_req_t *req) { //ESP_LOGI(TAG, "PTZ: %i\t%i\t", ptz_x, ptz_y); //ESP_LOGI(TAG, "Up"); } - else if (!strcmp(value, "left" )) { + else if (!strcmp(value, "right" )) { if (ptz_x <= 180) { ptz_x += Servo_Step; // servo2.write(ptz_x); @@ -470,7 +470,7 @@ static esp_err_t cmd_handler(httpd_req_t *req) { //ESP_LOGI(TAG, "PTZ: %i\t%i\t", ptz_x, ptz_y); //ESP_LOGI(TAG, "Left"); } - else if (!strcmp(value, "right" )) { + else if (!strcmp(value, "left" )) { if (ptz_x >= 0) { ptz_x -= Servo_Step; // servo2.write(ptz_x);