tobozo / ESP32-targz

🗜️ An Arduino library to unpack/uncompress tar, gz, and tar.gz files on ESP32 and ESP8266
Other
118 stars 15 forks source link

E][Updater.cpp:155] begin(): too large 1183629312 > 1310720 -- halts ESP32 #18

Closed scubachristopher closed 3 years ago

scubachristopher commented 3 years ago

Hi,

What's interesting is I've had no issues with this code for some time. Download was successful, file size was 673935. Once I download the new firmware to SPIFFS, I reboot the ESP and immediate try to flash. When I call:

gzUpdater(SPIFFS, "/dlfirmware.bin.gz");

I get:

[E][Updater.cpp:155] begin(): too large 1183629312 > 1310720

Fine. Something went wrong. But it literally halts the ESP. Am moving my wdt start above this code -- perhaps that will solve the halt but reproducing this might be difficult.

I am not familiar with how the update process works (begin, end), but is there a size check that can gracefully catch this scenario in gzUpdater?

Any perspective on this would be appreciated. Halting on FW update will brick the device, as I cannot remove the fw from SPIFFS until after gzUpdater returns, which it did not...

Am on 0.2.1. Upgrade?

tobozo commented 3 years ago

hey Christopher,

It sounds like tarGzStream.output_size has an invalid value and has the Update process fail.

Obviously tarGzGetError() is useless after a system halt, so re-enabling the logging could help identify a possible error during decompression, could be a consequence of a nearly full or damaged SPIFFS partition, or a bug depending on the version of the library you're using.

I'll need to know what version of the library produced this error though, there's a possibility it will behave differently with the latests release (0.3.0) or with the master branch (0.3.1).

The gzUpdater example sketch was recently updated, it was tested both on M5Stack and LoLinD32 pro successfully.

Can you try and see if this one works with the master branch ? This is the expected output:

image

scubachristopher commented 3 years ago

I think I understand the issue, but do not know how to solve. I decided to show what files exist and I found part of my firmware still on the file system. Fine, put in a delete in case there was an error to cleanup. But now:

===== File system info =====
Total space:      1378241 bytes
Total space used: 494219 bytes

Total space free: 884022 bytes

FILE: /httpcert.pem.der Size: 1011
FILE: /index.lrigz Size: 52446
FILE: /client.crt.der Size: 894
FILE: /httpcert.pem Size: 1424
FILE: /client.key.der Size: 1191
FILE: /ca.crt.der Size: 1011
FILE: /ca.crt Size: 1424
FILE: /client.crt Size: 1265
FILE: /client.key Size: 1675

My code:


  unsigned int totalBytes = SPIFFS.totalBytes();
  unsigned int usedBytes = SPIFFS.usedBytes();

  Serial.println("\n\n===== File system info =====");
  Serial.printf("Total space:      %d bytes\n", totalBytes);
  Serial.printf("Total space used: %d bytes\n\n", usedBytes);
  Serial.printf("Total space free: %d bytes\n\n", totalBytes - usedBytes);

  File root = SPIFFS.open("/");
  file = root.openNextFile();

  while (file) {
      Serial.printf("FILE: %s Size: %d\n", file.name(), file.size());
      close(file);
      file = root.openNextFile();
  }
  close(root);

So, that file list just doesn't add up to 494,219 bytes. I don't see any other files. My concern now is there are some temporary files that are hidden or the decompression somehow mangled the SPIFFS file system.

I am hesitant to touch the SPIFFS partition now, because I need to understand where the space has gone. So I can't run the example at this time.

This is a standard 4MB ESP32 Dev kit, with a standard SPIFFS partition definition.

Can you provide any insight as to temp files created during the decompression?

tobozo commented 3 years ago

With gzUpdater there is no temporary file, the decompressed bytes are passed directly to Update::writeStream and written on the OTA partition.

SPIFFS has a few annoying fragmentation bugs though, most of them are triggered by writing incomplete files, overwriting or deleting, all solved by formatting.

tarGzExpander can produce exactly those symptoms when using an intermediate file that nearly fills the partition.

Here's how to use tarGzExpander without the intermediate file:

tarGzExpander(SPIFFS, "/certsuite.tar.gz", SPIFFS, "/", nullptr );

This won't prevent files from being overwritten but may avoid being close to a nearly full partition, so it's more a mitigation than a solution.

LittleFS has a better error detection and is much more resilitent, I wish this was the official partition scheme instead of SPIFFS :-)

scubachristopher commented 3 years ago

First, thanks for the attention to this issue. I do download the firmware to a fixed file name, process then delete the file. Rinse and repeat.

If SPIFFS has some fundamental issue writing to a filename that is constant, then deleting and potentially ending up with internal fragmentation, that's a show stopper for me because I preload the certs / keys for secure connections in the SPIFFS partition. The downloaded firmware sits along side that content (about 60k). If at some point the available space < gzipped firmware, I cannot simply reformat.

I'll have to look into this deeper, perhaps multiple SPIFFS partitions, one for static data and one for downloads that can be reformatted.

Since this intersects with your work, I'll inform where I end up with this so others can understand at least where I land on this.

Many thanks again

tobozo commented 3 years ago

if that may be of interest, I'm currently researching how to do http-stream => gzuncompress => update-partition with no intermediary file at all, but the simple example sketch is already eating 67% of program storage space so it's not really lightweight, and I still have to make it work ^^

scubachristopher commented 3 years ago

Dude. That would be killer!

tobozo commented 3 years ago

Ive added a gzStreamUpdater example to the latest release but it makes a huge sketch, I wonder how this will affect projects with existing WiFiClient and http objects, maybe not that much.

scubachristopher commented 3 years ago

Wow -- awesome. Let me give it a shot!

scubachristopher commented 3 years ago

So here are the results of the test of this new capability with my rig. As per your sketch, once my http connection is established, I just injected the gzStreamUpdater call ahead of what I normally do:

        ... // setup done above this code

        file = SPIFFS.open("/dlfirmware.bin.gz", FILE_WRITE);
        httpCode = http.GET();

        if (httpCode > 0) {

// NEW
          if (!gzStreamUpdater(http.getStreamPtr(), UPDATE_SIZE_UNKNOWN) ) {
            Serial.printf("gzHTTPUpdater failed with return code #%d", tarGzGetError());
          }
// END OF NEW

          // get length of document (is -1 when Server sends no Content-Length header)
          len = fw_size = http.getSize();
          Serial.printf("HTTP.get successful for %s, size of file reported as %d\n", buff, fw_size);
          // create buffer for read
          uint8_t buff[1024 * 16] = { 0 };

          // get tcp stream
          WiFiClient *stream = http.getStreamPtr();

          // read all data from server
          while (http.connected() && (len > 0 || len == -1)) {
              esp_task_wdt_reset();
              size_t streamSize = stream->available();
              if (streamSize) {
                  int c = stream->readBytes(buff, ((streamSize > sizeof(buff)) ? sizeof(buff) : streamSize));
                  Serial.printf("Read %5d bytes from stream, %6d remaining\r", c, len);
                  file.write(buff, c);
                  if (len > 0) {
                      len -= c;
                  }
              }
          }
          file.close();
        }
        else {
          Serial.printf("HTTP.get UNSUCCESSFUL for %s\n", buff);
        }
        ...

Running with -DCORE_DEBUG_LEVEL=5, there's a per-character log line emitted from line 431. I strongly suggest you remove this, else it's a per-character read log line and life is too short:

log_v("read 1 byte: 0x%02x", out[0] );

In order to really see what's going on, I commented that out. Much better log output:

[V][ssl_client.cpp:56] start_ssl_client(): Free internal heap before TLS 196380
[V][ssl_client.cpp:58] start_ssl_client(): Starting socket
[V][ssl_client.cpp:93] start_ssl_client(): Seeding the random number generator
[V][ssl_client.cpp:102] start_ssl_client(): Setting up the SSL/TLS structure...
[V][ssl_client.cpp:115] start_ssl_client(): Loading CA cert
[V][ssl_client.cpp:180] start_ssl_client(): Setting hostname for TLS session...
[V][ssl_client.cpp:195] start_ssl_client(): Performing the SSL/TLS handshake...
[V][ssl_client.cpp:216] start_ssl_client(): Verifying peer X.509 certificate...
[V][ssl_client.cpp:225] start_ssl_client(): Certificate verified.
[V][ssl_client.cpp:240] start_ssl_client(): Free internal heap after TLS 157736
[D][HTTPClient.cpp:1025] connect():  connected to test.lagunaresearch.com:443
[V][ssl_client.cpp:279] send_ssl_data(): Writing HTTP request...
[V][HTTPClient.cpp:1123] handleHeaderResponse(): RX: 'HTTP/1.1 200 OK'
[V][HTTPClient.cpp:1123] handleHeaderResponse(): RX: 'server: ecstatic-3.3.2'
[V][HTTPClient.cpp:1123] handleHeaderResponse(): RX: 'cache-control: max-age=3600'
[V][HTTPClient.cpp:1123] handleHeaderResponse(): RX: 'last-modified: Thu, 14 Jan 2021 21:41:43 GMT'
[V][HTTPClient.cpp:1123] handleHeaderResponse(): RX: 'etag: W/"256508-673933-2021-01-14T21:41:43.126Z"'
[V][HTTPClient.cpp:1123] handleHeaderResponse(): RX: 'content-length: 673933'
[V][HTTPClient.cpp:1123] handleHeaderResponse(): RX: 'content-type: application/gzip; charset=utf-8'
[V][HTTPClient.cpp:1123] handleHeaderResponse(): RX: 'Date: Fri, 15 Jan 2021 15:42:35 GMT'
[V][HTTPClient.cpp:1123] handleHeaderResponse(): RX: 'Connection: keep-alive'
[V][HTTPClient.cpp:1123] handleHeaderResponse(): RX: ''
[D][HTTPClient.cpp:1158] handleHeaderResponse(): code: 200
[D][HTTPClient.cpp:1161] handleHeaderResponse(): size: 673933
[D][Updater.cpp:136] begin(): OTA Partition: app1
[D][ESP32-targz-lib.cpp:447] gzUncompress(): gzUncompress( isupdate = true, stream_to_tar = false, use_dict = true, show_progress = false)
[D][ESP32-targz-lib.cpp:464] gzUncompress(): [INFO] gzUncompress tradeoff: faster, used 36864 bytes of ram (heap after alloc: 119128)
[D][ESP32-targz-lib.cpp:501] gzUncompress(): [INFO] output_buffer_size=4096 blockmod=8
Progress:
[0%[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=0)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=4096)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=8192)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=12288)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=16384)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=20480)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=24576)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=28672)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=32768)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=36864)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=40960)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=45056)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=49152)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=53248)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=57344)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=61440)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=65536)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=69632)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=73728)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=77824)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=81920)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=86016)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=90112)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=94208)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=98304)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=102400)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=106496)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=110592)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=114688)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=118784)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=122880)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=126976)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=131072)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=135168)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=139264)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=143360)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=147456)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=151552)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=155648)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=159744)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=163840)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=167936)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=172032)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=176128)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=180224)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=184320)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=188416)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=192512)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=196608)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=200704)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=204800)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=208896)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=212992)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=217088)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=221184)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=225280)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=229376)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=233472)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=237568)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=241664)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=245760)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=249856)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=253952)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=258048)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=262144)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=266240)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=270336)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=274432)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=278528)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=282624)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=286720)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[E][ESP32-targz-lib.cpp:428] readSourceByte(): readSourceByte read error
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=290816)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=294912)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=299008)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=303104)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=307200)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=311296)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=315392)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=319488)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=323584)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=327680)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=331776)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=335872)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=339968)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=344064)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=348160)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=352256)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=356352)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=360448)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=364544)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=368640)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=372736)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=376832)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=380928)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[E][ESP32-targz-lib.cpp:428] readSourceByte(): readSourceByte read error
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=385024)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=389120)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=393216)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=397312)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=401408)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=405504)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=409600)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=413696)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=417792)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=421888)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=425984)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=430080)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=434176)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=438272)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=442368)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=446464)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=450560)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=454656)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=458752)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[E][ESP32-targz-lib.cpp:428] readSourceByte(): readSourceByte read error
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=462848)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=466944)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=471040)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=475136)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=479232)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=483328)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=487424)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=491520)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=495616)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=499712)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=503808)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=507904)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[E][ESP32-targz-lib.cpp:428] readSourceByte(): readSourceByte read error
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=512000)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=516096)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=520192)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=524288)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=528384)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=532480)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=536576)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=540672)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=544768)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=548864)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=552960)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=557056)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=561152)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=565248)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=569344)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=573440)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=577536)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=581632)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=585728)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=589824)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=593920)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=598016)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=602112)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[E][ESP32-targz-lib.cpp:428] readSourceByte(): readSourceByte read error
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=606208)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=610304)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=614400)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=618496)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=622592)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=626688)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=630784)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=634880)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=638976)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=643072)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=647168)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=651264)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=655360)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=659456)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=663552)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=667648)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=671744)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=675840)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=679936)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=684032)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=688128)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=692224)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=696320)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=700416)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=704512)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=708608)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=712704)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=716800)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=720896)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=724992)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=729088)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=733184)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=737280)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=741376)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=745472)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=749568)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=753664)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=757760)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=761856)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=765952)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=770048)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=774144)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=778240)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=782336)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=786432)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=790528)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=794624)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[E][ESP32-targz-lib.cpp:428] readSourceByte(): readSourceByte read error
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=798720)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=802816)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=806912)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=811008)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=815104)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=819200)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=823296)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=827392)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=831488)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=835584)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=839680)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=843776)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=847872)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=851968)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=856064)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=860160)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=864256)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=868352)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[E][ESP32-targz-lib.cpp:428] readSourceByte(): readSourceByte read error
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=872448)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=876544)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=880640)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=884736)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=888832)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=892928)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=897024)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=901120)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=905216)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=909312)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=913408)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[E][ESP32-targz-lib.cpp:428] readSourceByte(): readSourceByte read error
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=917504)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=921600)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=925696)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=929792)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=933888)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=937984)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=942080)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=946176)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=950272)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=954368)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=958464)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=962560)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=966656)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=970752)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=974848)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=978944)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[E][ESP32-targz-lib.cpp:428] readSourceByte(): readSourceByte read error
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=983040)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=987136)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=991232)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=995328)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=999424)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1003520)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1007616)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1011712)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1015808)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1019904)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1024000)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1028096)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1032192)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1036288)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1040384)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1044480)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1048576)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1052672)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1056768)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1060864)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[E][ESP32-targz-lib.cpp:428] readSourceByte(): readSourceByte read error
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1064960)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1069056)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1073152)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1077248)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1081344)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1085440)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1089536)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1093632)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1097728)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1101824)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1105920)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1110016)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1114112)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1118208)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[E][ESP32-targz-lib.cpp:428] readSourceByte(): readSourceByte read error
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1122304)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1126400)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1130496)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1134592)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1138688)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1142784)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1146880)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1150976)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1155072)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1159168)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1163264)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1167360)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[E][ESP32-targz-lib.cpp:428] readSourceByte(): readSourceByte read error
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1171456)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1175552)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1179648)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1183744)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1187840)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:529] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1191936)
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 4096 bytes
[W][ESP32-targz-lib.cpp:547] gzUncompress(): [GZ WARNING] uzlib_uncompress_chksum return code=-4, premature end at position 3644 while 0 bytes left
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 3644 bytes
[V][ESP32-targz-lib.cpp:200] gzUpdateWriteCallback(): Wrote 452 bytes
[D][ESP32-targz-lib.cpp:572] gzUncompress(): decompressed 1199676 bytes
[E][ESP32-targz-lib.cpp:690] gzStreamUpdater(): Update Error Occurred. Error #: 9
gzHTTPUpdater failed with return code #-11
HTTP.get successful for https://test.lagunaresearch.com/chris_cloud.bin.gz, size of file reported as 673933
Read     4 bytes from stream, 673933 remaining

So a few observations: 1). The size of the decompressed file is:

pi@test:~/lri_firmware$ gzip -l chris_cloud.bin.gz
         compressed        uncompressed  ratio uncompressed_name
             673933             1199680  43.8% chris_cloud.bin

which means it's not reading the entire file. Once the fail happens, it falls through to my original loop which is able to read an additional 4 bytes from the stream, and that would be the complete read.

2). I see these occasionally during the download:

[E][ESP32-targz-lib.cpp:428] readSourceByte(): readSourceByte read error

3). The number of read errors does NOT correspond to lost bytes.

4). Multiple runs always end with the same 4 bytes not read from the stream.

If this works, it's a FAR superior method of pulling firmware, so I'm excited to get through this.

Finally, my firmware is just that -- there is no 4-byte header for size or anything abnormal about staging this on the server. Just a gzip --keep --best --force on an ubuntu server.

tobozo commented 3 years ago

thanks for this detailed report

I'm not sure where those 4 missing bytes come from, and I can't reproduce this error so I'll assume it's a consequence of the previous readSourceByte errors.

Because the http.getSize() may return -1 depending on the remote webserver (Content-length is optional), the gzip size has been made irrelevant to the stream decompression process.

The message gzUncompress(): decompressed 1199676 bytes is reporting a wrong value anyway, it doesn't take the zerofills into account (fixing that now).

Since I'm in the middle of researching tarGzStreamExpander( Stream *stream, fs::FS &destFS, const char* destFolder ) that fix has landed on the tarGzStreamExpander branch.

scubachristopher commented 3 years ago

Some good news! This consistently works:

// consume and return a byte from the source stream into the argument 'out'.
// returns 0 on success, or -1 on error.
static unsigned int readSourceByte(struct TINF_DATA *data, unsigned char *out)
{
  //if( !tarGzStream.gz->available() ) return -1;
  if (tarGzStream.gz->readBytes( out, 1 ) != 1) {
    log_e("readSourceByte read error, available is %d.  attempting one-time retry", tarGzStream.gz->available());
    if (tarGzStream.gz->readBytes( out, 1 ) != 1) {
    log_e("readSourceByte read error, available is %d.  failed at retry", tarGzStream.gz->available());
      return -1;
    }
  } else {
    //log_v("read 1 byte: 0x%02x", out[0] );
  }
  return 0;
}

So, aside from killing the log_v read 1 byte (I beg you), just add a one-time retry. Also, if this routine does ever error out, I'd abort the attempt.

Now when it fails, I only see the initial fail fingerprint in the log:

...
[V][ESP32-targz-lib.cpp:537] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=188416)
[V][ESP32-targz-lib.cpp:202] gzUpdateWriteCallback(): Wrote 4096 bytes
[E][ESP32-targz-lib.cpp:430] readSourceByte(): readSourceByte read error, available is 0.  attempting one-time retry
[V][ESP32-targz-lib.cpp:537] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=192512)
...
[V][ESP32-targz-lib.cpp:202] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:537] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1167360)
[V][ESP32-targz-lib.cpp:202] gzUpdateWriteCallback(): Wrote 4096 bytes
[E][ESP32-targz-lib.cpp:430] readSourceByte(): readSourceByte read error, available is 0.  attempting one-time retry
[V][ESP32-targz-lib.cpp:537] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1171456)
[V][ESP32-targz-lib.cpp:202] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:537] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1175552)
[V][ESP32-targz-lib.cpp:202] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:537] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1179648)
[V][ESP32-targz-lib.cpp:202] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:537] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1183744)
[V][ESP32-targz-lib.cpp:202] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:537] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1187840)
[V][ESP32-targz-lib.cpp:202] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:537] gzUncompress(): [INFO] Buffer full, now writing 4096 bytes (total=1191936)
[V][ESP32-targz-lib.cpp:202] gzUpdateWriteCallback(): Wrote 4096 bytes
[V][ESP32-targz-lib.cpp:202] gzUpdateWriteCallback(): Wrote 3648 bytes
[V][ESP32-targz-lib.cpp:202] gzUpdateWriteCallback(): Wrote 448 bytes
[D][ESP32-targz-lib.cpp:580] gzUncompress(): decompressed 1199680 bytes
[D][ESP32-targz-lib.cpp:687] gzStreamUpdater(): OTA done!
[D][ESP32-targz-lib.cpp:690] gzStreamUpdater(): Update finished !
[D][WiFiGeneric.cpp:337] _eventCallback(): Event: 3 - STA_STOP
[D][WiFiGeneric.cpp:337] _eventCallback(): Event: 15 - AP_STACONNECTED
[D][WiFiGeneric.cpp:337] _eventCallback(): Event: 15 - AP_STACONNECTED
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:8896
load:0x40080400,len:5828
entry 0x400806ac

It's unclear why there is a read fail and the available() is zero, but next attempt it always succeeds. I've put a delay(1) in that routine before and tested, but it was exactly the same behavior. What might make sense is to give it 5 attempts with a delay(1) after the fail, then flag the entire process should bail if it can't read. Again, it always succeeds the second attempt for me.

Also please make the first:

log_e("readSourceByte read error, available is %d.  attempting one-time retry", tarGzStream.gz->available());

a log_d.

So yay! This should work, and I believe it's a superior approach to firmware updates on the esp32 (gzipped fw, download to a 4k buffer, decomp to the ota partition). Awesome!

tobozo commented 3 years ago

ooh thanks for finding that out, I didn't know it was even possible to recover from a single read error ;)

I've added the changes you suggested to my current workspace and will commit them soon with many other changes : I'm namespacing TAR and GZ underlying libraries and moving from functions to object+methods.

Those are breaking changes and I'll probably have to increment the library major version number and add the alpha flag, update documentation+examples, and also add an extra development iteration for ESP8266 support before I publish the next release, so it'll stay on a separate branch until then.

tobozo commented 3 years ago

hey @scubachristopher I want to close this thread as it's getting very long, can you confirm the original issue is now fixed for you?

The new release of esp32-targz includes your suggested fix. Additionnally you may be interested by the new tarGzStreamUpdater function inspired by the esp32OTA thread.

scubachristopher commented 3 years ago

heya @tobozo: 1) Confirmed GZUnpacker->gzStreamUpdater(http.getStreamPtr(), UPDATE_SIZE_UNKNOWN) works perfectly. 2) What advantage would tarGzStreamUpdater provide over gzStreamUpdater?

Thanks (and will close)

tobozo commented 3 years ago

thanks!

Actually tarGzStreamUpdater is only useful when both spiffs and app partitions need to be flashed.

It's slightly faster since it saves one extra HTTP connection, maybe more reliable as some situations won't let the ESP make two HTTPS connections in a row. Also contents of the .tar.gz file can eventually have interesting files such as esp32FOTA's firmware.json, a throwable encryption key, a script to update NVS, a second binary for the other OTA partition, and so on.

closing this issue as solved