From 2d78875bd6903f365ee6e654bde398b8738aea56 Mon Sep 17 00:00:00 2001 From: tom_win Date: Wed, 6 May 2020 12:46:52 +0200 Subject: [PATCH] verzia 0.3 uprava struktury komunikacnej kniznice, doplnenie casovacov ktore meraju cas prenosu suboru, oprava chyby pri tcp/ip kanale, uprava vypoctu kontrolneho suctu, crc32, zlib --- .../api-ms-win-crt-runtime-l1-1-0.dll | Bin externe_kniznice/32bit_dll/msvcr100.dll | Bin 0 -> 774808 bytes externe_kniznice/32bit_dll/rs232.dll | Bin 0 -> 57442 bytes .../32bit_dll}/vcruntime140.dll | Bin .../32bit_dll}/wolfssl.dll | Bin externe_kniznice/32bit_dll/zlib1.dll | Bin 0 -> 76088 bytes .../api-ms-win-crt-runtime-l1-1-0.dll | Bin externe_kniznice/64bit_dll/msvcr100.dll | Bin 0 -> 830616 bytes externe_kniznice/64bit_dll/rs232.dll | Bin 0 -> 57442 bytes .../64bit_dll}/vcruntime140.dll | Bin externe_kniznice/64bit_dll/wolfssl.dll | Bin 0 -> 862720 bytes externe_kniznice/64bit_dll/zlib1.dll | Bin 0 -> 88888 bytes externe_kniznice/teuniz_rs232/LICENSE | 677 ++++++ externe_kniznice/teuniz_rs232/Makefile | 42 + externe_kniznice/teuniz_rs232/README.md | 6 + externe_kniznice/teuniz_rs232/demo_rx.c | 72 + externe_kniznice/teuniz_rs232/demo_tx.c | 66 + externe_kniznice/teuniz_rs232/doc.txt | 235 ++ externe_kniznice/teuniz_rs232/gpl.txt | 677 ++++++ .../teuniz_rs232/howto_compile.txt | 28 + .../teuniz_rs232}/rs232.c | 13 +- .../teuniz_rs232}/rs232.h | 0 .../wolfssl/callbacks.h | 0 .../wolfssl/certs_test.h | 0 {wolfssl => externe_kniznice}/wolfssl/crl.h | 0 .../wolfssl/error-ssl.h | 0 .../wolfssl/include.am | 0 .../wolfssl/internal.h | 0 {wolfssl => externe_kniznice}/wolfssl/ocsp.h | 0 .../wolfssl/openssl/aes.h | 0 .../wolfssl/openssl/asn1.h | 0 .../wolfssl/openssl/bio.h | 0 .../wolfssl/openssl/bn.h | 0 .../wolfssl/openssl/buffer.h | 0 .../wolfssl/openssl/conf.h | 0 .../wolfssl/openssl/crypto.h | 0 .../wolfssl/openssl/des.h | 0 .../wolfssl/openssl/dh.h | 0 .../wolfssl/openssl/dsa.h | 0 .../wolfssl/openssl/ec.h | 0 .../wolfssl/openssl/ec25519.h | 0 .../wolfssl/openssl/ecdh.h | 0 .../wolfssl/openssl/ecdsa.h | 0 .../wolfssl/openssl/ed25519.h | 0 .../wolfssl/openssl/engine.h | 0 .../wolfssl/openssl/err.h | 0 .../wolfssl/openssl/evp.h | 0 .../wolfssl/openssl/hmac.h | 0 .../wolfssl/openssl/include.am | 0 .../wolfssl/openssl/lhash.h | 0 .../wolfssl/openssl/md4.h | 0 .../wolfssl/openssl/md5.h | 0 .../wolfssl/openssl/objects.h | 0 .../wolfssl/openssl/ocsp.h | 0 .../wolfssl/openssl/opensslconf.h | 0 .../wolfssl/openssl/opensslv.h | 0 .../wolfssl/openssl/ossl_typ.h | 0 .../wolfssl/openssl/pem.h | 0 .../wolfssl/openssl/pkcs12.h | 0 .../wolfssl/openssl/pkcs7.h | 0 .../wolfssl/openssl/rand.h | 0 .../wolfssl/openssl/rc4.h | 0 .../wolfssl/openssl/ripemd.h | 0 .../wolfssl/openssl/rsa.h | 0 .../wolfssl/openssl/sha.h | 0 .../wolfssl/openssl/ssl.h | 0 .../wolfssl/openssl/ssl23.h | 0 .../wolfssl/openssl/stack.h | 0 .../wolfssl/openssl/tls1.h | 0 .../wolfssl/openssl/ui.h | 0 .../wolfssl/openssl/x509.h | 0 .../wolfssl/openssl/x509_vfy.h | 0 .../wolfssl/openssl/x509v3.h | 0 .../wolfssl/options.h | 0 .../wolfssl/options.h.in | 0 .../wolfssl/sniffer.h | 0 .../wolfssl/sniffer_error.h | 0 .../wolfssl/sniffer_error.rc | 0 {wolfssl => externe_kniznice}/wolfssl/ssl.h | 0 {wolfssl => externe_kniznice}/wolfssl/test.h | 0 .../wolfssl/user_settings.h | 0 .../wolfssl/version.h | 0 .../wolfssl/version.h.in | 0 .../wolfssl/wolfcrypt/aes.h | 0 .../wolfssl/wolfcrypt/arc4.h | 0 .../wolfssl/wolfcrypt/asn.h | 0 .../wolfssl/wolfcrypt/asn_public.h | 0 .../wolfssl/wolfcrypt/async.h | 0 .../wolfssl/wolfcrypt/blake2-impl.h | 0 .../wolfssl/wolfcrypt/blake2-int.h | 0 .../wolfssl/wolfcrypt/blake2.h | 0 .../wolfssl/wolfcrypt/camellia.h | 0 .../wolfssl/wolfcrypt/chacha.h | 0 .../wolfssl/wolfcrypt/chacha20_poly1305.h | 0 .../wolfssl/wolfcrypt/cmac.h | 0 .../wolfssl/wolfcrypt/coding.h | 0 .../wolfssl/wolfcrypt/compress.h | 0 .../wolfssl/wolfcrypt/cpuid.h | 0 .../wolfssl/wolfcrypt/cryptocb.h | 0 .../wolfssl/wolfcrypt/curve25519.h | 0 .../wolfssl/wolfcrypt/des3.h | 0 .../wolfssl/wolfcrypt/dh.h | 0 .../wolfssl/wolfcrypt/dsa.h | 0 .../wolfssl/wolfcrypt/ecc.h | 0 .../wolfssl/wolfcrypt/ed25519.h | 0 .../wolfssl/wolfcrypt/error-crypt.h | 0 .../wolfssl/wolfcrypt/fe_operations.h | 0 .../wolfssl/wolfcrypt/fips.h | 0 .../wolfssl/wolfcrypt/fips_test.h | 0 .../wolfssl/wolfcrypt/ge_operations.h | 0 .../wolfssl/wolfcrypt/hash.h | 0 .../wolfssl/wolfcrypt/hc128.h | 0 .../wolfssl/wolfcrypt/hmac.h | 0 .../wolfssl/wolfcrypt/idea.h | 0 .../wolfssl/wolfcrypt/include.am | 0 .../wolfssl/wolfcrypt/integer.h | 0 .../wolfssl/wolfcrypt/logging.h | 0 .../wolfssl/wolfcrypt/md2.h | 0 .../wolfssl/wolfcrypt/md4.h | 0 .../wolfssl/wolfcrypt/md5.h | 0 .../wolfssl/wolfcrypt/mem_track.h | 0 .../wolfssl/wolfcrypt/memory.h | 0 .../wolfssl/wolfcrypt/misc.h | 0 .../wolfssl/wolfcrypt/mpi_class.h | 0 .../wolfssl/wolfcrypt/mpi_superclass.h | 0 .../wolfssl/wolfcrypt/pkcs11.h | 0 .../wolfssl/wolfcrypt/pkcs12.h | 0 .../wolfssl/wolfcrypt/pkcs7.h | 0 .../wolfssl/wolfcrypt/poly1305.h | 0 .../wolfcrypt/port/Espressif/esp32-crypt.h | 0 .../port/Renesas/renesas-tsip-crypt.h | 0 .../wolfcrypt/port/af_alg/afalg_hash.h | 0 .../wolfssl/wolfcrypt/port/af_alg/wc_afalg.h | 0 .../wolfssl/wolfcrypt/port/arm/cryptoCell.h | 0 .../wolfssl/wolfcrypt/port/atmel/atmel.h | 0 .../wolfssl/wolfcrypt/port/caam/caam_driver.h | 0 .../wolfssl/wolfcrypt/port/caam/wolfcaam.h | 0 .../wolfcrypt/port/caam/wolfcaam_sha.h | 0 .../wolfcrypt/port/cavium/cavium_nitrox.h | 0 .../port/cavium/cavium_octeon_sync.h | 0 .../wolfcrypt/port/devcrypto/wc_devcrypto.h | 0 .../wolfcrypt/port/intel/quickassist.h | 0 .../wolfcrypt/port/intel/quickassist_mem.h | 0 .../wolfcrypt/port/intel/quickassist_sync.h | 0 .../wolfssl/wolfcrypt/port/nrf51.h | 0 .../wolfssl/wolfcrypt/port/nxp/ksdk_port.h | 0 .../wolfcrypt/port/pic32/pic32mz-crypt.h | 0 .../wolfssl/wolfcrypt/port/st/stm32.h | 0 .../wolfssl/wolfcrypt/port/st/stsafe.h | 0 .../wolfssl/wolfcrypt/port/ti/ti-ccm.h | 0 .../wolfssl/wolfcrypt/port/ti/ti-hash.h | 0 .../wolfssl/wolfcrypt/port/xilinx/xil-sha3.h | 0 .../wolfssl/wolfcrypt/pwdbased.h | 0 .../wolfssl/wolfcrypt/rabbit.h | 0 .../wolfssl/wolfcrypt/random.h | 0 .../wolfssl/wolfcrypt/ripemd.h | 0 .../wolfssl/wolfcrypt/rsa.h | 0 .../wolfssl/wolfcrypt/selftest.h | 0 .../wolfssl/wolfcrypt/settings.h | 0 .../wolfssl/wolfcrypt/sha.h | 0 .../wolfssl/wolfcrypt/sha256.h | 0 .../wolfssl/wolfcrypt/sha3.h | 0 .../wolfssl/wolfcrypt/sha512.h | 0 .../wolfssl/wolfcrypt/signature.h | 0 .../wolfssl/wolfcrypt/sp.h | 0 .../wolfssl/wolfcrypt/sp_int.h | 0 .../wolfssl/wolfcrypt/srp.h | 0 .../wolfssl/wolfcrypt/tfm.h | 0 .../wolfssl/wolfcrypt/types.h | 0 .../wolfssl/wolfcrypt/visibility.h | 0 .../wolfssl/wolfcrypt/wc_encrypt.h | 0 .../wolfssl/wolfcrypt/wc_pkcs11.h | 0 .../wolfssl/wolfcrypt/wc_port.h | 0 .../wolfssl/wolfcrypt/wolfevent.h | 0 .../wolfssl/wolfcrypt/wolfmath.h | 0 .../wolfssl/wolfio.h | 0 externe_kniznice/zlib/.gitignore | 26 + externe_kniznice/zlib/CMakeLists.txt | 249 ++ externe_kniznice/zlib/ChangeLog | 1515 ++++++++++++ externe_kniznice/zlib/FAQ | 368 +++ externe_kniznice/zlib/INDEX | 68 + externe_kniznice/zlib/Makefile | 5 + externe_kniznice/zlib/Makefile.in | 410 ++++ externe_kniznice/zlib/README | 115 + externe_kniznice/zlib/adler32.c | 186 ++ externe_kniznice/zlib/amiga/Makefile.pup | 69 + externe_kniznice/zlib/amiga/Makefile.sas | 68 + externe_kniznice/zlib/compress.c | 86 + externe_kniznice/zlib/configure | 921 +++++++ externe_kniznice/zlib/contrib/README.contrib | 78 + .../zlib/contrib/ada/buffer_demo.adb | 106 + externe_kniznice/zlib/contrib/ada/mtest.adb | 156 ++ externe_kniznice/zlib/contrib/ada/read.adb | 156 ++ externe_kniznice/zlib/contrib/ada/readme.txt | 65 + externe_kniznice/zlib/contrib/ada/test.adb | 463 ++++ .../zlib/contrib/ada/zlib-streams.adb | 225 ++ .../zlib/contrib/ada/zlib-streams.ads | 114 + .../zlib/contrib/ada/zlib-thin.adb | 141 ++ .../zlib/contrib/ada/zlib-thin.ads | 450 ++++ externe_kniznice/zlib/contrib/ada/zlib.adb | 701 ++++++ externe_kniznice/zlib/contrib/ada/zlib.ads | 328 +++ externe_kniznice/zlib/contrib/ada/zlib.gpr | 20 + .../zlib/contrib/amd64/amd64-match.S | 452 ++++ .../zlib/contrib/asm686/README.686 | 51 + externe_kniznice/zlib/contrib/asm686/match.S | 357 +++ externe_kniznice/zlib/contrib/blast/Makefile | 8 + externe_kniznice/zlib/contrib/blast/README | 4 + externe_kniznice/zlib/contrib/blast/blast.c | 466 ++++ externe_kniznice/zlib/contrib/blast/blast.h | 83 + externe_kniznice/zlib/contrib/blast/test.pk | Bin 0 -> 8 bytes externe_kniznice/zlib/contrib/blast/test.txt | 1 + externe_kniznice/zlib/contrib/delphi/ZLib.pas | 557 +++++ .../zlib/contrib/delphi/ZLibConst.pas | 11 + .../zlib/contrib/delphi/readme.txt | 76 + .../zlib/contrib/delphi/zlibd32.mak | 99 + .../zlib/contrib/dotzlib/DotZLib.build | 33 + .../zlib/contrib/dotzlib/DotZLib.chm | Bin 0 -> 72726 bytes .../zlib/contrib/dotzlib/DotZLib.sln | 21 + .../contrib/dotzlib/DotZLib/AssemblyInfo.cs | 58 + .../contrib/dotzlib/DotZLib/ChecksumImpl.cs | 202 ++ .../contrib/dotzlib/DotZLib/CircularBuffer.cs | 83 + .../zlib/contrib/dotzlib/DotZLib/CodecBase.cs | 198 ++ .../zlib/contrib/dotzlib/DotZLib/Deflater.cs | 106 + .../zlib/contrib/dotzlib/DotZLib/DotZLib.cs | 288 +++ .../contrib/dotzlib/DotZLib/DotZLib.csproj | 141 ++ .../contrib/dotzlib/DotZLib/GZipStream.cs | 301 +++ .../zlib/contrib/dotzlib/DotZLib/Inflater.cs | 105 + .../zlib/contrib/dotzlib/DotZLib/UnitTests.cs | 274 +++ .../zlib/contrib/dotzlib/LICENSE_1_0.txt | 23 + .../zlib/contrib/dotzlib/readme.txt | 58 + .../zlib/contrib/gcc_gvmat64/gvmat64.S | 574 +++++ externe_kniznice/zlib/contrib/infback9/README | 1 + .../zlib/contrib/infback9/infback9.c | 615 +++++ .../zlib/contrib/infback9/infback9.h | 37 + .../zlib/contrib/infback9/inffix9.h | 107 + .../zlib/contrib/infback9/inflate9.h | 47 + .../zlib/contrib/infback9/inftree9.c | 324 +++ .../zlib/contrib/infback9/inftree9.h | 61 + .../zlib/contrib/inflate86/inffas86.c | 1157 +++++++++ .../zlib/contrib/inflate86/inffast.S | 1368 +++++++++++ .../zlib/contrib/iostream/test.cpp | 24 + .../zlib/contrib/iostream/zfstream.cpp | 329 +++ .../zlib/contrib/iostream/zfstream.h | 128 + .../zlib/contrib/iostream2/zstream.h | 307 +++ .../zlib/contrib/iostream2/zstream_test.cpp | 25 + .../zlib/contrib/iostream3/README | 35 + externe_kniznice/zlib/contrib/iostream3/TODO | 17 + .../zlib/contrib/iostream3/test.cc | 50 + .../zlib/contrib/iostream3/zfstream.cc | 479 ++++ .../zlib/contrib/iostream3/zfstream.h | 466 ++++ .../zlib/contrib/masmx64/bld_ml64.bat | 2 + .../zlib/contrib/masmx64/gvmat64.asm | 553 +++++ .../zlib/contrib/masmx64/inffas8664.c | 186 ++ .../zlib/contrib/masmx64/inffasx64.asm | 396 +++ .../zlib/contrib/masmx64/readme.txt | 31 + .../zlib/contrib/masmx86/bld_ml32.bat | 2 + .../zlib/contrib/masmx86/inffas32.asm | 1080 ++++++++ .../zlib/contrib/masmx86/match686.asm | 479 ++++ .../zlib/contrib/masmx86/readme.txt | 27 + .../zlib/contrib/minizip/Makefile | 25 + .../zlib/contrib/minizip/Makefile.am | 45 + .../contrib/minizip/MiniZip64_Changes.txt | 6 + .../zlib/contrib/minizip/MiniZip64_info.txt | 74 + .../zlib/contrib/minizip/configure.ac | 32 + externe_kniznice/zlib/contrib/minizip/crypt.h | 131 + externe_kniznice/zlib/contrib/minizip/ioapi.c | 247 ++ externe_kniznice/zlib/contrib/minizip/ioapi.h | 208 ++ .../zlib/contrib/minizip/iowin32.c | 462 ++++ .../zlib/contrib/minizip/iowin32.h | 28 + .../zlib/contrib/minizip/make_vms.com | 25 + .../zlib/contrib/minizip/miniunz.c | 660 +++++ .../zlib/contrib/minizip/miniunzip.1 | 63 + .../zlib/contrib/minizip/minizip.1 | 46 + .../zlib/contrib/minizip/minizip.c | 520 ++++ .../zlib/contrib/minizip/minizip.pc.in | 12 + .../zlib/contrib/minizip/mztools.c | 291 +++ .../zlib/contrib/minizip/mztools.h | 37 + externe_kniznice/zlib/contrib/minizip/unzip.c | 2125 ++++++++++++++++ externe_kniznice/zlib/contrib/minizip/unzip.h | 437 ++++ externe_kniznice/zlib/contrib/minizip/zip.c | 2007 +++++++++++++++ externe_kniznice/zlib/contrib/minizip/zip.h | 362 +++ .../zlib/contrib/pascal/example.pas | 599 +++++ .../zlib/contrib/pascal/readme.txt | 76 + .../zlib/contrib/pascal/zlibd32.mak | 99 + .../zlib/contrib/pascal/zlibpas.pas | 276 +++ externe_kniznice/zlib/contrib/puff/Makefile | 42 + externe_kniznice/zlib/contrib/puff/README | 63 + externe_kniznice/zlib/contrib/puff/puff.c | 840 +++++++ externe_kniznice/zlib/contrib/puff/puff.h | 35 + externe_kniznice/zlib/contrib/puff/pufftest.c | 165 ++ externe_kniznice/zlib/contrib/puff/zeros.raw | Bin 0 -> 2517 bytes .../zlib/contrib/testzlib/testzlib.c | 275 +++ .../zlib/contrib/testzlib/testzlib.txt | 10 + externe_kniznice/zlib/contrib/untgz/Makefile | 14 + .../zlib/contrib/untgz/Makefile.msc | 17 + externe_kniznice/zlib/contrib/untgz/untgz.c | 674 +++++ .../zlib/contrib/vstudio/readme.txt | 78 + .../zlib/contrib/vstudio/vc10/miniunz.vcxproj | 310 +++ .../vstudio/vc10/miniunz.vcxproj.filters | 22 + .../zlib/contrib/vstudio/vc10/minizip.vcxproj | 307 +++ .../vstudio/vc10/minizip.vcxproj.filters | 22 + .../contrib/vstudio/vc10/testzlib.vcxproj | 420 ++++ .../vstudio/vc10/testzlib.vcxproj.filters | 58 + .../contrib/vstudio/vc10/testzlibdll.vcxproj | 310 +++ .../vstudio/vc10/testzlibdll.vcxproj.filters | 22 + .../zlib/contrib/vstudio/vc10/zlib.rc | 32 + .../contrib/vstudio/vc10/zlibstat.vcxproj | 473 ++++ .../vstudio/vc10/zlibstat.vcxproj.filters | 77 + .../zlib/contrib/vstudio/vc10/zlibvc.def | 153 ++ .../zlib/contrib/vstudio/vc10/zlibvc.sln | 135 + .../zlib/contrib/vstudio/vc10/zlibvc.vcxproj | 657 +++++ .../vstudio/vc10/zlibvc.vcxproj.filters | 118 + .../zlib/contrib/vstudio/vc11/miniunz.vcxproj | 314 +++ .../zlib/contrib/vstudio/vc11/minizip.vcxproj | 311 +++ .../contrib/vstudio/vc11/testzlib.vcxproj | 426 ++++ .../contrib/vstudio/vc11/testzlibdll.vcxproj | 314 +++ .../zlib/contrib/vstudio/vc11/zlib.rc | 32 + .../contrib/vstudio/vc11/zlibstat.vcxproj | 464 ++++ .../zlib/contrib/vstudio/vc11/zlibvc.def | 153 ++ .../zlib/contrib/vstudio/vc11/zlibvc.sln | 117 + .../zlib/contrib/vstudio/vc11/zlibvc.vcxproj | 688 ++++++ .../zlib/contrib/vstudio/vc12/miniunz.vcxproj | 316 +++ .../zlib/contrib/vstudio/vc12/minizip.vcxproj | 313 +++ .../contrib/vstudio/vc12/testzlib.vcxproj | 430 ++++ .../contrib/vstudio/vc12/testzlibdll.vcxproj | 316 +++ .../zlib/contrib/vstudio/vc12/zlib.rc | 32 + .../contrib/vstudio/vc12/zlibstat.vcxproj | 467 ++++ .../zlib/contrib/vstudio/vc12/zlibvc.def | 153 ++ .../zlib/contrib/vstudio/vc12/zlibvc.sln | 119 + .../zlib/contrib/vstudio/vc12/zlibvc.vcxproj | 692 ++++++ .../zlib/contrib/vstudio/vc14/miniunz.vcxproj | 316 +++ .../zlib/contrib/vstudio/vc14/minizip.vcxproj | 313 +++ .../contrib/vstudio/vc14/testzlib.vcxproj | 430 ++++ .../contrib/vstudio/vc14/testzlibdll.vcxproj | 316 +++ .../zlib/contrib/vstudio/vc14/zlib.rc | 32 + .../contrib/vstudio/vc14/zlibstat.vcxproj | 467 ++++ .../zlib/contrib/vstudio/vc14/zlibvc.def | 153 ++ .../zlib/contrib/vstudio/vc14/zlibvc.sln | 119 + .../zlib/contrib/vstudio/vc14/zlibvc.vcxproj | 692 ++++++ .../zlib/contrib/vstudio/vc9/miniunz.vcproj | 565 +++++ .../zlib/contrib/vstudio/vc9/minizip.vcproj | 562 +++++ .../zlib/contrib/vstudio/vc9/testzlib.vcproj | 852 +++++++ .../contrib/vstudio/vc9/testzlibdll.vcproj | 565 +++++ .../zlib/contrib/vstudio/vc9/zlib.rc | 32 + .../zlib/contrib/vstudio/vc9/zlibstat.vcproj | 835 +++++++ .../zlib/contrib/vstudio/vc9/zlibvc.def | 153 ++ .../zlib/contrib/vstudio/vc9/zlibvc.sln | 144 ++ .../zlib/contrib/vstudio/vc9/zlibvc.vcproj | 1156 +++++++++ externe_kniznice/zlib/crc32.c | 442 ++++ externe_kniznice/zlib/crc32.h | 441 ++++ externe_kniznice/zlib/deflate.c | 2163 +++++++++++++++++ externe_kniznice/zlib/deflate.h | 349 +++ externe_kniznice/zlib/doc/algorithm.txt | 209 ++ externe_kniznice/zlib/doc/rfc1950.txt | 619 +++++ externe_kniznice/zlib/doc/rfc1951.txt | 955 ++++++++ externe_kniznice/zlib/doc/rfc1952.txt | 675 +++++ externe_kniznice/zlib/doc/txtvsbin.txt | 107 + .../zlib/examples/README.examples | 49 + externe_kniznice/zlib/examples/enough.c | 572 +++++ externe_kniznice/zlib/examples/fitblk.c | 233 ++ externe_kniznice/zlib/examples/gun.c | 702 ++++++ externe_kniznice/zlib/examples/gzappend.c | 504 ++++ externe_kniznice/zlib/examples/gzjoin.c | 449 ++++ externe_kniznice/zlib/examples/gzlog.c | 1059 ++++++++ externe_kniznice/zlib/examples/gzlog.h | 91 + externe_kniznice/zlib/examples/zlib_how.html | 545 +++++ externe_kniznice/zlib/examples/zpipe.c | 205 ++ externe_kniznice/zlib/examples/zran.c | 409 ++++ externe_kniznice/zlib/gzclose.c | 25 + externe_kniznice/zlib/gzguts.h | 218 ++ externe_kniznice/zlib/gzlib.c | 637 +++++ externe_kniznice/zlib/gzread.c | 654 +++++ externe_kniznice/zlib/gzwrite.c | 665 +++++ externe_kniznice/zlib/infback.c | 640 +++++ externe_kniznice/zlib/inffast.c | 323 +++ externe_kniznice/zlib/inffast.h | 11 + externe_kniznice/zlib/inffixed.h | 94 + externe_kniznice/zlib/inflate.c | 1561 ++++++++++++ externe_kniznice/zlib/inflate.h | 125 + externe_kniznice/zlib/inftrees.c | 304 +++ externe_kniznice/zlib/inftrees.h | 62 + externe_kniznice/zlib/make_vms.com | 867 +++++++ externe_kniznice/zlib/msdos/Makefile.bor | 115 + externe_kniznice/zlib/msdos/Makefile.dj2 | 104 + externe_kniznice/zlib/msdos/Makefile.emx | 69 + externe_kniznice/zlib/msdos/Makefile.msc | 112 + externe_kniznice/zlib/msdos/Makefile.tc | 100 + externe_kniznice/zlib/nintendods/Makefile | 126 + externe_kniznice/zlib/nintendods/README | 5 + externe_kniznice/zlib/old/Makefile.emx | 69 + externe_kniznice/zlib/old/Makefile.riscos | 151 ++ externe_kniznice/zlib/old/README | 3 + externe_kniznice/zlib/old/descrip.mms | 48 + externe_kniznice/zlib/old/os2/Makefile.os2 | 136 ++ externe_kniznice/zlib/old/os2/zlib.def | 51 + externe_kniznice/zlib/old/visual-basic.txt | 160 ++ externe_kniznice/zlib/os400/README400 | 48 + externe_kniznice/zlib/os400/bndsrc | 119 + externe_kniznice/zlib/os400/make.sh | 366 +++ externe_kniznice/zlib/os400/zlib.inc | 527 ++++ externe_kniznice/zlib/qnx/package.qpg | 141 ++ externe_kniznice/zlib/test/example.c | 602 +++++ externe_kniznice/zlib/test/infcover.c | 671 +++++ externe_kniznice/zlib/test/minigzip.c | 651 +++++ externe_kniznice/zlib/treebuild.xml | 116 + externe_kniznice/zlib/trees.c | 1203 +++++++++ externe_kniznice/zlib/trees.h | 128 + externe_kniznice/zlib/uncompr.c | 93 + externe_kniznice/zlib/watcom/watcom_f.mak | 43 + externe_kniznice/zlib/watcom/watcom_l.mak | 43 + externe_kniznice/zlib/win32/DLL_FAQ.txt | 397 +++ externe_kniznice/zlib/win32/Makefile.bor | 110 + externe_kniznice/zlib/win32/Makefile.gcc | 182 ++ externe_kniznice/zlib/win32/Makefile.msc | 163 ++ externe_kniznice/zlib/win32/README-WIN32.txt | 103 + externe_kniznice/zlib/win32/VisualC.txt | 3 + externe_kniznice/zlib/win32/zlib.def | 94 + externe_kniznice/zlib/win32/zlib1.rc | 40 + externe_kniznice/zlib/zconf.h | 534 ++++ externe_kniznice/zlib/zconf.h.cmakein | 536 ++++ externe_kniznice/zlib/zconf.h.in | 534 ++++ externe_kniznice/zlib/zlib.3 | 149 ++ externe_kniznice/zlib/zlib.3.pdf | Bin 0 -> 19318 bytes externe_kniznice/zlib/zlib.h | 1912 +++++++++++++++ externe_kniznice/zlib/zlib.map | 94 + externe_kniznice/zlib/zlib.pc.cmakein | 13 + externe_kniznice/zlib/zlib.pc.in | 13 + externe_kniznice/zlib/zlib2ansi | 152 ++ externe_kniznice/zlib/zutil.c | 325 +++ externe_kniznice/zlib/zutil.h | 271 +++ kniznica/komunikacia.c | 168 +- kniznica/komunikacia.h | 37 +- kniznica/kryptografia.c | 134 +- kniznica/kryptografia.h | 59 +- readme.txt | 36 +- rs232_kanal/klient/Makefile | 8 +- rs232_kanal/klient/klient.c | 201 +- rs232_kanal/klient/nieco.txt | 1 - rs232_kanal/klient/obr.jpg | Bin 0 -> 14242 bytes rs232_kanal/klient/spustit_klient.bat | 4 +- rs232_kanal/server/Makefile | 8 +- rs232_kanal/server/nieco.txt | 1 - rs232_kanal/server/obr.jpg | Bin 0 -> 14242 bytes rs232_kanal/server/server.c | 208 +- rs232_kanal/server/spustit_server.bat | 2 +- tcpip_kanal/klient/Makefile | 8 +- tcpip_kanal/klient/klient.c | 16 +- tcpip_kanal/klient/nieco.txt | 1 - tcpip_kanal/klient/obr.jpg | Bin 0 -> 14242 bytes tcpip_kanal/klient/spustit_klient.bat | 4 +- tcpip_kanal/server/Makefile | 8 +- tcpip_kanal/server/nieco.txt | 1 - tcpip_kanal/server/obr.jpg | Bin 0 -> 14242 bytes tcpip_kanal/server/server.c | 24 +- tcpip_kanal/server/spustit_server.bat | 4 +- wolfssl/64bit_kniznice/wolfssl.dll | Bin 829440 -> 0 bytes 456 files changed, 78567 insertions(+), 404 deletions(-) rename {wolfssl/32bit_kniznice => externe_kniznice/32bit_dll}/api-ms-win-crt-runtime-l1-1-0.dll (100%) create mode 100644 externe_kniznice/32bit_dll/msvcr100.dll create mode 100644 externe_kniznice/32bit_dll/rs232.dll rename {wolfssl/32bit_kniznice => externe_kniznice/32bit_dll}/vcruntime140.dll (100%) rename {wolfssl/32bit_kniznice => externe_kniznice/32bit_dll}/wolfssl.dll (100%) create mode 100644 externe_kniznice/32bit_dll/zlib1.dll rename {wolfssl/64bit_kniznice => externe_kniznice/64bit_dll}/api-ms-win-crt-runtime-l1-1-0.dll (100%) create mode 100644 externe_kniznice/64bit_dll/msvcr100.dll create mode 100644 externe_kniznice/64bit_dll/rs232.dll rename {wolfssl/64bit_kniznice => externe_kniznice/64bit_dll}/vcruntime140.dll (100%) create mode 100644 externe_kniznice/64bit_dll/wolfssl.dll create mode 100644 externe_kniznice/64bit_dll/zlib1.dll create mode 100644 externe_kniznice/teuniz_rs232/LICENSE create mode 100644 externe_kniznice/teuniz_rs232/Makefile create mode 100644 externe_kniznice/teuniz_rs232/README.md create mode 100644 externe_kniznice/teuniz_rs232/demo_rx.c create mode 100644 externe_kniznice/teuniz_rs232/demo_tx.c create mode 100644 externe_kniznice/teuniz_rs232/doc.txt create mode 100644 externe_kniznice/teuniz_rs232/gpl.txt create mode 100644 externe_kniznice/teuniz_rs232/howto_compile.txt rename {kniznica => externe_kniznice/teuniz_rs232}/rs232.c (99%) rename {kniznica => externe_kniznice/teuniz_rs232}/rs232.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/callbacks.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/certs_test.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/crl.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/error-ssl.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/include.am (100%) rename {wolfssl => externe_kniznice}/wolfssl/internal.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/ocsp.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/aes.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/asn1.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/bio.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/bn.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/buffer.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/conf.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/crypto.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/des.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/dh.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/dsa.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/ec.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/ec25519.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/ecdh.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/ecdsa.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/ed25519.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/engine.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/err.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/evp.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/hmac.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/include.am (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/lhash.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/md4.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/md5.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/objects.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/ocsp.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/opensslconf.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/opensslv.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/ossl_typ.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/pem.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/pkcs12.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/pkcs7.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/rand.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/rc4.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/ripemd.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/rsa.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/sha.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/ssl.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/ssl23.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/stack.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/tls1.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/ui.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/x509.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/x509_vfy.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/openssl/x509v3.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/options.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/options.h.in (100%) rename {wolfssl => externe_kniznice}/wolfssl/sniffer.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/sniffer_error.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/sniffer_error.rc (100%) rename {wolfssl => externe_kniznice}/wolfssl/ssl.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/test.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/user_settings.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/version.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/version.h.in (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/aes.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/arc4.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/asn.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/asn_public.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/async.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/blake2-impl.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/blake2-int.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/blake2.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/camellia.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/chacha.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/chacha20_poly1305.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/cmac.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/coding.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/compress.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/cpuid.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/cryptocb.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/curve25519.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/des3.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/dh.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/dsa.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/ecc.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/ed25519.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/error-crypt.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/fe_operations.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/fips.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/fips_test.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/ge_operations.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/hash.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/hc128.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/hmac.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/idea.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/include.am (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/integer.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/logging.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/md2.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/md4.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/md5.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/mem_track.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/memory.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/misc.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/mpi_class.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/mpi_superclass.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/pkcs11.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/pkcs12.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/pkcs7.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/poly1305.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/af_alg/afalg_hash.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/af_alg/wc_afalg.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/arm/cryptoCell.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/atmel/atmel.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/caam/caam_driver.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/caam/wolfcaam.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/caam/wolfcaam_sha.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/cavium/cavium_nitrox.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/cavium/cavium_octeon_sync.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/devcrypto/wc_devcrypto.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/intel/quickassist.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/intel/quickassist_mem.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/intel/quickassist_sync.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/nrf51.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/nxp/ksdk_port.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/pic32/pic32mz-crypt.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/st/stm32.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/st/stsafe.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/ti/ti-ccm.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/ti/ti-hash.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/port/xilinx/xil-sha3.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/pwdbased.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/rabbit.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/random.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/ripemd.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/rsa.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/selftest.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/settings.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/sha.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/sha256.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/sha3.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/sha512.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/signature.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/sp.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/sp_int.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/srp.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/tfm.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/types.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/visibility.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/wc_encrypt.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/wc_pkcs11.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/wc_port.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/wolfevent.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfcrypt/wolfmath.h (100%) rename {wolfssl => externe_kniznice}/wolfssl/wolfio.h (100%) create mode 100644 externe_kniznice/zlib/.gitignore create mode 100644 externe_kniznice/zlib/CMakeLists.txt create mode 100644 externe_kniznice/zlib/ChangeLog create mode 100644 externe_kniznice/zlib/FAQ create mode 100644 externe_kniznice/zlib/INDEX create mode 100644 externe_kniznice/zlib/Makefile create mode 100644 externe_kniznice/zlib/Makefile.in create mode 100644 externe_kniznice/zlib/README create mode 100644 externe_kniznice/zlib/adler32.c create mode 100644 externe_kniznice/zlib/amiga/Makefile.pup create mode 100644 externe_kniznice/zlib/amiga/Makefile.sas create mode 100644 externe_kniznice/zlib/compress.c create mode 100644 externe_kniznice/zlib/configure create mode 100644 externe_kniznice/zlib/contrib/README.contrib create mode 100644 externe_kniznice/zlib/contrib/ada/buffer_demo.adb create mode 100644 externe_kniznice/zlib/contrib/ada/mtest.adb create mode 100644 externe_kniznice/zlib/contrib/ada/read.adb create mode 100644 externe_kniznice/zlib/contrib/ada/readme.txt create mode 100644 externe_kniznice/zlib/contrib/ada/test.adb create mode 100644 externe_kniznice/zlib/contrib/ada/zlib-streams.adb create mode 100644 externe_kniznice/zlib/contrib/ada/zlib-streams.ads create mode 100644 externe_kniznice/zlib/contrib/ada/zlib-thin.adb create mode 100644 externe_kniznice/zlib/contrib/ada/zlib-thin.ads create mode 100644 externe_kniznice/zlib/contrib/ada/zlib.adb create mode 100644 externe_kniznice/zlib/contrib/ada/zlib.ads create mode 100644 externe_kniznice/zlib/contrib/ada/zlib.gpr create mode 100644 externe_kniznice/zlib/contrib/amd64/amd64-match.S create mode 100644 externe_kniznice/zlib/contrib/asm686/README.686 create mode 100644 externe_kniznice/zlib/contrib/asm686/match.S create mode 100644 externe_kniznice/zlib/contrib/blast/Makefile create mode 100644 externe_kniznice/zlib/contrib/blast/README create mode 100644 externe_kniznice/zlib/contrib/blast/blast.c create mode 100644 externe_kniznice/zlib/contrib/blast/blast.h create mode 100644 externe_kniznice/zlib/contrib/blast/test.pk create mode 100644 externe_kniznice/zlib/contrib/blast/test.txt create mode 100644 externe_kniznice/zlib/contrib/delphi/ZLib.pas create mode 100644 externe_kniznice/zlib/contrib/delphi/ZLibConst.pas create mode 100644 externe_kniznice/zlib/contrib/delphi/readme.txt create mode 100644 externe_kniznice/zlib/contrib/delphi/zlibd32.mak create mode 100644 externe_kniznice/zlib/contrib/dotzlib/DotZLib.build create mode 100644 externe_kniznice/zlib/contrib/dotzlib/DotZLib.chm create mode 100644 externe_kniznice/zlib/contrib/dotzlib/DotZLib.sln create mode 100644 externe_kniznice/zlib/contrib/dotzlib/DotZLib/AssemblyInfo.cs create mode 100644 externe_kniznice/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs create mode 100644 externe_kniznice/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs create mode 100644 externe_kniznice/zlib/contrib/dotzlib/DotZLib/CodecBase.cs create mode 100644 externe_kniznice/zlib/contrib/dotzlib/DotZLib/Deflater.cs create mode 100644 externe_kniznice/zlib/contrib/dotzlib/DotZLib/DotZLib.cs create mode 100644 externe_kniznice/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj create mode 100644 externe_kniznice/zlib/contrib/dotzlib/DotZLib/GZipStream.cs create mode 100644 externe_kniznice/zlib/contrib/dotzlib/DotZLib/Inflater.cs create mode 100644 externe_kniznice/zlib/contrib/dotzlib/DotZLib/UnitTests.cs create mode 100644 externe_kniznice/zlib/contrib/dotzlib/LICENSE_1_0.txt create mode 100644 externe_kniznice/zlib/contrib/dotzlib/readme.txt create mode 100644 externe_kniznice/zlib/contrib/gcc_gvmat64/gvmat64.S create mode 100644 externe_kniznice/zlib/contrib/infback9/README create mode 100644 externe_kniznice/zlib/contrib/infback9/infback9.c create mode 100644 externe_kniznice/zlib/contrib/infback9/infback9.h create mode 100644 externe_kniznice/zlib/contrib/infback9/inffix9.h create mode 100644 externe_kniznice/zlib/contrib/infback9/inflate9.h create mode 100644 externe_kniznice/zlib/contrib/infback9/inftree9.c create mode 100644 externe_kniznice/zlib/contrib/infback9/inftree9.h create mode 100644 externe_kniznice/zlib/contrib/inflate86/inffas86.c create mode 100644 externe_kniznice/zlib/contrib/inflate86/inffast.S create mode 100644 externe_kniznice/zlib/contrib/iostream/test.cpp create mode 100644 externe_kniznice/zlib/contrib/iostream/zfstream.cpp create mode 100644 externe_kniznice/zlib/contrib/iostream/zfstream.h create mode 100644 externe_kniznice/zlib/contrib/iostream2/zstream.h create mode 100644 externe_kniznice/zlib/contrib/iostream2/zstream_test.cpp create mode 100644 externe_kniznice/zlib/contrib/iostream3/README create mode 100644 externe_kniznice/zlib/contrib/iostream3/TODO create mode 100644 externe_kniznice/zlib/contrib/iostream3/test.cc create mode 100644 externe_kniznice/zlib/contrib/iostream3/zfstream.cc create mode 100644 externe_kniznice/zlib/contrib/iostream3/zfstream.h create mode 100644 externe_kniznice/zlib/contrib/masmx64/bld_ml64.bat create mode 100644 externe_kniznice/zlib/contrib/masmx64/gvmat64.asm create mode 100644 externe_kniznice/zlib/contrib/masmx64/inffas8664.c create mode 100644 externe_kniznice/zlib/contrib/masmx64/inffasx64.asm create mode 100644 externe_kniznice/zlib/contrib/masmx64/readme.txt create mode 100644 externe_kniznice/zlib/contrib/masmx86/bld_ml32.bat create mode 100644 externe_kniznice/zlib/contrib/masmx86/inffas32.asm create mode 100644 externe_kniznice/zlib/contrib/masmx86/match686.asm create mode 100644 externe_kniznice/zlib/contrib/masmx86/readme.txt create mode 100644 externe_kniznice/zlib/contrib/minizip/Makefile create mode 100644 externe_kniznice/zlib/contrib/minizip/Makefile.am create mode 100644 externe_kniznice/zlib/contrib/minizip/MiniZip64_Changes.txt create mode 100644 externe_kniznice/zlib/contrib/minizip/MiniZip64_info.txt create mode 100644 externe_kniznice/zlib/contrib/minizip/configure.ac create mode 100644 externe_kniznice/zlib/contrib/minizip/crypt.h create mode 100644 externe_kniznice/zlib/contrib/minizip/ioapi.c create mode 100644 externe_kniznice/zlib/contrib/minizip/ioapi.h create mode 100644 externe_kniznice/zlib/contrib/minizip/iowin32.c create mode 100644 externe_kniznice/zlib/contrib/minizip/iowin32.h create mode 100644 externe_kniznice/zlib/contrib/minizip/make_vms.com create mode 100644 externe_kniznice/zlib/contrib/minizip/miniunz.c create mode 100644 externe_kniznice/zlib/contrib/minizip/miniunzip.1 create mode 100644 externe_kniznice/zlib/contrib/minizip/minizip.1 create mode 100644 externe_kniznice/zlib/contrib/minizip/minizip.c create mode 100644 externe_kniznice/zlib/contrib/minizip/minizip.pc.in create mode 100644 externe_kniznice/zlib/contrib/minizip/mztools.c create mode 100644 externe_kniznice/zlib/contrib/minizip/mztools.h create mode 100644 externe_kniznice/zlib/contrib/minizip/unzip.c create mode 100644 externe_kniznice/zlib/contrib/minizip/unzip.h create mode 100644 externe_kniznice/zlib/contrib/minizip/zip.c create mode 100644 externe_kniznice/zlib/contrib/minizip/zip.h create mode 100644 externe_kniznice/zlib/contrib/pascal/example.pas create mode 100644 externe_kniznice/zlib/contrib/pascal/readme.txt create mode 100644 externe_kniznice/zlib/contrib/pascal/zlibd32.mak create mode 100644 externe_kniznice/zlib/contrib/pascal/zlibpas.pas create mode 100644 externe_kniznice/zlib/contrib/puff/Makefile create mode 100644 externe_kniznice/zlib/contrib/puff/README create mode 100644 externe_kniznice/zlib/contrib/puff/puff.c create mode 100644 externe_kniznice/zlib/contrib/puff/puff.h create mode 100644 externe_kniznice/zlib/contrib/puff/pufftest.c create mode 100644 externe_kniznice/zlib/contrib/puff/zeros.raw create mode 100644 externe_kniznice/zlib/contrib/testzlib/testzlib.c create mode 100644 externe_kniznice/zlib/contrib/testzlib/testzlib.txt create mode 100644 externe_kniznice/zlib/contrib/untgz/Makefile create mode 100644 externe_kniznice/zlib/contrib/untgz/Makefile.msc create mode 100644 externe_kniznice/zlib/contrib/untgz/untgz.c create mode 100644 externe_kniznice/zlib/contrib/vstudio/readme.txt create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc10/miniunz.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc10/miniunz.vcxproj.filters create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc10/minizip.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc10/minizip.vcxproj.filters create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc10/testzlib.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc10/testzlib.vcxproj.filters create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj.filters create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc10/zlib.rc create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc10/zlibstat.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc10/zlibstat.vcxproj.filters create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc10/zlibvc.def create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc10/zlibvc.sln create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc10/zlibvc.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc10/zlibvc.vcxproj.filters create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc11/miniunz.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc11/minizip.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc11/testzlib.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc11/testzlibdll.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc11/zlib.rc create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc11/zlibstat.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc11/zlibvc.def create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc11/zlibvc.sln create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc11/zlibvc.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc12/miniunz.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc12/minizip.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc12/testzlib.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc12/testzlibdll.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc12/zlib.rc create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc12/zlibstat.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc12/zlibvc.def create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc12/zlibvc.sln create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc12/zlibvc.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc14/miniunz.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc14/minizip.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc14/testzlib.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc14/testzlibdll.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc14/zlib.rc create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc14/zlibstat.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc14/zlibvc.def create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc14/zlibvc.sln create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc14/zlibvc.vcxproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc9/miniunz.vcproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc9/minizip.vcproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc9/testzlib.vcproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc9/testzlibdll.vcproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc9/zlib.rc create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc9/zlibstat.vcproj create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc9/zlibvc.def create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc9/zlibvc.sln create mode 100644 externe_kniznice/zlib/contrib/vstudio/vc9/zlibvc.vcproj create mode 100644 externe_kniznice/zlib/crc32.c create mode 100644 externe_kniznice/zlib/crc32.h create mode 100644 externe_kniznice/zlib/deflate.c create mode 100644 externe_kniznice/zlib/deflate.h create mode 100644 externe_kniznice/zlib/doc/algorithm.txt create mode 100644 externe_kniznice/zlib/doc/rfc1950.txt create mode 100644 externe_kniznice/zlib/doc/rfc1951.txt create mode 100644 externe_kniznice/zlib/doc/rfc1952.txt create mode 100644 externe_kniznice/zlib/doc/txtvsbin.txt create mode 100644 externe_kniznice/zlib/examples/README.examples create mode 100644 externe_kniznice/zlib/examples/enough.c create mode 100644 externe_kniznice/zlib/examples/fitblk.c create mode 100644 externe_kniznice/zlib/examples/gun.c create mode 100644 externe_kniznice/zlib/examples/gzappend.c create mode 100644 externe_kniznice/zlib/examples/gzjoin.c create mode 100644 externe_kniznice/zlib/examples/gzlog.c create mode 100644 externe_kniznice/zlib/examples/gzlog.h create mode 100644 externe_kniznice/zlib/examples/zlib_how.html create mode 100644 externe_kniznice/zlib/examples/zpipe.c create mode 100644 externe_kniznice/zlib/examples/zran.c create mode 100644 externe_kniznice/zlib/gzclose.c create mode 100644 externe_kniznice/zlib/gzguts.h create mode 100644 externe_kniznice/zlib/gzlib.c create mode 100644 externe_kniznice/zlib/gzread.c create mode 100644 externe_kniznice/zlib/gzwrite.c create mode 100644 externe_kniznice/zlib/infback.c create mode 100644 externe_kniznice/zlib/inffast.c create mode 100644 externe_kniznice/zlib/inffast.h create mode 100644 externe_kniznice/zlib/inffixed.h create mode 100644 externe_kniznice/zlib/inflate.c create mode 100644 externe_kniznice/zlib/inflate.h create mode 100644 externe_kniznice/zlib/inftrees.c create mode 100644 externe_kniznice/zlib/inftrees.h create mode 100644 externe_kniznice/zlib/make_vms.com create mode 100644 externe_kniznice/zlib/msdos/Makefile.bor create mode 100644 externe_kniznice/zlib/msdos/Makefile.dj2 create mode 100644 externe_kniznice/zlib/msdos/Makefile.emx create mode 100644 externe_kniznice/zlib/msdos/Makefile.msc create mode 100644 externe_kniznice/zlib/msdos/Makefile.tc create mode 100644 externe_kniznice/zlib/nintendods/Makefile create mode 100644 externe_kniznice/zlib/nintendods/README create mode 100644 externe_kniznice/zlib/old/Makefile.emx create mode 100644 externe_kniznice/zlib/old/Makefile.riscos create mode 100644 externe_kniznice/zlib/old/README create mode 100644 externe_kniznice/zlib/old/descrip.mms create mode 100644 externe_kniznice/zlib/old/os2/Makefile.os2 create mode 100644 externe_kniznice/zlib/old/os2/zlib.def create mode 100644 externe_kniznice/zlib/old/visual-basic.txt create mode 100644 externe_kniznice/zlib/os400/README400 create mode 100644 externe_kniznice/zlib/os400/bndsrc create mode 100644 externe_kniznice/zlib/os400/make.sh create mode 100644 externe_kniznice/zlib/os400/zlib.inc create mode 100644 externe_kniznice/zlib/qnx/package.qpg create mode 100644 externe_kniznice/zlib/test/example.c create mode 100644 externe_kniznice/zlib/test/infcover.c create mode 100644 externe_kniznice/zlib/test/minigzip.c create mode 100644 externe_kniznice/zlib/treebuild.xml create mode 100644 externe_kniznice/zlib/trees.c create mode 100644 externe_kniznice/zlib/trees.h create mode 100644 externe_kniznice/zlib/uncompr.c create mode 100644 externe_kniznice/zlib/watcom/watcom_f.mak create mode 100644 externe_kniznice/zlib/watcom/watcom_l.mak create mode 100644 externe_kniznice/zlib/win32/DLL_FAQ.txt create mode 100644 externe_kniznice/zlib/win32/Makefile.bor create mode 100644 externe_kniznice/zlib/win32/Makefile.gcc create mode 100644 externe_kniznice/zlib/win32/Makefile.msc create mode 100644 externe_kniznice/zlib/win32/README-WIN32.txt create mode 100644 externe_kniznice/zlib/win32/VisualC.txt create mode 100644 externe_kniznice/zlib/win32/zlib.def create mode 100644 externe_kniznice/zlib/win32/zlib1.rc create mode 100644 externe_kniznice/zlib/zconf.h create mode 100644 externe_kniznice/zlib/zconf.h.cmakein create mode 100644 externe_kniznice/zlib/zconf.h.in create mode 100644 externe_kniznice/zlib/zlib.3 create mode 100644 externe_kniznice/zlib/zlib.3.pdf create mode 100644 externe_kniznice/zlib/zlib.h create mode 100644 externe_kniznice/zlib/zlib.map create mode 100644 externe_kniznice/zlib/zlib.pc.cmakein create mode 100644 externe_kniznice/zlib/zlib.pc.in create mode 100644 externe_kniznice/zlib/zlib2ansi create mode 100644 externe_kniznice/zlib/zutil.c create mode 100644 externe_kniznice/zlib/zutil.h delete mode 100644 rs232_kanal/klient/nieco.txt create mode 100644 rs232_kanal/klient/obr.jpg delete mode 100644 rs232_kanal/server/nieco.txt create mode 100644 rs232_kanal/server/obr.jpg delete mode 100644 tcpip_kanal/klient/nieco.txt create mode 100644 tcpip_kanal/klient/obr.jpg delete mode 100644 tcpip_kanal/server/nieco.txt create mode 100644 tcpip_kanal/server/obr.jpg delete mode 100644 wolfssl/64bit_kniznice/wolfssl.dll diff --git a/wolfssl/32bit_kniznice/api-ms-win-crt-runtime-l1-1-0.dll b/externe_kniznice/32bit_dll/api-ms-win-crt-runtime-l1-1-0.dll similarity index 100% rename from wolfssl/32bit_kniznice/api-ms-win-crt-runtime-l1-1-0.dll rename to externe_kniznice/32bit_dll/api-ms-win-crt-runtime-l1-1-0.dll diff --git a/externe_kniznice/32bit_dll/msvcr100.dll b/externe_kniznice/32bit_dll/msvcr100.dll new file mode 100644 index 0000000000000000000000000000000000000000..04b317a0a9d0a19db956f84bb0e8a516a21a65f2 GIT binary patch literal 774808 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%0A*>Z75O4p7YRQ* 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

f?RpK$+jxU};=2gqOYrP}d@ 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%0AvaSiaqAUs3!1!i=i`EJMw4sp_%ibtcJ~69 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

9=wVhkIHp< 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 z zexFeJ@;#kt>MJTB+)lx#n7kta4J4j|3J z#u+F_QUo7e&#ojUgvN(Kyi1PYF>%s}Oyv%m3z1MB+)Ts^J;;+QI#%6z(6&hfU*?vq?zTYYPmvM z&S5$Tk|$+vbzV|T5qYnwNHK+h_k#sgX2`iCyw`!??dA7UdO#FIzs4{Orq&=@{tV}JYz*r znVBl@LVy~6K&)^xtyg+m6VTKs=opGJDvVlD2CJ-0shJW1JH4uNBNFHWh9baXTRfRq z80FMDMfz+*>+!GeB*aeVr65FmG_sE62}&Vfp1mLy_6eq`4Xou^da{8a?xA;<3_dm+f1B>qkXyQPP}X=Exkv5J3|A9qgw2;{(|i2G%3&Y9 z-8J9Osm+v4>FE>dKweo$=9w?(-u5oBWl~wKDu^mv_cre1qef^{?}W>y2vf?D79)!I zk)sZp6Q$Q0Qy3UQmd>;o9>%*nQ|-iNS)N#jo!-9?9n*47u`IHENG&~}N^iSVRHn9$ zYn#d_iG`zwAF*j@3qf2R;bGL&8+Km&3#+Q`-wecl&gNFV1i81rCCCq$uPi}6AyaG# z(lcG-LRj`?_-3&LNqwx(5~R}3|Fq8E&k`ixPX9q~dTa?|^Ut97{@5x6a%itYOx7Ov zs>=mJ5_R8uzh%T%A4Q2$`mR1U!x&`sF@n_oRv$m2;X(-Q)d$+;#OmV@U#F5Yu0HPl zlGVqGslgS~gDWNmS4;`6$O^8=mI@}7guM3`m6YJ^NTU-g5NZU`?tdVdpAjt0411aS z!4(<76`A47xc#yPNurqen&b*TIP;n$r{YQfkerHLtcP^VBG-O#Q6fn9#YKt45dV*Y z{Q2W!%Y})-(kVF=kNbz`RP6K*welwh^VzI5C77Qbud(j}MWX0@vBuo5Qsa~7#cIq7 zmS*QvJR&vzGFIbMUE}n4jeQp@5+UM?HSXi>f9&J@c#TtorPCoPh0W8VDcb zIP=uC%h=!wPq><51!3QtAX8e?t@!$-h7@qmpsV^CWco1+op&+|vw~kX3q73lz%0Ch zOtD#5eQ}>zIF(sg_lrKWu#+1%mwP;YvW>|7;XeKi+%4=mX^7y8ox?C-To% zn|?wP;;7kICm_+rzKEJnewE4ai*ct+hTiFy1#VjT*(eL*HTIo;%loZy{#U7SM!ZI$ zTYaY=HBQtuPKnppclv$O@ATXMRiH?roOBHVu zgNw6KzsX!1i~*Xq$V94WncQMZtOPT(c z7vH}#F}Z&AH9fh`w7mEevfr7P7gtlx|MT+V^0CqZSzc_Tfv4@eJ6--hNq@dn{=QTu zYrpchb|==(#Nx!_DPxCwj~bXo_E*`g(MHIiZCm2p(`vK+7Fmd3PlRtghH=^$k;hsP zjS(4#+p9rl5FzT$%9hFc>X{TzpR?Sz z1mc!ywIF71Ia-u}F%qj~w7L))&w3b(_qP+(%EURf=LgjR+ALA7O4J==PV4vS`v?Dr z4rBamw&?c_d?xlKSr->Nb6<>`n4UgYbGkHLr#69RivA67+z2lTyb=xG?g(BC>Q1P; zJhm?Ok5%>dSNk_7rtl}{%c?qjp)eq{XGXJV&!)Ye+wQ(^FTt2!Zu35`b@3JLs6y%` z28w94Ut&cn#!%7B3N;2aHjvzL<;MloR37L zXL?&*w@gbhB((6xHYBheYp7@q^U!YP=6DbIXKI6+^=dzQk2-rkztUfl0L?t}w@%L) zzjdRB1m#QowKEw(rV(V>fXPKHYTChkzSQ;W&GgX#;$;!2)MExO~Ar&j( zX^n2W-YNd){*IXCI;Y~Gd4c-#CP4{N$WyH~L)6vLx2QP!mbx0I5zGib1P_4%1!u9D zmK|R%aOgDp+t&_FLB`iXVCaNiGv#vcb5$83aC%#9OxJVCyGOh(rXw4@LU zZ;$aEc7|jfX>rNJN%BR8A8GN(LytV9ZP|02D_buM+|SH+%0~l3j=xmPSL5X?c{1f` zgnTAX>*Q$wH*2}keyTXPc4F(ONit+7p+unAzC9B&$Pj}K>_4ADjQGn9<38h&1xDur z{%tURSYUJ(@GoTCf0faB760xs9=O`*yqbUOjsGe%It%${8b4lQbS~ka-}q^f(OJa5 z?-~yk8=b}ct2TBlH9D8_?|a72N{r4D{(awg7})9m#u)O?NV?cKSDtGw5e!T*Hcm6f z%k#IV8%!a?xMPMfL9Ux-8Y_&khEaQ|0ns#!&9n4*)<#{9_Ixqwry7&w{gw-jmBu*3 zxO0v%S)KzM z*V)*4cW1EE>b$G7sdH=RHa+Rt4$&xwzKsshg_>C{K0NNH zXStuwOVT7Q@|Ny~7!n85hrkd`^jgZ4OGs;XAR0A2Wh$2$Q!aTNIH3sw`u;#2=? zCF%(Ai?L3X+YVC)6An}ROaV50c-Qyg!wx`?L-U{U-O{qJ2<7Y;L(ISx^k7`{g5roh zP>mrst`zDC$*wtnoVTCOw;rQ#>d3g4Ivyf7AC<@J(7Vz5DP0;NrC*aM{mguEAO%x? zjg+5fmw$|o={~4t#FT!@uZWd@STdd_x18SoZ`$Q|Nco-Qr&$jq%Ku^i<$q2FY5%=n zq5ORm{KdIjx#N17yt_qSvR0c^!U~QRtn*i(w0Kto08->aa-u@@YJ$ zN~ZC}dKwqm)0m)>OyjXU9O1kG{}KNzJ(G80CzF|cj&8~qrt{xGI(Ot5_tR5l##TNo z&FeF@S5{iB@wt8NIzhKDb_|~_-7EUHf_Z%iL~=jVU735*99E|0!y3vfAz-PM908sz zt~mD0-X)N!#IxEQUYV0B)%pkF80oZ|fMLv4wfzSS*@f%%kbOesHcE&AlB)V(1>DW3 z6r|24uMFFJk~xMJ347(~cu`O3RB}ivY3BpJ+mfhcB*f_qm3&AhsiY=W3C*D=UyKv< zv0eW1A5wmmUH-Z8@?~xw;X~%;8EUyBR?AtjTFyLwuBHN8FCt;i-iAh5hafRaleT)D zq0Ni7cKB197I3y}(*SvE_=mfn9#Evt!IMV_j&{VHiV|;W9&5jzvLbaJDKXCvT&R0g zJ$);GR*x2;mXOKO&acGTZs`j5)A~ePSJkZh>0`s~8isSYBahcQAwP-Hddn zwDSG6x|KiVl4#{mq?KnFhtJ3;E!`>~d?}rLBhk*dZ8%|}R|h*~tTP1O@V36D;o^Aa zKI)jK|8wr%qUVi};rgmY5AQFxFSBarkATfya7VNgozwOKv)mTkm~&tBk5L)Jw05HE zRzRnn>goW$4v9bQb%_}B+L+gmzGHSYWr(%k6LXw3+d~^=PF*NW6E#6_Y_Ot3?`2IE zBBcHeT7hQ7=)lRg0R2*>EL|_h>p&m&F2RQ`yhSgP?JUDkI1$AyDQz8tge1J$I_Qj`CtgiQ7krmwF`Iy*mxjtEadqv^lv<{ep6~ zN}N$wETBzW)8eFHf1kL!YJot#~$-HpenN8K9Q$G;Va_Ats1iz5+kenr*O=F`8DH zbB-huI;O%!W_QD1WMC5F!JlG^}9g@Nomrtq{vttl>Ngh1D6l- z54O9S7EFsU_~LHtS|A=gF@bj4yOB|GUBZ^3&@{E@W+)&YehH!@Y7nB)YczO-M2!Yx z0G5pgI{~!J?D)8!u6KTn!P0n;KmjN9fC9@YD~1BMvJe9WCUV3MC;<5hZFZEYvnZ1B zXV%M}nL$E`pqt6EuOzX-h~T?rU}I8A2|R)A@3IxYAS^8#vFGywbIc#C-d*FKXLa*?T7C}=TgHUKoGley|=gUj8YH! zr0t>$RNv*+GW159Dx+RBMoyItOO>5K>@V3gsE+d#);Wm51NUZdaXoUXm4yi=G4lbb zy(X>h4d%zImbi67l%1**QL~&lY(1<#;!WtG3De#U-zD|#by38uRR3V*){SA!s5PDb z!;wGdo~XN>0Jxv6zZtN2Kqx8jVik?{de~jbbd|UBoeVm?GwEb(=g9+XdKkZ#vm1pw zOj0|)DSegV)ne+5Z+l@khW`-z7PR_Nm@!r1m8zuBRt~`Jt?F$O*}Wwf6xi)QW%B+| zfMzSOJ*s;!J;^eB1DA)NpcZ!J#4V2Y7hkT8R9Y|jSgR)a%aM-T^vvsjDN7?EOSI6ofP zJF(+ynI(KBJo*y~?e*U}UEbS3qcFtWu!FXBkW<1{i5?!>ds150iYeyn(z>Z?^EVQ$ zyBF1rwC)?d!pF;?60dSnMF24um#Oo`n$bZ6=1Bv}ITnW%;RU;+Xo+&)-;iv5X4Az| zsG@ul7ft-5`&t%Ysd^~xq>Pr(>u(8DyCyLzhb^<7qz^q zWE3?FkhrR;b#DtYa1I;W3B)r^3nIRZs_vfwkT!ZO4tob+bGG_4wi(4XCZ%k}xYFeP zl;C9J)U%)=JXuC#j4G)VPzi}u|70fOevdA9H>I_pmc=(Yi7gl%Mb?~bW`6W<8e6st ziWSMjh%DaHAZV0qM2om%rw}I(BnSH`p`6&+9+ep$Sq2NS4PAZRN8P)ZeOmwbe^@z9 z*9;Kt?xy5yYxve{F3G-R6po@(N7<$aYw*@Z7iVAM#K+Vce#xRsvYUtrd7!Vn0GGoA zbig29K4gWe!k2QDH-5Y%J4Nqa*x8Rs0G)KFs!5VL!yM4-06FoC(h~kfF9Ki4hI$w< z-vG2^&|{=yjQaBcO*)iojet=Q8u*2`aqUAz&Q?E&W&3z_JexYf+>HifMVUTjy=7b)ZP;eTnKO&_)y(pSO6cz;i)4{y^^_G;PN zoi<&&Tl@OXHT+&*o-a#%?b|X%7+7yW+cmT7eO$pbc5;mmG^Yj%PDBGYq!^WLc~N7K zH8jwihe{hgW~k^y?rZBhIpV@Dx%M#>&w|8kKH-ed4A# z$ON)~1+wfSZDBi>ZB`wvE+ZpeT3ZwO)I+FA|D#p4tw>!gun<42m{GMf#>Um%AIeno zSck0RNdoMuY!w4l&1B?#hJb&AMtsw)`GqZ+x5w)IRmP}yG!kNU@5z$CvbdMiORNL zfwk|gN0@ajB-3J3pBU&D zKsjY0q;fxq;RW8*E;}6IoD3Ht@a?2BljKiYi0If4ykrpDC1b z4?u%DPcvz2V}2Ul);RR@o-e}dbh)@0Kxuv>$6ktTZ1atD+Y~&=w#%oyvUOf|a&wvc z>5UF}`Ib-X0orTb_LgO{h$}D5`CPGSnCHut?I2_2%0`em^;bFStwAA(H-QcRzNP+! zq^4n!3r>A|XZ;Jw5mmp+Q5PA~n^J#neWOHxM>`-@RJ4e2GQnszu+8Mjb4-Ncpl%+` z@pE)TGTACZJ4UEYD+Ox8lhyYyruarKC&+r$bT;lpM{GjUj2+O`@hgzU0>a2bc0tqa zf-bZRI-d*sTE=mqTN!FXZ?U-)EAwkRb;PFN5S6OaWlBdr>caqrsIC?9QH=cMKhXR) zko!)YHqS(aE>Vkx>}$I3R{xbKu)mq}Iqk4#&V$F}m~bX~zYiGLaz_aSaM}?~zczjo zLA!(gA%5m|*oT-R#U>F>vDQVD(jM7r-6I_pdgqxIEtU0;@(bP-<@jA95;OqkNLqA6 zJ=b0#!RpTO_iRo_yO>uc+vV)Q7la3kJk7f)x)MU2x-e^&soR7?N6u2et`P8L%Wz)J zD=npnHeIiJgnc~5IJN+i1ToAen-IhG`b%l34A#9|`;5!k>hmZJootH|+0>1gGQJ8i z{Os6igOm{4e*>svV*4oduj}I@ueRHj^*3OPXuCaNk?z=looT$jO<(nRN!T?fHVM7F z*f3HxQIoCT`Kbe(Yz@CdZy6R2#(aIg3}<QC|w@wm}-L`F#IkMW{S?6ih@NYaen_#&}&eY(0^=h2h?$6ywpjxJRf zZaNyxzAI3hCqu3ddPMw}A>FDy%7b!DQpQY=I+~ixeoN=iPrm5wm+2gX9yV$r4 z#IB^}yFqG}yk%Sl%ebUh1{s*Ys`2tsY+y#&b$ECc8=6!}?Qdwh$|a8;nq(Sc56y2- z_sh_{{)M5D9gFPh@}*P(p604Ye)9x$dp30BVNpx9Y`+4V`(o_xi#1I+C3jxco4vVZ zxhBG{oqq|2=xg*BdTh3IO$1AN&6Ds!XBoRu%>gCq-E&ZW1pb@oG*QF1DAXut;7Mqa zl^Zy3xKUmQ8$0+7HBODK(Hjrwmz`pe3LTK&`#R+J$8XB-Q{t!{{PRovZo5x5cy9}J z$?uQb<+t&9`TcJ(mTmjBY}9-3p2kC5EUzO}=m>@mbKj#Ck$NW4=e zc1%cGgvS_fbSt{}jgHt3zF7 z3Dz2sF}ru^ME%<*5e=`wzBM_O9$obo$U!hIuA^ZwA}&dOP9=++Ewx3QB96sj8PTubWr5s9W^S4FZl?PXdlRX;@%QC(2eiot0ovL}O)< z9XOfdZupcNU-C*KvNwpQUf{$Ccf)h~W~3d}4MOE^__coHb~iktZ=B{(q8}kMoEYqG zl#`p(i`PIPI2yv;@B<#7>&SepCTH{Y{tKcrrb`Px)B}-!y##vjlfizCQR~y2^*(`U z_4U>p+VaK{)ZMU@EF8}kEac=S7r~z04Hxky(CmnuLx?Z{VvP_u-Tb;MrS$qxO;7G| zcVGxPax&bFsazv(gC&cgyLwTR`vKOS6C?a{19PUJdpG58rSkkRg>Kn*%J(wZ9s%3%%*sDb9o(NXg@Fxx

=N8+a*XsWZY?(O9>q8W@iwTj$<)O7~J&qJxEdk{=FA<2JTVS50s!I~> z-G)O<?P{KOXW5H&fU8#NiHnAUa@ZRIVxnB(pA4?vw) zH|XspeRCZq>ORV z4XaC{%R0*=qX8y|iD`EN8OR6eczKIXJGEJicDzk#mUn+}!D^gGUnO_Tc6gyyV8zF= zIX0g0=cj0;ra#4{(HYMJDjP&7NpyU-k;=({+4AQ&ykU?(|0wOuGRm0ljUn!k2`p_r^+cA^*0aC=G_kYu?m$nL*@joFbi^qNM7@DN{!BtTNxD^7B#1! zI-e+wAs#b^Mjydz4`I_UioU@sqW)kPBs2*ogDfL5ZHKfa*Q?A)6h!)Y(f!0|k#BcM zt0cv3rx3!vOD9HW=>AA<7RCHefIB1%5@pOpgjpdn%&kjAhS|Pgjk#?7nsrNV^sTwc zyz18fkGeOHYwGy=$1fy6*i2MZtQ!heEmg5-6%)L;1eb~hkxfNKg(7t;B%-Y-G++t0 zskXJPZEdSnTWzh{y5UkKpln)2+;B%ly%;sP6j0H8-{;;0(Dw5@-{<*#|M}^Q+*2|GfC4%K+V*IGn^l}KhU)t$ zxFtLs_rzfb?<}1oDbNf}vWG8Ys4E3`dkFBOlP2WGgVF%D*Pyb8f9o+=RnTmDVH@Z@ zIY;c2@3JmhA<#^<@T#q;1xNCZqlkS?YdvuXlejL4= z#vLP@VGqe%Wl^#@!zjENQ>2Ij4N$ui7m9o7gv-1BMk?JC2h8-Q$uR8>s;&|OAkZp^ zSLiCsDbw`hrr~NU-D8rHs5^sa z>JVsJ5{NkQJA=OG2Ew>e{LZBBDS&;6rD#_i4VM#v@QpkxPhDVIh_TsjZbxYra?}MfgC7T+zkJ1I| zN%}5iIdMee91yEWb%vRR3tqG~w`kyqQbgKkw)i*c&H%$5$4KH{1$-M zw14sPzS&k_2t>E-2cpDN$PhyrX#cF?h5a)RUOm=^=wuX4h-!qJx?ulhulIwa2dzTb zYSWwssC?}-!mC1gS#vs^KRg>NqxtYlAIYDgT@sjvIFWW$+m1KC)hJ%8@G5NXn>vKU z@oXlX3lOG7+O80Pm_ef!c%66|Wukw9=yf9*o_B%4J^(6iV>Iq#yo~pcKvtL!hL=)4o9b=p09UglFbyMkjTfG}x#aO52y&P9uYnLHjzg z@I8@1?`i5Coa2aO-4HLg#%n4mNP9OOCZR53w8XSes7`SESy)#A9Y%+|sotb_z;wIv zPc%kr-~f`UX>U~+hKj~CPFF6G|KB_lD{Mjv8acOMU>u_?6zoS%fdnf7jxcYfHI-o; znnGBph&LgU!izSBA0bfz5_6PT*!F3p*UR&?a)N2%Xb`2C8#-I*P&oz?Uct4A#tJJd zY(7kt-(QKy^vx)`QTqzGC9$Sr$Oa)CSE70TS0xOh5`ts}YsrOQLGFkq-?e-tL?Ab6 zeiAbgw*$#n<{OgjAnqpIpBycB~F`FP_%Mw={1Y$pdwt@+eJd-3zk~=>EA>w96uoN;AH+Qy~kKqj%wS;f& zz&yZ46TEkaA(@RKCm}1@{i>4Ocn`{t2nc5e-ec}y&ooB32D`NmuGCuu@N{6`~!c|8`yGJX!UjJT-)r*Wz!J(B%~|F+X%5hYH5=QGTJDH6BSTJ^0Sc! zSXH4ohLQ{K?))Pf_e8dAS{w;jA0>9Q-XKqky9x znq001gKjO3g=&Gj4M7?Zq7rG;hgqg*4|l$34`ne1FI-NNOm;xVHRnE07F?v2wLeI!R9C<{(*Yf!3}-aMjO*j)(oyQK-=;MsqjN zdnc+vy-~B3?$+Kf^rWm&)cY3$&9!5x$GTa5T!`n7i|FTl`uTu<7Sm4}{VbuMrTC#c zsAy6ws@m3tE+hBYW9hfeDEjR*f_?`C(Qlv%zaO_rq+j>R^xJ6={W|og-|l|&+xvC= zu3qji4G&JuteYS_rR$>c#BI{+X41Eyo-1-#gBc{L%hpolx(WCyau|hQXK1mC9L5T< zR`s8#%UfF?4lo2go~S!pw+e~i?fn>}X$)CGks2*Aw15^dq(svNQUYB5fHc2QnnWu5 z1+5t7pj0Qpl3Nx`GS7>C1)_+0>xItzH8iNwZ?O{(3l9tD$5T(|q}yyN>M;08_A@OQ^JW6> zBk7k&6R*&yNIt4JDXkS?+}4THFyTj#ahkxekcKYe1VefU7lQkZ0Gs;pqX3m~@VZXu zA$w?o=UWVocta##MM3aoT^tt4SJ1mb8jP!CzlKsk)QfLRoPP)x4Mp-(Y*lE#v$}O8 z>u-@B;(i8B6dwS#;(Y70iB^TC_o0%)eWEwXKc%2_#wufILV!f03g;7r`o=wm#;Xrm zP_KoELa%GY3qjSkAdQ<%@Aw)D<|9#$#V?BQPDS|EAY}&;_>rM}gcmK?+?uu-FhN0o z|Jpy_ztp$1Lq1o=;d)6ccMp0|ku1zOFr7$}K=BLx1pnLp28d8{+UkMbC1?;O|d&DKac#4 zk#ogJoNvj~4i+5vT2;W|+24_Z+S0~N9PfH0mI?Vtp`A#2u~6Rh;Y*zG1a^zo?E0)z zgwv_%P|4-F0xi`7r8SB_h(LpZ3er{glNggEmH`_HV8bO;2=)lIW^O;!#u;lYJE^!v zsB>*KYnNFDY;KP1_qG^$RwAHJEN+f$MpNWlh{TCp0X$hu6yTFD`vpwKcSBH2&R8et z?u$`nk$?vc-|3GhYq}UFI9bvk_tmrw5W-VhScK=892Z1uZ}$LWnI6;M`@|2Iyn!yLp`-#7R&WIAmFz_pp zZ7RwYu_7xbIW=cSO;Z6pw5cz_!Za07idatQVule;kE?qVNd-QrjsPdZ6Q)*j)D#Dg zotnv}2$&OpgY^90uDXokGT$7_-od1>Z(&5WO}eaB0a81EG~fBx)QGXw<^Eqp<7f7w{K4~*y=FD3n!M)C^-7$V>a}Q|HrZ=_^1OGFlK#*6%}cvToU4D&DJKzzwVV1A1~C{4APnNW@zWc&((<4qfjwh3Zq^) zp8!Vw!NNU#V`t5cr?=o)vxTS1Rw=GHjrY>deRuA>)VV{L6`>+5LZ+cM5WEP4_?cbB z5gFrMBxl^qK(Fte&)qlPR7eW(xF_>|V62o$3XRpC5~FRJLX%-5f)k9@vIM$%Sr{8h z!z2ucIBN2oE9_2Xap&agpDK*E6q2IWC*|w&75*2Dl?v{8#w`qRj4hCRj=%$u5f<;~ z)-W0O*l3m^844i)ieLcI`Xq|md`0H{+`m=~IK$nSZ?5y?>N0Lpd2lsX*!nC$MZ9rp z>oauPUDsWKGZWTjEN+Y;6)YF)5y_><{QaUhNAhY7m(1Wr#_$20@jlnM;$C>kaeuc# zmIya)oEsM@qp!jArB>7iNfYE*w6jDP8dKgB0 z2`4QzqyWJYR*eUDmS->~p*B0{2vtjmlgpV3vVS}#-2Cgs!B_KtUH2o*-D&0yXaOu^ z`U~J>3?h}6wiouX7H(e1XuJ~X$yfF!NknU1+$gF@vJ11cp>W+HT>s(0MJV|77zePX z2#9vmw8Ywbd=z&QcMbh4hT_z%eiZJW`tJa$!G;|0Vv%bv4Os!12s|Q~i(739vgz+R6q$==@LRp8nElqKU#JDbGw5GhG?GP|T(~ke7 zDSo{WKWWO;*n)sGj|Ei$X`Y%Z0Yes;$Ueyu;VIfSNMb!kDu<+;F;(MOM7aP6E+>JR zJ1QI6R9IAVKprBldsCd!3JBeOsC)`QIs*`gruYs*JX!~U#1bH}1W4xvCb9~oby|d{ zFt5|NNYXrpD?6u@n{MEQj|C2(08(8W*jPgS6`_RJL6tTFRjkd^UZhB}N!Uw~Vg4Q>?*2N` z(Hju-#Rgl^RN_x!iJC^3G)-|iVqDa}z%;HY)l4y!A7E<#a!c9Zx@Cha?BC#OZtj2` z0W7)~Bng9(74EPwA`4xZ7+Vj<@#M?iY^2D|%Yr_udOt)-B&>e45lMkjeCpe@i+~ke z2d>!nxOgt%SlZ+uOo<+orzA|GQgDo6IBu7-YG5;=S_F3qn-%iR1e6wq#BEcBP*bX? zRgB{IAvctZZrCo{hF47al+RP7up(%~E1Q4{15nl7NVsVR;Xptn|0*e8p>4!Yh&>5)~d!$KuX#pqJ)7kVVs)_G3^Hc3aMXF0qEiPIj~i z{+QI9fUE(5DN(c`qm@w_ROUzdhSFxsz_$TVL_x8@i3x2>Q*zX(ZNXnGSxPPc&|Du?(v0t}#y6F(N|1--mYZ)XE%JMs`XV{G93 zM|fHT5TRp2*#n+vzQ5@PODdqj=r+{QgAA>xhw8KL;1eT`{<{ji=(DQu3%#8O|EIqV z{8Jaed^54S0+@W(1+6r@v#By&2{-74jtu_=(iOop7mK?bymEfkt??1Xr_skCGD8pZ zAUi{tOrdB#0m1q~7;*ljPwb!Xq#B`KnIA^n51j$bG*CdcV|4+s^-h8h%MbiUfxmB} zbJAvornRoVtvu^9BoQ|yF2P6;Y9}Ov-}lV-5gsn$#%~SBkXm8LdW1NA7Ga+&Lv##S zxgvR>SOK4dM25wlbl8S3g+`Qmu8@{=7=-4QHwaBkX_;zYZ^p?tdVa~=)=p)Br;Ca5I&G4cbWa65ZnjfW0PZ@KRA zV2w*5Gdaj2w3B5gu>+}-B&A`nxl0yELXC3=0HRJRicf82wIGer{YmY_$g}>&gXp!S zUn5(j;Fa^6+8k?*o3(@$uc3=sc2c|Xne+}(fK3D1KkkEUIOZ*YBPmb{oSFQZSPE(o z$=6uWNXpF1gj%}+L{m2Z)DNm90Z`6B%_Op#9&WByyk|v6+x1_edeRGp`PWvHzRjww zs{RH&Rp?uS8mCdc%YTfe8l*N9x9!1#=pr&KFPEdo$J9FPz%t2R(-JmJFg*yua?|Oo zz`uAqc&ou8+R$Nwu$B^Hy5}9?hD%3^T}$=u6k;2#=zJ>1S`^@kfH-CjP^U)3sNb8AfUU64&UJ&h+IgSce7N!23 zK4h?Vpz^o|Zfq11`G+0B;JCg3N>xi3|DcbsX7#rOV*}0vNANwh2dz5|)eiv+vPlZ< zV0DGzbWmr_6dd6W{&AVToNZYS*43V+CEB z2dw*XTb)`Kp!Sq6`wnG71A@9~-&P~mPA9G{CioD8q$20^g{b$6W`r_UmdujB`%btz zf%1DTm|@G?ksoA(9GGi{`92KL_FOO`QW&*-_zq&E={3sU!B>lGy1W*=O51!?aYz1X zZ!6lI+Q(X>)og%(APFP`-4_rfB24)7w0?FJW4)}OlpnD@g-<>ngA`4-TZr1#)H7hK zLeqwTvwlK_U3SWD(>MKL8FQ6=YVe ztE77vgrmMj@T=~SPa_Y(0{wOL!+I#Np90?!3 zlYW_Iwo84oyI?pUfD6^F%4UhOXphql}&j)@-+H&N^e1V&G8W7 zm>2M!aqn_-)pZoVO1MA86Gas#&K8U6Z!1c>lPeMibAcvSgL^2bJE2sOg#A$oNSNA8 zL5;0mQcq)$BK7odm?Oqud)B6&{&bG5`!_;<*cQ~Jp5`#x^SePaQcovQ5rTSp8ofa$ z!|#SQ0EUSdw9~+#4X;BU>*na!C_^~-BHk#3##PHUErl%7p6i~DW?e`343T-LfLs{u z@X)WI_A|=>x8@jjv&G1>G-#ScpXL}kG(|=s(y~(^_FDpMGK_Nc zDX78=(64xZgmYg|7*`?RJ!0bXn4+w0_yS~bZ9Q4jgDW;5G=awG4gud$R7z`$kVMDZ z%XcfdQr(lu+A9!!LZCitqfkEd;$fIT>Hee~(2EbnhoIM_Z;aejVz1o?OtNW)TWZ@hJ?iW>&=*v zHd(C@Z>Fp}sgLk$hM`F+L>NN(&+ui)lr-tcsbcvu6B;O#*CMh>M^3pLsgVI+FIF9S zr~uXrG_53d5a+pX{1fQ>rdZ6HEs37Zf!@#*S%+E2OZa}&6nhS_iL0(P!#AlZaz90i zI&wlNQHH)2%JUe90G6O5_W*{N#FU;Cb>tpbL>>9G6TcA){YPHXD;jwzS^)0_ym_>q z74N}_^%WReSAdQ^<#kbGBxty+8f&j z)X}WHER>f7f&Fb?NN9D=O5j6L2(bboSFkeu-P&@Bv zOQ27H{=PoSnmp8vl6&&6qu56M{o3v{8Se>;+hjO~Ou>II_~wj1o zk@0XRsfDXZ3Q5G57u-zF$N$-IJ~;#L8a(I0!K4>FM0zn}V81&7&pF7Gf;cbarabXT z5hpmNj7OQhKw&Jx@h=#8lMz1)@d?8FoEORzOHM>gDpD=NQ!AvOkKcKKDjBKgAci0z z80bkgi*Qm%oPb+AQraMOK}~U}akfxaJo7qIQ4Y#u!!Z)^DTt3lDla(A^u>Ro#yr%Z zMU8}y2C=p>y%6(qZ7IM~%`611Y!ntLH5erk{$mBK)`Xs|v+=_Fge{BG)5L@#nfw?%7 zyj=>GFEp_@J-dLXb%26DeTgs<=hTt>TeyJ-Siu(41NsLXGpO&Tb%~^Z{AA?S)rShs ze691jf2tun!Vd@fmSBKbe-m1x&%7~LR98X{K#0KX5^5R9i`0Ywr6!q{_)Ej1;Qa%> zzIrVr@kxuHW;Kgbp=%{j@#B6jCEbx##k&roW`eD2ou*e3dE}|W%>1^XcckpNEUK-h z5P)lp_>#l^tpn2Y;{Zs3e=UxdeSZMoSZyM|S0w-5usTa9ojBWuBm7DB!b~4uKhlBz zLmeaerpH; zojj8~uZhh!7RpC7Uj-fWnogl$LoDd3!eJxRSkNofi2JD#ccT$;E`3ycD1j zVOjJJ)NJaD;e202VA#c7b@I&Ch~}SmrkDy?nBg=G7nG>SX_T}o@>>sG`$a3rGcFLH zd!lTrNuD_l1Ve4|OuDWF3brgdfCl5%z)hI9!Tj6^4+q zFhb)Z(7=WDj*W$P6AHgC46P`fv|b`Qi#!E#R+?te2^sZ8<4vigh6|p6SdS(nQD@77 z3H&%p%Bd@AgXY_7eQF)Z?$i!vfBrRbS26KLXznEXDHAw#r9OD9jUh#SYb8J2i&(~u zKi>r<3oK*fmzU4u=)emCzhK7?I+-ZLLW_KBnup}EKEy4nM2jI^0~H1cZe0%M6bid7 zGf3yL;HECklhIU$M=Fn}hHw=pOq%g}wE~+=c3gp0Vi=C1)E*L8Jk^j^qWN~!tBVxA zIFAL-R@`%~D^i+d60HaPyK~rZb6c>T+=*lJ4U()55Zo7qS7QOzW{bWKrdt zZxveP{K8Y%UBQgOjX&`PcBX2uAl3U#(MP-KL#6srGVK4LI}S3TC!7FwN%m7<&Kk+j z+zWyUzDa~b@!ir{M$;*Z?=u7<1a@b0;SV5ER2A^k$v42Ej(k)nL2}HifaIu;;w9Fk z!x3#29Fe%>k)55z>ikCjhSe?c42uCP#V#vM}PkkXyDzMw;Y1*)&M zd`!ni)|dz1iEsgp45XHap&eWbc)$#UAJCNMEu?`egc9j2_Q{XlmT!G7d1~Eu#`X+u zismfPq!sv=*VP8;>Sd|zu>lT@Lc=1%xg!2Cb+ki@>W6@Zi|{b^_sxHEy*%usEBMrkM~W(_SymkAdie{ta@p+@=B^wfL_y` zVCO9V4d}RyGiwnfA@{I484n3ctxM@37Vhz4;hJh?UGgi4f)+Fgj zwfz)3I4@ap0LS}EpfFl#oYZK33xi;AN`f-`R1GfGz~MN1UA;%L3A+rja4SGpTdZ(% zd&SL3@ut*G)>|r(x+xU0PBQp3fR(+MVdxLTR1T>Q>Be&=7sJqlc$cIbAIlFICA9`k zO<9ghW{LJZwuMkuj?1w0$3qw6_Kb;3Wa-s$>5to|N`g$h$bh;#i<>q*1zj=k+7=9X zmaE~H6T8n3Mx~=dR1vBR7=I!EzND2w(tTI)Wcgi`&1Ts-s#cHoy2@)~*jI$T$7M=NOmzozih07eOX3y6FY z$<-vmhc7g}h21SMTuy{U_Hu`xBW!)NSuFxV4o`b2(coQi$by040j2^lj5@>Dq31`! zUf|4|&_pZir)tiC&bT5=DEb8oVB-ke{=BRWk-)HRHKCD>+*~I@w2>IW9{->OxDV$Q z6U6h1GXR}H2ppKW*-4~=JPXGR87nn|h0TZV_C!iMk(9)~2Zc;HU180mb;}qhlLB4+ z5>M0k+F+Tz_H8a0ib2imaGVW7zsYxSr?H+a$8nTHH%?}+U(%7kJAe=kcGGsHj2&V4 zRhw_8^@!rrA*-kvoOPvk`bZhla^qyV3~HbY&*hmv{C6PAGdJh6Z+)=LG%8?g!VYv4>7?x}480DZ zx?pf2r;<@vz!XpT3toczEoIGFMcDc5@6n7`UT9FUJqNXJ)}Fagj5W37KO4fv(~ez( zWkIINR`9ymz;g)*R%rVX4qbFh6pYqSw*)77aCTN`j`|K(EZRqgVgkVuy@}v1Xc{S? zCyKv_0P(s8@DZQNS6OQw= z0Zy3yz4-vA^Mi4d_R;QkAlx{{H~yk>om6Sb&K%^ zQonE%d?CWt($7mr!6~ivC^)@x|GT5$1k1l41t+Nf{V2GA&wqCmd6@dAevEr4M9n4h@p@?Ymf@+8|9|FpX`jY+L9B>2g&WADR~U(0eeiu#?}S- zAitMp0(XXcONuG~K;PpTS1CVtA0_nqm)!drb9b@jZj0Qm1Wgvr6{qBahZ!uOrugUK zSKz;-=ZQU^{;@D|Fnlh|T#INXRCfngvqlMHSwD5X|6$0-nwje;N*~VyBgjB~L{)9R zMB_n6?rUc1-6=8#Qz=>=%v?+EWCg!0m2mm#pbV8JpXHXg!85k6Z5J5{+L25q;>U(xPJkJRk&=T@YvO%`4|8N@rliMg)pyQrQ)btT7cjZ}U2m*CwfK&iNqY_~= zya#KhgA*j{`xxdL$&Sn8#5fz;4k zQI=&%TZ7v(;iIK8qEaIprK?7rOYdXQ9HFzw4fEwo?YTO5`sE@Hf%4sQiENlTa(>)G zsa^*C0e6f$tILzUrM)ATsZ$$RWMkVX9fE-oN}Kh0xOfBucaO{x)7*-r!H;nC5a64%R+uA&=A`g8Y&q~#^FmujF~LNkZ>Bz1^F2HF2Wqs z##{do1DyH}2fu+C0U|2`#b&JdZ*l`PrGG?6q9?R6jdUFabSB|XpewA%>yiIBv>4+8 zoG||~N`rI(jJ7T^C<$7?Y-mI205BFPuqAX!a_0ZeZ?KqPbLRxm+xR{Yh)yFu&GkYZQH3A=tTTXScZPv!DpR$IFc(jMW zNeBqJL(V@dsh7F}qL2oCsx(1A66Ph9`gX#4qsEzrTq|B&M#xs`I)an0wMS5)$2Udos)`5{mw!sc6_CxuKglhI180 zleD`)rM(s>%)igW)W?k*D&?HzyPpaubjQHM5Jy-vt(8x3nPLImZfELwkWe!D;EL6J zZ7XG|wguW7t4TrCs4xx7D6m5^C@4@4cfxqPjj__zwahi50m+P4T}`by8F$WT>LMw3 zJt-;4fHOO!COMOJMngWyT#rwkl0Z7kMr!yqEfHb51*Mzu3^K5gbn;coRsCX7xlws@&oE?dWrlX2tHg&J2cRmM)CtklWxEV z{OmysKYfbZ6s~}b8RKNs9JZ6Meh^rq#sHVIVbM<>diaG-puH9a!+vi6U(mnT$D7=O z<-737qd#Tk#c1yfkv||3M?P`ih^`RLQp4%@gAX|89LF5z>=wZ}EwUYRj5#fWv1ooc zWl%^1e9@@ub<^fQYotJ9ol>e(Ez6OCyE04Q2JB0rs8%_x2A67_g6N`3?cX`FAUxbn z{nH=EYuwTwt8Fo6u548LAV19$?h_G$@Ep&dLPd6L91)GjoPFYyx2XS_fY96`T@PHf}4y}yz6EZ*18&rh6T>+ZbXyenXM;;^cQ zOiOAzDclfJ6=n!I6$YOP&6bZ5mQIaA_aTxz&DJ)D#*{5-U<(}ykYJ2r5 zIQt}<$0D$Tg1?Sg33jBYR|#um1%R;fGugv6?O2eCt}_}@*k-lLKOfv1LF|OPk?)YY z#h*NP`=QhD5-C|@dZbD8X&!>gPwUMWAWY=4^P7pwc!A5Rs0YD2S_kAO%g+kP4w#&g zC9)dshj;_!>Sij2!i95!nib6om*v$Sf;bHKE`{A?DGb(8DSU@zseV)<&s>Y?FvbO4-27+NU*J7m*;^|ubnG2W`$&b3ejw`e zVxLOs!t7wXqLuf za1Bk7x}NTer9F`)W4S1)H+1Gs@`E7_-s(pgaNZzi_^;9)TM~46xQH!JS0AvzUQ&Sb za=JMU(ria)zU7;XrN(M0TnTw3=pZ=ILZ~Bci}0~H?B9zVArx6JThI@B;2c@{;{**9 zkHL@&jNd5JJzTw{@u1)Uty6lz;A~Hm^K)ai%p`dpgnKUlX-l+d5*$u#7CR?4=^&P1 zk*~FfpMJE)@BM95o(~|M00e(x@nc;1(p?xsPx`9wgvWF^u~3ftg9?(JAt8Lxt|oUu zR216RRkS`?cbf2C@t2V^i&HeQd#|e@OCbI(tM)&jn}GvB{}vql7neIGun{ z2E8PO2}M#*KjsAyjoyY;NXJO5H24Eug>faE--#=4KpRLF?xD$^CXQqbFl<(B*BaF zm9%$|ty3ajl&$elk&&qkiMf#=klv4v+X&fOXqruv6VOY+_Z7oOi{ar|B`Pa4?xLvW z3It&b*-c`W3#pJCYbI#PRC(Cp7vw9vq~jnMT^uXW&6XUj1aeG(uk>jIU5xZJg+RQ@HxZ6SZGq5YF{(@v+hyv4Gaw<~c zpZAt^Y%r)Cp)bK`Qev|AEe50*2RyLE{oqg&8jg%93cLQJpk`QY)YUgE?yXdNr1iuk z#wEvTBs_sV&K`-IWrT4AW-%VzF(U7DVH8oA;G##25k{Co#8d22p&>jQDY5x^BPB@K z*T-w7>gv^+iMsj(sHe4F!my(dx7T?WVY-a1GF^R~2A8i5)rd*R8xRV&rpiYulb?|H z#fb4>DqO=xg}xL~|KeDtX&SQSyVVN$?g+&mns<8}LBx)F^%}!aOQd%hXkj*KA~v1#Llm9xP#!*&{c+IiLy+d^%c@%){Pwrq|e1iy0Td7 zDDGg?8Sx#2;{rWfZ(nGFo=$W(-E9NrDCG$O5o5I1~`)RJn!2B@U(ziHfGkZHUXgwk?$_$&dn-OgaE=q zBkyT6$qdrr@8*RVGG%Ue_unzrgPNF_B*lPqw}fodrEO!D z?&H+^G4xr~n=K)Ey0koIsUf4tJ`d1AC8eyR*#VQT?TvvR3!)S8HC&k_&sg2X)krfj zb-nR+7fGILzIAn|u1Bt=rSuab2H|zlFs`T$hWL4s`dVBdt&v#NxtKt3+DBM+pO{l` zyxQf&J=gmv-gvFciE7uXt9dE^+f9gaz7bqYLQ@3KQY1MaIFdTKgbnU`^tLx zhd%>9f8xym^+s5^LEu9HJDR3qOgb)iO1CW4hw#ukT$X30k!CN1H&!e5TF~;=GD_ti z{s3m+V$WODJN(PhP8jepvC?BA6>;AGoOiKzS;ln|Bw#Il?0WfbFh{XmH&$S*GP!Oz zUUEgos*!&*fWAb=s!4r|oG(`apy~ih&8Z)_rfmd5m1qvV`Woo3SKmy~r`@ie2p$3& zwFv>*jTp*D2@_8T0em%I9S6w4cr1wL3TSb3@%tJ1 z)>1C2!O+n~c^(XTju?_of1{!HGy16lLptf^Y_!L=wk0H2mzK*cJ&0>Sn=#{88HFM< z)-D+c6OAm(Lf?O7Mew0P%7PJL2!?qrF=Fk~WAqau2H_QqSST`Ljg1kv5hJEGV??v- zwR?g|!9gz?wBbDcj($ zqgL$+my@eG^$x7T6ZG~Pzf}@Yb7?P&eCRy zB&p3*PRkqbDKhRoM;8!<85$LX6joi8Tr3nrRVU&rp+J>faK%avy@dpX(Gs#B?q12= za|IgWjk?PjH_=YalAcIn%{7NNR(3gIqFj|E6L?qSI3Z6ZTCu_~(#|kZs*gp7*nxG| zCp)Re2y}!hgSJwT_Zv_zmsUx&gBjcy*HSKm=W2}iNP~5TGaC9k11y7ED=5&7<}R+q zsK>R=pt4uigE^n1cp8H3perkc*07$`i{-4YLbZvJFDLI^Im0bF zlf7y{S_^a_(};9sfY!NC;`f#^HZSD?r(R7@>F@*#^IY;;1=N%B14pu>C50pGVB(u;Jur7Qik4sW4n)l$xLDSu(O*DLmtw4q@i>rgxS7x~Xi)33Rw=X+&`+81JG z5rh_9iy0Yoxc$7t#tj|E;5m9+FqFFV93eczDO^}@goT~E7a4Uaw*CNht;j?c$Mg8D z$#&RVmhTQ}!PV#1EG4@D5-*9D)UvR!OC5dq5%1YCqhew-V@7ELMjAc_=!sDVdy%>en9*m}r?jH`Lip`m`9-Wl^bFVqHOOXxr%`Tbk1GbD}G zLVfSI*nT7>WNm>$V;59gAk#>6#nRdWDLrMi1@`n*)D~dy(-nKw6)?CokY4S%BYOp- ziqgmf48YKMV^D*D)U;I|)3^er*6wsN-sI+v42;P^Fl6D5(C8##H1J+cH-c#$T?4GAV<6wcBah3Qv2D zi}Hk4?oLcupeqh4a1Ww4D{n=9dnv6UN8R9G4qdj4*~n^o;UZ5-l49aUqF$+NBN4My zx)HiPU8(&>FM8N*vRM1bhT&!>Uf(Y9lc4wcq$;hL3B^2`s>ECQ{;ZvRta6ODE8^?C9w z5&vIk4LalIaj~V|_@A^C*c2dJJ2twtpv%Vo;X&fgfCz;=GZK7DeLDdLnnGU#6N!DW z6n#)+BkG~VN3{haBT?UU%qXRz<+}^G;sey*ypQ3wzsJ-+G@f{(cW7kb`BtuHO)ZcX z9mzy_P@OjpdIVB{mLd=$L?8f#ZK7@{77o!JOU{bC)oyhsz0bQ=D9?*FRD3b4XfQQ~ z_&PVI9>8PHh=b(R8PNqMQAd^Nj=(C5pg$s|9*w7cZ9YMN#E!bJW5y8?`cls5U8wO1 z6yR1;RMm zBS=Yk<`R5$?;?>&;PeZ;fyKb1%)CW_dWvX9B+(s%T@ld`Z_-TyIC!%c$$~dK(dx)C z1AaQt8Hx{*MDaeZc@2t(Mi5d!KPF!vf6-TIX$u;mdGPFcfD5_(ikP*MSWV z9VqZA+HxJAPi_{j~O!Og$?f7KnZYa@1tLQPMRtAGOGjJucw;KUYrp+jJ3LTEGY z`mcLMQC%5#+&e_(olgtO8tA1nw*W_MPGO7{J4VB~IStgS(W(FUc%WnaKSBY6Z1Zl7 zo7`)f`ou?Q{ES;dr%1c=|Cdg2=bxS87qkJt4^u>Rih6z~JeE?Y5M)zcW;u0=Xb1|i zQxwbaDt3xuDPF}+QEYFOBs9>9o#G75FQ})NqLcerJNYZtPVS0Mu5cGRg|oZR#W6B_ zpVZwB(sanUE%XUDe9*jux&$Uf)FY@sbckaAkQ!HYO`Q>x7v?_aI0p+-9Cq_Ev5YYx+^Wk*5>n zJ$=4d(@m(V?twh|39_K3n0ox($KQF>a}41RAIPUXM^1ezk52U zV&t9b@TGVPVw^-V5A74=hfhjGBFwD-02dfEC+5|XaulHYf=Gmy2ly++9|9-WA#bN` z0{GFO&SanzZ2_t_Y5=0>Mk;|~w-DEc$dDk9?s(ctW{@+c7Jr00y;qCR===n^nZf~j zvbuuoS+wAFu4YQxAFH}Y& zL8tI{8hDCw5A1Hlu86r#~2GhlCyTk+w!{e z3G%s50GtK!t=i-XXt#1G7M>G`6k^wk&PSG3ZN!Fe<**U)LQz6^RIT`4XgfG-wWo?+ zd+GYoCsit@-wl`j-L|pqdi=etL3vok6l{I<()4ZY*ROYe_nn4&DyFOF7|V~_*h3%2 zPw02=s*3rp-=c2Ux3NzY?|0^u_aCgY(b!GqQ=wv} zpPl12^AGmpceaMLEku2bJ>v$h|AXbL_b%Vx;i8I(+m}A0>JQf4&vn$)HPtFcajtBI z&vrI8qLUXZFIF*wxQK%@x3i1W(jKm3Ppg;#cUqa(Z)cbIek;590OfhMbN9Njo$ci} zWb3fsj;NTQdyE?2eFyt%`@D?NuWnZ{QwA4j#qVH;bS?d)RVlAxQf7a;cf$@gzF@}m zCGQA<9G zc`9aS+4XOJ+R6IP+HP@D@l9d+cIk5*rTdJy2i& z+3$wEvx}`&`hFjg5BmDcTYdWTF7{&CYUeqFZm5`jPhKs*wTm@<@^IC!kB_RDqv2aT zdhTXl@rXGWctxXP1_y19PTbADUNtwU|FpX*X4_4l?>FvdFP!LTzVCqYcFpa0gWt_Q zUl~wyamy7I^BeP3?_RmA)8t>i+jsDgiaB$5RqCubeU{Lr zBFM5q#k}_UFvaa$Htx5QbE*4ptC*1w9!z;{54&|v&(BqLH&sl=8_KOod)PIO4@1|e zFRPeU8C~pt-NUNR^wn*=i1dS7te;@o!v<@XA87aUCKV%-{k6$=FFWqTS<~MSMf-pD z!}rYWz3jFIFR$*=C@;>jQ_SYQY;4e-y;IXxtC-rkW4GVg%Rb$|`kRr?`&CS-TR(a4 zeQeyt>ZNOY0^SIZp(T`DGZ;HcjB_OZXU zHAGJe-l1X~jlL`T>}R7t@oMw#T%=d8IQMAoe)htIO+5|1pm*Wrh)G-bvuE@jPC2ed zf9Y{+eSvvDo22d9Klcm3-}XjnZ@)j;Gwn9k{b&Y%g|#{Q_543shrKtJ9n86=Vz%tu z?DYGe>__&yR(){M1pae)FZKSP?9`}@RjX=BRLqydJ5~2P!1h>SU-;ytor)R#$Ii*g z2iOyLw~RO{odN#)d`S5p2iT(OU(b{q(VnTV?H~Q{0Q<*=&*%2=L3>s1d!xYrAp8E$ zKelQZcuvJkGW;||bC7k2>^*eWDezapjSl;F9AurQ{V`&~bimiy{VV0)2ifqJKVv)$M*Vt{Gpp)pHwk#RMuy{o5#MsxqHPq4)`WNKha`y9_tZ4+=F$wq+&*W ze{c1jJa*#3caA39s8umFj??<~HnOt1`s|0^Xy42FfrWF7Y*DIX#%6c$*Ub-?#ceUN zQ@d3T&wGygXGc%5GaK1Ywyq9x*z{P%toWd8L*IPXXX7Bx2UGr5F|mpF#?8-Xr+3^R z{n~Piig~!9q+we=yQyQ^S5uE4P%(Q8Q?}mEXY2OL=9g+7sTh6Y^Mp4F*xf(+?6ix7 zyt>@~1MidqHez}4<9A$uzr)q1Roe^LuXlGz{e3&&8`I~rUmq2)qt~>b=vE8-U%UNw z>VQM+-H)F230i^r)9(e3T5yOR=X~MDvWMs|xn1?0cOPP}J0u<4S^H4MG%V=(r0x*A zb=CX#+IB;G&bs&Jg+Yf|M$dNr^Uo(LM)gIZanWIR4ZSP^WU}1c4 zaUIIP&j0?y)5Gkkk&i7C&VxU`d)V(QRUsRB)A@XQd(h)v^#?1{3fT?c-0;(FhJ4xD z>Bp}Q6td?^pTz~~Ko1A=t~HiI_NR`18$SEesAAR}J-Rihh+XU9eyd+6)PK#t_E1I< zo4K)1+$#|%zw7Vn%KResyU|~4%zgyk1KDvOej_{n~r>2Br9Q0A2+UN_4R1q z-=dwzl(1c$Lf;-3(4btBudO*+!bT2`AAIWm1H^}&u5~YE z%~5kUUYrJbI$il|_}isy{|PhO_4oc@5~FJ))$d30%0 zIPy(KD&Lt!?*z88&?^voOG1^=Fb%|Jz}q`n4qJdpId#D zedV{}j`!5aANjU+>E)wr*YK|j(xXwIe0s~?UVpK}{}}w4(^c?)o?`K}xWCw8TU1-O z`8-uIw>~KOVclP>Z}ja=5hF1^&8cvYzwsA4B*O7RjuZIt#=O`!dK_aN*M7o`K8Nzl z)*N-3b&MVP?2Kaj8T60J%kysha*Xx5aQ@iWbJ4y5+b12lbBwKa<`!2?DT4gozkW}j z9Jt4^?ecdpP}9s+z)@4nLN!U;CcH0|h_v*4F?Q$4qKDrdXIU2@(M?-a;oy*j=5RRj^Fuyr>*8aD#q(XPEF5~?6u47 z{#XzL{>;1RQTy&mc7A0{3sWE0K<1}KYg%qS$z~1O-eXk;`rlhx!|(?u*`$WnD^(x3 z1u}1}QGGn%6#JFrY{8#1QD6I0@;eJpv3$3fAO^f|}t{g0ex z4X^nwoYfQK*Y6|wSLJ8e(xPOS*^8us%;2gb|L`;H`z<9dA0<75Jjk`5^wk;m_pf_o z+&BmRQ+9Ru?!p9%YLxB>zsYVAg@(J()Zjw%YNhfn&+xF(7wm3Yd(6Tf}Iia*P?kNp+by&d^{z! zf*tf$=iQtSw8Yo{S(EcL()_hK4 zZoiDK~Cv5Hb%_7Ky@mD^qjK9Q&#P+^Z7LWOW&qn)6zg=SeuYZ60w>rqPtNSva zJ-WoMeiSxwUKQv+_s&nns>^J@-Y%nS7hY5`3Ew#XnR%IY82#I>*q;G!R^i(hj$UT( z9y!0Tb2jkb?%l<4UNJ4p<}mo7q(Qg-}V}&n7^xiAk%9+A9k~n zy;HOOg9G>PV}3jK;A+3C?ETMnN0fEK_}F^p)o~wOW%ukmGvic0;FIv|hj$CFva{aa zvCOWQM=)9IlOw7B9KY#yM5*_*VqH~opOik z0N*z~OWv-##%e#@->>QteP{K}9dVs?XyvuH{i~ee4DI*IciVOxuVOzR zdSei`2<=}vuyD554K}>(o5yaLItDVXfqf3WcZ2nv_VH=y1l54FWS5>_wENI4q@VR$SpKY=?1IAszy6~T^m4fU?WsR+vNK1FznrUVh4!Dl z`=?g7*y-(G(|F$nJr?SR1|{BN|IX^Luk14V`@}h;HyyaeI^3TZY6?R9w(~K!+wknQ zrN19PD1rQOvdeUv%d^_Q%2u)4L67dAz1tqgbSJ7qdiR(DcoZWhbm&^m4xX4_IydkY z(C2TzPK&Eqr?R&%H~icska@Oq$7>bU?3}dGPURn<{H68rp#yHSzE9F7j+W#5TG)4m;^<*&63p&|km3CVfY>r-2LV?MR-tMga8-DAst|N6)ARp?J2 z{@!}?ihJz4?E|-V8IJl|?H=|8V`dfEl~Y%jLLO-kmlq_P*$0cxdMy75_>V~4J^hxM zZRq*>!j^Nv&#G=6!ur;*c^2b)4e#{|WU4=&H+gmqd%4%s4L2sd8ptpM;~xBiZ^g1U zV;#`H&ajK$G}W-rwq<>{&unJBmyehjfal>e=UeZ*XJ%Jr^)2m#=a4shrTui*%)aim z<@Jtuu57oyV)-328)B$Qx5IPSCkwm3XEL)t9QG=_eA~?SUHI4ZF?bedPk*|-+RWb7 z7A)_8XU~ZzyJYZY_Kr#OYZc)BAT8&OU_472{@$_SrkS1kaMc?UJclfs@avQtW;S2z z+$Fcl%w}|2Wsu|9UsG8-^SYV+#5I3n?lqLB=(xujLVwT!uHWPnE6wsnXUL> z%kTHEnAyd$Z|Vo**{&u$;KR#i_VTmbl%h*!*8ZyvKfB;**!%aXw=SAl)-LO5&IL0& z`@23JiqD(bvlIXFm*Bbld!<@+&dio3guk6qVP+4FxfizateO4n{TpL1oH4V~gDr#H z@cdxWTfWNEX0~8mQj5e>X4ZT>xcak`X0~_F-TU^Ho7o@dewKCZgqaO`wk6mJ&mRt7 zd)}+e%$^LDY#DRh%nmZX12|~VY)R(&Frkj@osyLnAv67-*CrE z&1~KM9ZXe;nf)T}qjzhI&FqY}RYx50jJ~nDYnvi7J19UmyKAADO=y+4+4r!S-R9Ww zs{bJ~+iU1Nm%#;Q_F+c9o)W*UNgJ?q_or0Tr)fH%>h9ZcbVC$Z(jB7y~E6=e%0e*-S6Oot4qW7ZZ)$PN6y!4 zelxT8e|h7>SAPXOwT}bJHk#RC?H_D;?O zjBx1>5kqp!>>Izlu2}q$nJv4xdd}~eNSD6r-OCwf*3m9NCRqyp9epvV%VINY+!NZ` zf03E}xFef3WPzFe^7~PXho*qv4>`6_%}04tUH$sZF|(S?$}8=X(C#0~Iy_E5JDz@a z`NRzHZ)g8rKTb2VN87fpn-yzjw`VfJy(XGj?v2RSm62xlr>hB*KM4oEY+C33|A)Od zkBjl^|HrRXgwllUF(|S`nrjHx%xmm>LRtt3*@;4X(?ST9eJ@*fO12o9HY%Zzy^K)N zHffteeP7o#bEUi6`~KXY-|xTg*F5BP_T_b*b6w}0=kuInSqizY-&to)#dg8D*UV{B zDQw`(>hXOXw#T@K=QoTlg(26eaJjG)ju}7t={ORfZ*f3e`mj>iI&bY~6S5TASngc5 z#T50Soi*|0z*0Cgg70t8uM{S|*`sG~gwJ>2lk%{hrSL84wo#lxDOj}War#r|QZUp? zT3N4O3gWd3-P^V;h5qf&rFLsm3P*2%UH4X{@VNYeVaMj!ui&|Hi)N)z@<_h0Zwm%a!TN5tmyHitP)t!iCbosUIH=d>ZVj; z3G^_-)5T*;Al~`B&+(`d=r}NTYUi^hAj)5GZSAoV7#flQ>H*dm&bq*!adTP+3u$bD}gDaTRt`IUIKl_mLH2~TLPxjUlv3 zi=k$OM&SG0Vi08HGG<~Pq`(EYsX#q2f3&}xQ>-$93B5dQ4^EP7@!SnnIV3o8Itk;RyLK)Hv-H3xcUu*M-;f2huYMGPVSh9I)FS*|h!4Em zm0biDcVB7sdr}04cjsCkxL*XT3@7-!xl#mg3I_}=JzfN5uH(tqyNZC5{%qi0{Lb7s zv;A4GHASFL9eo)vuL!(8L=@bdit&c-xp{YF5e)60Tol&72<~}h@rUDgDoy>&i0BqY zFmcP2lQorv;4)0RZQIXc}l zbBz5Hvu}_x{oLLSn&05%>i9c@UVViQb<-YHoc#*hgYwrTZ2AgQrkv}$d;C}MD__-R zetZ0$Up&)``>_DZ4xE3Od8q)ly!9TsYEuCi7}Sp_5ETG1Y>v6GWdRs&zQ=XS$cH6; z`>nFspAQ~mMQvKn&4;~b6)V%lOKFR=1+hGD(t7ibkQYw-EIpW)sqcQ>!KpTY9@ zQ10TMpFwYq`}#?lpWx-d84y>+otnwvv*UpyQldT(B<-to;_=xzg(e+|jjK)h*;1SgtEv(d}6VXw|jOw7c^d^qe{J z(*slCP}^0#UT#Z-MRqaUDi7bp_0IOZK9ONmCzG*OKYG@v>?b5jdrPU(|AflFr3hF4 z5htcmxCV(vf|$+xlH+*HFDCBR>UTF+zl)6fdNO#>or3+Ka)*cOy5YZYP=$x-MM)M# zNnxN04~FaA+}zFu!Qn&nZwJtM;SaHaMn62IN@@#AsOaM%Shu&2@;S ztjWAX$3{Z%H}n+v)xL_!R?`i*i_yvvg)B#4C>B9D8hEHtD@S0h9D%j?ZydkeI&{V$ z17}-~k8#uG81AzaqO{7?wMN9jxeQ}C*I)qKG)$usW7fuAywG2WImV+y4aO`%`CONy zV>vm-4a0pa*PZ_h!@XpP!Wa&-vP-}}ghvpgqb<5NpLFeMDCg^JjDX;xa~T@!OYx7+ zp$`8ZqDOL~-#5A%ezpCkauF4yuQ9=}3Z_OhB!j@2OSLwW4@RN!rD{6;dW`!39X_C$ zPW%%(Dl3f2QX^U;RJP_T5-E|fOGAmt&(#n~4UplXK6v5{`YA9@J%Wj19898q@DX4_ z-5C9#;XD4(x_E|(mLnYIpsaQoT5~bucPM2jb7(c)r*lGmeA4B#XY`8kXmwT5646== zSIVkMin)HE^-+X>g}OFa`vk0g3x?^|+{KAaj|ON9=n_fqVB5KeIbccb9;53Q+BFNG z2w(XqI07py8+yEEf}`gnEL=WHd>pnv@$U)RQR}w&DD9K+F9|h{?TN_~nMMKGsBt8` z*ZX2FHM&*``p{6i;pN7vvQEXse%?{ll-5Z8oi*=<(uG1S%lRkfJL5A3VW2BCXd*tvy={o3bLoYu@yc*6(ds^Xcdcxt?$W5aJ6Kl?wu4PiUXiAL(2Q?MKy{YHxAXezaBkB!1MlT93Dd?I#FbbFY{6r@qbIr_@Fadcd< zj=EMEx>ooE5WZ7kb+qU*YtRsxzMml1W)Dx+AwZzDWhN=>xLL4tYIl<893*I=F^J@L z*(R{?A2`IJYp~$PTmw?vZKt4IyN)L{2ocC{8IwehFhTN_cV-UUJ%S$NZOMq9`vk8C zIgmu}0|LD_mOQcHA;A;J*`&i03dVUa)b96B#ijQK0WJi6ktN1y+4Fn~5zS3U*5ekbqr0sbiMle%D!~c*!dP zZ_HHEVc8pjb^GZ&hn4RH)>#*eZmBZ5l>k5263i9*T* zldkc3vfbr^?9;lWcz>mU($C?E4p$2lSEiE0@fv~6seYvF#1BE&K_7<5&ioQgOk6@r z&({m~`Mn@zHflnIXLwwDb>T7J>!gE&rV!y6o@{Xop+xO9>9D+|&@Fc-$z9W0=rU>y zNx0|;hYlP}5^lP}6u~l*>#Zm3c=#^q;NMPIaVC`~3(^-}EqhNo?CdD)bvTaX?&&Nv zf1E=Shq?+8HsNu@4TO7wKa-*}J%quv&&i03J%wu7Iy}*}-oiB#Pm;3RM#4CQ?W8oW zuki5Q$E5T@KjHDoi%8rE9sDBA{_2fM9SU|7Up}UlM$bX2y>oq;zbnkgsXxI z$cPHQuzBfC9`S3K(3n?FI%tj%e&SW}xNRum7{}H;qN7mwwbY3uxFVs$4NFqgZ?v#& zVg(stHdbh0u#)FMjTe6Vo=0-WPZXA04HlR=`fOOvqAWz=p`v~+9aGiev;~B zP6&^U@-}mLcuE-RGlx%nIwN#X8o(FVpA}x$(c??IT@dPg>&=&rxFkH+CNDa|?uxKT zZv>y~9wpSRS;rS2x+WZcMZ}lhxh^~&>W}T=rjTo<%a_*Q7OosPo-giwSJ>lcJ2TP5 zd&2HLq@;9poKS1gx@)4n@j~l57ryvzqR{_&Dk=MvEG&5chUDs`2>XWgBOQjN2}iV~ z_+rO&VY;3_Dc$u%NY&c%Wp^`#=Rf!6bH6(LQqF7iqFM*VuEfuaU>O+e1%7nbff%yKc5S}QT#g{r&2_p<@ z%(&+j!da2Hhoz`iXu&Otk`DPL91!z_$91b0+J(pSWgiF#S$Ul=)@TM9K5l$jKXt%m zTavKUfS{BDzI3A|==XEwi_Ka9F3*y(z?PtCcbo6u~rX=F!m-L#66+K z!~^_@pS=N>Pss@HK7h-nq=R}tFs-=FoK}e*;c^wiqhDe-E;~ec_S2FPz`t3mez@0=e23J}&bG-^IS5 z?cj^`@`WmEUzj!17b2$l!uyH7&~mIV7=bUCjqrs*d|&8d>I;?qeIee+7reN>VBFOg z67_w-g5wLRt$cx}=?lB+ec*MC545fD0jk6YW*7Ltf?OZ4eeVOKUiv_n3?Il%^?}2Q zJ}~B<54^qU1CCKX@aDV^h)(&yfulZ`_J-ayUeM=@7vyDl z!D5LQM4a`4gS)+8y0;f3EcJr&8D8*lq!$Dmp}CD0bW(Uit;`b+rFud|v?pjE_5_)q zC#+xY32~O5kUGp0Lb`i`o~9>Q7J9(sOb<}IZ0&2LwBLfaw$u2pjAHm)m*3 z=4yB7^v)fe?z_X<6YjtZbcbtB?oc$*9X|GVhfr;Is3~>>gQsrrmSMrTuabY8zbKD5Ioj1adryHOma08^7ZvdY{ zSI|D@3LB@nLhMf$cyYl69@x0RE_D|eaAiFlwOJ22_3Pk!FKIfLdtXP7?B z85X@>3nI6*@VUcUu(-Ykye!wi>cZ8~WAkbVHCPRC*H^)X$*aKf!%DciekCMntb~w# zD?r<51yC`|p^IoaoPD$ma%L|BY0grZj-VmMK; z2s*A?1U-rz;nosI$jM#^Ayx|^E!6?G3mo9_)ddj7T>zOO^I_+&c`&xeJa8?W3$yRd zfpmX6xHrlcv}>*5(8bv>&e{q}Yi5GW{uyw2fF*2iyjD}kjlQ`8R< zyp?85ndT}hdCF+cM>EY){sSBNUr5NbGB79-ag7a}nWTP`k+DqwLPA#68wtBg5;Cn1 zmV`{#8@borvQ!Fvf{9k)v{DOs(HdyR3jQ-085O3YA=CWq1}d^WQju+G?kuvE?P=n6 z5^Ae457}iNa*%OqZmg4GL1%A_{Apu-nbK?|N6Dm2Q+e&si=O4v3gYC@g+uyn8ro?^ zm7^I~dl=?1O*pniKDKRqqDdXYE^ek=rJ|KR5jBKMI%R73UnX*a>4!tl@7V$%m$*?0 z4CoU4CvGvloM6mXsr?sCE5_t-QOl0z{C>tZQi6PFC7t*Sy3pKnY)y7F8yG!kva@pn z7S}$DX>qoAh^m+%`1F6QI#FXZbGz<0V|Y9E5?rFgWha*mE*cX4zcYqMGumxR8pbNn z>kw^ql&!U`K3zYwYr3IS6%@(!_$;iMaLO$SNKEG_nDmk})cta43UUB0{?*FRupZg^ zwzxcEO*bM1y9V+9cRiC`_hi>Y*>z9U51tlMU;men{FjgXmydk?FCY0YANemI`7a;& zFCY0YANemI`7a;&FCY0YANemI`7a;&FCY0YANemI`7a;&FCY0YANemI`Ts&bGO{Y^ zAFjVQ{{80p(yq8n-o&2@kV46(!4{CejplSU&YJ=6*YK3nvxvc zIt>pb(cN(b6T)Es6*pM4Udas>tzfyq7!xV49GbUCvtcWd@QAEZj$kWhN^>RA%n*ao z{~HoBX?E#%mg-6~f|2CQ&|vG342)s$^cd&Qvz2C=`F-e17Rj)7MxjbG>d21fuVT7(v>Bh19i12b?2_;gna1>~n$2`~;^|2ZO#%ym zfm!7yKUAZ+&X^#U77v`YGN8@qj}PmQDyB2U3}`iT%F&FpT@F%j8S1VK-Lb*g7Nf+1 z*y+<1z;v@`qr*q^pmDh$Xko~{s6pE==unN%-1#Y%Z$2GIpsXmk6zQP?* zyeQ=RM$eP-IF0zeN0Tq`nc57#(&`Z-pE+Q%Rs*G z>km<8QONgA-FSc(`Uk#m>9?+Cp?~1}CLL~PCjSH9x6m=27lnM^eigfUoJM@#iQm`r z~?sa*_ZYVK@_jw}=9roO2fpw8WhFf4Mtt9SpN5mp$oJj8td3`jeBZT)1tg~t-`A+) zB+?T3zWSAY$*4wrUpxkdCr7^T_jf1EGLY}f-_(`N_ygZ}eT6M4N51dVnoeX?BfjtJ zHZ#bmMtomOCnwVRzu@~CZCOr6HRAhbeVIm@{s+Eq{fsPL6!LwekIg1Sk?*T{X(Sni zeBb`^&OFZlg6})Tc_5k5i0^yx>$U6^6&L8-`++Wv84)T3J=?x}Bk?$L^dMhsj z`M&&fx@1NpzHjt|Wuz(ceGR^UB14hyyWZZ9%xJ{-t?%i=%Rs*GE887p=zrk*Ui_I) zhW-b>Z-JpR8QO^N>sAp>%8~DTX16YBihSSnz(CTu5#M)s%Wl_9|G@X{l5m`qBj0yo zuWn=p@_komZ6P!M1K+o;71rlJ@O{U8I!k8!7kuAnp*mlVd|y1afeb~yZ?it~Yw|{X z-!@@0_!)oT`{FSSq%-n;W9p{!Es^g#W$9cp3i-Zx+yWWei0?aX?_$1lBfhV!yFZVE zeBaZ?)67B}@qI^%Mvzhe3%>7*IlW0vBfjt2RkujfKk$7Q-r$jzf8hIS_3F>hXvFue zyK$YgY{d61GoHiGK)$cv9xZ+b@_iHPC1&zQd|zSCaDFKAeT(&$@huzieY<*&<#YZE zzVBVf<$MnEeaCIOMRNYY_f=byK!zgU_mZ!IjQTJ5zTz7X`Oe7qy`OxDpMiYes)ru@ zDCGN&xf8~hBj5MTyk~ql@_jGl#_}!y!1sM1E8<)Jf$uv$^%y_&FW>hs-}f)y_y1|W z@4u}D$eYalahD{{&KiD$?u|tL?{9uE&M$!83QTX##m$)l+=hwUR|&C_7i=K+r)O9; zxCgf_U%{B$3S^8#LSQh>QpA-8CtaE_94itr4984$`ovL;L~}Zk3~Tior%*NMXq|(p zm=s`azi$zksbB2^4V-!f-NXDC24X@+^Y6OzkbP{Ml!-_)e2j!voM_>} zy?)=qF)AjcPXsUoMk5YN_Ka4Ax;kA{GAqgrS&a!u2yHu%F=KIX@@#{AT)Id$^!dRw zNmPn|8JIpzo<(k~JrZl_GmmZcwJ=fiLwCE^Xs<*`^E-_?Dc$K4U|-@NQdN!PaW`lb zo>=TxtBWU1Z?eWbjZ|e5&}BnAYKN&HeY$R2CT)}^s?07w4psQjhmS%5qN7iT&QE z;Gxy0G}G~;sOuCYnt7iF?{$4zydx%4nd9eQPVzbfJGftV->jTWZPXa_af(+Y@b|hU zl)f88y;F3QJ@h;ary@gEyIvb2Y2W_r0CUfC@aEl}36IQ4YG>bVBUOJJtyy}Eu+&B%e9 zYI4tQx(uhgdi!-B+CxG;d44iw;}y7_a{2M8%xRLAZli>6He7|B+sgxIb(=)3jgPSH z?-2#h;zBM&Y?(<7Ie%$uEB9#7;uvfFvazS86*bdN*>nx$uaea7FSn&$--s;3B@mF$ z*ZVd=+mbqVcgp1FuGfLQ%CX!3oFjQ;vC7!Mw{M!|)Zo^8Kr}}Rm&y)P98@^*3o~!z#MMX*E(;1Rh zVHyjHmfit>Zf4gr#dcJyi32UWF1ZU4U3o!2$Jxf#wv)ttpOReUkmMo5k-QV)Jmq?r_`&nH&u33-(oKqj~y?U^eI(?|HxWFzE9%ziW zc(q`Kq*~eN-RU$f8C*nLzx(?yq+Bn=)W?l`0M`e4EnPVa zB+Z_kEx0Fm2=kmKuhzXhTar?E@KbAk3h1Q9nzcJWTe7~HruV4F~bKg35PO9VGi^8CWc- zONSrd*1=)V#nka*Q@3!+9)sV6xLLt|e2LCMgK-~opFr51@jIN)+DUFMX+ERYC<7+e znl1aVexoF9h~dyK`k4^!*&=o4dsoSRug^+|_?$eD)9V7`cwB zi(C+XVDn2j`nJn7Kbz5#W*huwws3j{#K!cnj@Uk5?fY=M*Vxx^bJUT35gWZJ#|If+ zIX&LMtSOpXN3~c-H4}GmGOc+7hsUH&aQ63-1Z(!P(#?1a1<%6F6O(+YGlpA+xtx9n z^^@0JKhb#uRkQALtJxdh!{;&1^}$m%Nd{~wO1&~J8%%119eVCvMv-$m`W9}=0X`WQ zFZkk2X`haFIjSy$Jz1%fQq6)TZ^z7?+x`KbJ14r)uGZC#YUg!->zsg(pq5A!b#vT7 ztvH^ZyKZDISoAUv?>2fBmG-E4pkoQ16ZcdeK7Za0s!PWg-G(3i1mojg4;f?XFR`BM zKDYU}&yeB{9WplhN;HaY&dn+K46EE@?h8%@Qg;Wt^mrZg1uV}ezfS$KL9)wpo}Nyx zJcuu7!{2<%QF2JodiTLwdC(?#>q2w!c8Tt;J0S-q=EI3V+YXV}CQy4K!i|ly^5Oi5 z!QK5GHdDz7t8A9fD}cn?DZXoNI#KhbN6&lUc`OSDYh3h?_mS+n$3IU*e1+0LA(9|n{%EdO3B2~6vvb-<2g&;AD=ysL zc;490$0uVdH%nISE?O6j=TuGSU0v?NnrG&=l2^SJ0R&f;{1bl>*Nrg zcj|f4059rF?=*|>7&)v`v$rDcc2j-i^>5C6mqX`{9lj>4*hLjzFsofMs0?1dZXXuXGhrh$lW+sYdEp}5@BLa+V^1s8|m1fn#HS4IJ-Qv~i zOv>TL{8z)TMjxfdjz9T5e@!|3=xKd`o3dN7^82VQu@}nW;oOetlM;7I4(UW(A#%|_ zMeuf-`(DYx!ChyX>sP?Rl553=tyWUnZr*}NV=Dmme|-DS;vkiqUAM2px(XQBVH-Dh zd4Oc*2<_aJhb!RX$G4BR^w>`=@(RD(HogLQs|ZUc*R_;l)vl3~zf^#H!;g_m$8VM- z_Fve4a*Ij`jTuj@Z5<>TaJGaP+qV+T#{@1ux#Os0$%KfBPi9rZ#;a;`Ph1O;9Qirz zKRm1WEiwZ;-WKkQfh1^Tv^{En!4*PNjV)IJMK#*7(5sJ*xuuaWZGDv{IYfx ztjuq@{%2a4q+iL2lRHeS;C;f@3qKBTq2`uf9zA#2nUk9l?qu7bQ3uPjC_IWC!$bYa$o(^YUb;c=%f!vZDIf&-YVPo>jca%BuqS+CBSi;#{iqx$ct6nkww?Q0yFah~h1N zv*S(cYB*=eIk;f|9O_#8u@}R;Rf8n#=)L~Wj#K3eQiTP)YPfo1)U9q8j!|x#RtQxvbtR9#8Jc#O6HZjx2w;D_;dQ2Xnw_ehI^_j{Od#b^* zD8A#Vp?f87KN(NZiL8cz4p-MErtgu=zigWK`errEt*iJPbz&>kY+i)z@CVi4R=#%O z6R*7zp3~8bb6!+~+3oMGPZS-L7&TXPaQs*e0=t{z%fEY5Ywfy@SzBBUgF5%pu1{Je z8RMHi@tC3-+W8($oqWxQ;;+l}R99C(adE-Oh=s=_#no@LZ)z*xlB15k-q7O`zX#uf zALuJUdO|uXmUn;>9N^6y+g$;d#rHc5*}GX%UsICbs=orhZQir|jgtp8X4~>K6LSSz z%j>b@u;u~D#)Y3E)5a>`#Xz4+UxI=qV;|;>F|bs?x{Fhel5U42f$D=F&7Pxx@4DY3 zqjW>4^?JGPM;0kSFI>y;#;^`Rt(pjl|0aXBQr$JeK@QSnH>N`5fzrH=zfqeVu(xy@M36^X-;_ufH6Zg!F0M zq03GMBn;8@AM3hZGBr4D{LI}72);AGSTHP%THkx(&%p;2;IRIp!9z_?N!`OWoh3&U z5K^%JX8+ztsWlTGJJf|MU~$$h%ac@y>Kr8YT%@MwB!y87TG@a{vN)w`P9i3VRKtCn zLKaB?^!MzDxt|orsU^SkGkE|e9_P=QxDuj(qV~+y4@S!C59o=8i8EeyA;2r*>50cw zLv7ulXU%AHa=bbd>bJjc&~3)2Js4&t-KKAY!TCr5&PRSBw&RjzP_8>G8@)cq z(syW}*GKenDK|iW+~j75lNWmSL+|RcsaM`giC1$pi&f5hn0ZYd&TFjj9tsZb0!vO* z|2+@F$qXK6V~GQ67dcKvTrzNPTEaKHfaLd9HG0&~p-2B2c*YQueHnrC5FGz==(z{Z zMeK09ogKYjklt#C8y>B2E@X>y2K$G~${xq*kYFJ*k)kgu!if?N=93>`CGaYUJ2BKHSUZbA55KQ;64e<2GBx!Sb)2CX4}2`zN(Zn(1=-?GHV*EG z)Gx++%h3sEC>+eaVdg~7j@X$~1)B9!FiG@BcY5~3%$(@ilEG`GJ3Wi~J#*5$f)ghJ z{hw~oDW?AT9Oy>EJO`}HN6b}KXu7Ppu@I3t8&reMOZ-E{8&g>##-pu{sJ{4@{*Nv3cbh{~in`xNx{;1d@ijqfs=8kd-AH`3unP3_HIY#uUQ5C#zpZ{K zBW)6zx{F!&Mrr=e$ghUZLpPAtmOyE=L}(YwV^DzAy+dG2K#P%#Q3~B`+Y01pM(Ey^ zPfzHkt7i_#Kr|8ifo{-X?4HV*B`W+owizpIJoIfT*7U79Prt_hME`Hj_#bVWiX!LJ=sAl5IL!XHI-O?WaItGO$U9GN`-KB_-+UPyMj)ShD zzgKX=6^ht+{_gBw;gGZOm3v>SlazSxk+)8D5pdRa)Q)MJ9#P_?LH1qhPCz^GFzn=b zmJ)lrd`kLt62=dH*tN@`hm<&VdD)U*r=XMF(S($74=AGEq{XkFry;|y+3d`axms zIk+0;zUw~!9wiQ3esEIldAKC^2<`P8&#iwU@H|{|0m`f^KYY7>iz1SSmt`w1f;j7X zH-~(@C*?$_S3AWeXuj5Nsbu|_cN=mfOWUiBa>?% zP~u+$Z_TZ|3bOr_-OY7rlz67W+2b`)U_4#J*2goE5}9bltyV-s&%=5XUgX@S#FMuV z>0EscOox@8^lf&B63_N(6J8kuA2*#aZ@2OuCEdM#>96wZaB#8XbFEO!|JAeUX5VkX zqGnsK&lrODbWHj7ex&>++>4m^smJT{6j9c!Pp6Vw(C&D6mSLyM6!F7tY;xgkFuJV0 z)vRL@C4K*N)~K(sud#CFul(^T!b=&jqz#YzV3$>dJSp5esyF<=sjU=un8uIVkMWSO_tKG^-4`i5Q|j8i_X*Jd zQmZy!hCHPl93K>vyi9~qla{{DjJiz`)8C#C%1D9-w;qI~Pk2Z&R zd_RVg^0sYz5&r<(6zx`Ky~TSV=02I?8T$|nwoY&DNrq9}qd~cAqEg_vr_cW3o1!W1 zmQ`QRMW({DjN>g{yPTsO%tT##A5DY)E+X})hm>8805M= zE-)QzD!v4V9==O)ZMYw@Ha!NXOe=Etx(Ae~X#cMEE1tmJ>1tv8#5N*=RlibK{bn0zf^bIS626u0Z-;nS|Y zh947$-O0FlgW{~5HZBX#&9^F;Fm>otDJAcno>;Q@Er>jf!b4Z5QV#Z!24N%Kf&a{1 z0_|5Rlq}UE^}5b`IKISlM_K2mlx4etV`k;NhyFq3+5TVsDbd}9noBQb!(dOnnz@-z zC{BB;*4d&Da8=lSId4!Lm16pCuMeIBAN@t+hLQeL>fEy*N9GxQ1cS0qdPXmfQ&Dv} z7hB6df>Ve20rp4YDAQf0cDwfFLeBIj?H0X0Lfszrq?>%)C*bBP`i$n@q2&9I--fbJ zU~D#Nj#rhGk{$1JD&)Xt2)3%TCHQRHq{yg0^LSfwcVO zDZ83EP-0o{;ZCdbpx2!U@ui86DAVz7$!Cdt(3^S2o8#2M zD!*r~@jPXT_SGOaB9?0Zk{r~oxg4%#TE+!AJ)&NydGuXsA%`Ctb7zjTPodIhb(-*G zw;U3P+?bl>{?yTkxdTI<%VDPYsORU+NmRvfU!ssx1`hlR;_%yKN~T?tWiX`-w9N}= zoVj{93N;4iQ=KAV1$lCFL^>SX+PFv#j~af#+5>fE#y?yFmu!=dPrQB#ffQ(A?c z@AjBp4kL>W4ZW%sLs{}Zu3E9P99sEq@G~!dK#dj0Smr$_hh0yiogTi#m(^yEl^uVU zL#cGM{r$qHl=OIyQO+h6(5`3QO+D*tRKyII0IRtbkaVed(Am%Kly?4)sa>~J0RPC% zD2EGAsngq*{N!Az0Bg;nJF>o!l=k66@ovv6;M2ticISp&q1yLZ`fX=b1&k)Fh2ec3 zQMbqH*9La1gj(HiIuq94rG6gmzHi6SO3;eA!?&M!iaMQlinn%cB^-C27&eiE?=K6z znU*Ijp;PX$l#B#7O7gZ#QoD>wuo`S#=iwROPx2hDp_ z!GT%Y_gdv#pxmam96N1P73^F`7PfOur!-c$42*K9f(4JKT27jEpOPGsEZXW_1=nKb z%X%7~qAV?sjp%u>3X+~w<|uX~QLCh;1$UyVphwGykTlK5)ZXYEpB)dYKml8Cl+HS3IHi4iVL8tK+w z?W-Z~a7&#V8tD{w#i0w~hSktT{h7Pzshd=WmB!a;qpRUMRcqfq_%ZdO_33AK?5lyl z?(u-{{rcmllRBmuZBG%od>SQ@Bj5<$*b2su7;lj7Z&$8x}UN& zjoe)Swi>QkoJ&7a5=Ob{NA%y4Ukz8nhw87gcuWOW)dc}&RPY( zs$t}j>3e@vKc$j_`ssadf%Dn0W4pQyPNPl_&)G3UPXVbV>a`QBq?A@?JeH`70wNU$ zJBOPkQO3#JH(K^mfd8`t*N1Cgr5q}Gjx&ZRpso5bLOS#`<*a+X_?%Dyem^d|ifj_8 zWu1)b4oy~o+XH) z(bIjnCzdh{)}OOEPyuTVzsI^vyFs--wztT3y8>RX$PkQeafEvP^-`yV5Cs?uepZb7 z`G`^!uYC7tuL5Q^=i4-sV}I%#eAoAo0!|T|1cR3xprYPg(#$)i0L9td8D~c%QB=_E zUz#TskaoE!|4#U0)%)393yh4Z13D3W%I+`kdifMK5|H zcL>vU(tYtZ)>5RJJfjWogk%;nl2UPI=TdEes}G-=NzTj>+PeEN;o-l`Kxl;*%^c$>NbL4$0z= zEbhqSjV#W{;)^V<$l{4Cj>zJNEN;l+g)C0U;)5(M$l`%44#?tvEbhnReJsw$;(IKv z$KrV`j>qD6EN;i*bu3QD;&Uu6$Kr7;4#(neEbhkQZ7j~l;%h9f#^Px#j>h6=EN;f) zWh_p{;$ti>#^PZt4#whNEbhhPT`bPU;#(}P#o}2kj>Y0vEN;c(RV+@$;!`Xx#o|#c z4#nb6EbheOO)SpD;!7;9#NtUTj>O_eEN;Z&MJ!Il;zKMh#Nt6L4#eU=EbhbNJuJ?{ z;yWy^!{RwCj>F6(6 zEN;T$B`i+D;v+0B!r~z;4#MIeEbhVL9W2hl;u|ck!QvS#j=|y=EN;Q#6)aA{;u9<` z!Qv4t4$*)=sBi}sZ(wl-7GGd-1r|?WaRe4WU~vN$FJN&379U`70TvHnaR7GxpI!H7 z*ZbLZ{+>gcY37|#!2TC;{eE6jK)l;ejQP`-^-_<@+cPa!MrEpnNb^*qUYoIX`} z@xq1s_`SvVy}}niU3g!#5gtKrVruFnNapAU4aF}me))8q&oC?0^m?Mc8)G)1xi+{g z%rS6a?DjOTN8eHz4!@4=Q~eS+8@ti5WdXUkVrgt5LeHI=oMSO=@wuAncn%=V*P*|h zb~?+HY2dm&$4!gAjvEd1d3m`Qr~psn!@$OTt}^kT=>A^mPJcY@5ic<2phV&m$F>ue z3fIf+@pg8*7Z?aH+qRhqtYXsWK5Rn)w_w(+Ocj`ulB*Ior`RC(Ob269zyE z6K9zgrbZvzhsCj-$iWcw8aPI=MfidyS=nN~woh=q8xMY?KjO9@u{=qMzCC`c6F;Bo zn3RrKS<4g*z+6QwRe~?fLauA?;G}>eZop^xwy}m-ke3>U1?>)1)n|7zEZ6nXFbrO7 zs70$vb1NqDFUy&s%IEw~|I1;>>eU?w#k#}|yxva|*)f)G7qU)$g{pBR&ZC#NS8ING zPh9KB<CC54;!h5)?#XkP?oN(NS$1Xk z$cG;p|7;^%w^RB5I(czcozCO9mj*43%BOy2{8zMC*5Gee`ty*xe;Pa<>FabnB9HMW zvx8On%fNP%;ofv!JdEn7zfvs0`(H5skIDWG{y{tP4#&7$f>S5j^m97$jrNzBRt;CB zF9VCCp}qqrAB&5=Coa2YUPSwgqh%W#;%}HUZpj9%`*GuUnmt_^TFj)MXXDxs-$Zd~ z(u)KjV-6zrnxB^JDz6|2OzIdH#$)_J39W zvZn2a@yGt(;NPVE(f)M*SEVm&+J0$&y8k!CZ_@sm^s)ap#Bb7nnDnv#tNb&X_CF>* z_WuU|CjFQ8r~AJue<^Km^piKS6GW5uN7MLC-#@fJw^9DkJn{ z^!-WuH`X6CdH*u$H`0I8_cxP%qvr=r-v5k$qvsDzz8{Q#qxRGE`@{G*YJbq=`^ES- zYQNCr`$zlB8nu6D^8KX!8~2~4-(T9lasO-j{btf{)PLD~uV{Dt$>Q{wpP$P840MT5 z!+-tbI^prJcU=Ct0ed95;#yCxP!c-Jq}NM~`^SFETr`=@E~C`~qz@K|If-kC>Fc76wH}+(d3;K%jZ2raY1! zNovp|NtZHQsiB9Hc1TgTM;g2>O{Snnkw(TC7NtoiMl$qtdcemwRk{nfN_PxvYs68S zanNXMqB1McoQHp<7zan0cD6Vkw4><}+31KP%{d8)zMbjnpudhP4w~&#(2E}A`ABgq zzStL)EB1Bm+jxveM^cXS282}AzoEx@9Mw1v_erzlafGZ@dR7T}!*_uFp0nQ#_WR9# zXV~vG`(0wc&+K=M{T{R5J@)&{eka-QE&E+%CF{`muUo>)#;Rdb9dr>&@zqtv9P*w%)A%*?P0jhpjjJ{MdS{p1-R8 zzrSlu{Mm6Us|R+R&FX<2m$G_b$Dynq*l|Cr2X>yo>H*m2&bEKH-fTZ$>&^B9w%%+% zVC&8H1Ge65KVa+4_5-%wY&*v%FJ_-UEwA#HE{)AM+dzou`xRq1DgERP-vRdhuXLBi zDbEK#0|7O?Mk(DyQ<%LTY*F=oP!i|h1zoZdF1k4(I^d}k)iyE@t|X3Q_p z>{2}lBOu?;79-NvDeBXa;{6hQkcj11>(v4mw6&ERis-KcGRTVB9(m(s$Z-m`!vFlz z2z94z?G4`yGz`wjR1Clpt>rr~sekycS&wNr;q8j_*NMdB%l#5mPPjhdQh`qGGz_yf z3{kooYGvd6{e5ZqN{s@!)2T`4-WA{v(kRAvHW(n;W>WU7p7 z^K=9wdZ7nX2^HxExTCpo2u(R1U&W7N8i~A~5qM=Fo{htpe@ms0R24#LW5)&NW9s|| zESaEhBVr{%)Ygq2v;|l>V&rkj;p%PzR({dSjCSSt!JN}h*i@52TwK)0X7(BI{D>LX zf53SE`kS^vy-l3wWy(RkNqBf5LA0w{%Afgc2j#k1|9O-hK`czkTWC@3K&2en&}m!{ zL9Fr&m=}5Y0HwRFW|i#?g2+5N*jaF2NS(}lZdUY(AYMxrbzd_Bapt*gGt}Ct5uWDq zK32)6sShUSuN)q&M%;v%jcr}){m)Je-%Rx)+fI$lQ71HaA2S+%`yAD8P<78%9W;oxml7O`7mcAzwk>qfvd|#h z)la$brW;UaQd{TI64d zk7{{_@|%9ldH|_O?0WU9lO}%;^|tSgp%d0>5-qK|<$hcgO7*jvnBC%{Cc&339*}3Y zmzvn~vi{n9O`_Ef`JuqJ5meyp5m7#d&57pkU5Ft0A;}$dU^3<;S$Qx;_1-x+!jQ}()zpMb^EEdPo^H)W~4=Y zP)ljwzQ;bQX!qD7Zqo!Nrg!_B9B>FxH8}Re$Ix19t%0DcrC2?=iVOw(b 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 z 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 D`@LmYl{ z4#lPwKczH%WG_4bV49-7ilD7SyQcKe&r_QC5HKxU9%*6RssV(j|gkF`LFwIU!UA4HD zmOLjtBP|`I<_Onx<+r7>aD-7tX4dq~1RUaIpGG;k<8yB4oR;#=p;L5l^vN`#gTXs( z=JR5o=D=|wiPO@uZeX(}eVU4sJ&>%CeMAPOh3bT)Hp>!e=`FKa>XzEmSWtQzjwG5t z&B2}GGA%RRo{&6)&M1OD|6jp_Zq2ec%ZP#buj(+{KEHX+mh!=%m_5w_&at;mQydPH ziBns+kvIcOv(1O06gT-_T0z;Q?g{)pgK3%elo`{qQm41TdM&0Gl2VrV6cQ)RE7Ocd z*iTHyRY(}Z?!>`LH*8ptw!u3d8ap?`jssBaD6UPqisPs;UyEG#4`uPfu316SJXxuk zS?TF%8N}#mH?*WFk2F>V$7`fzWhB`7rCp9M1)0!v#5c(=S<4zLx$F?q{XN^#0;~e$0@4AofN%h%6%+t2D1h=Jsn_@sBE3e%r(&#SG^es8?S$q@TdTe_ z&p2T|9hQ-nmEH__tLfUd@O($+{V%_G6zjL=QnHh#qTQRBQ-X_mCb_BHKzZn|%+Lel(0 z0rBmle1}`@oUp!zKm8lqDh|dBlt`$c8IiI(qt{Sq6uE? z`H|!piZi-!Sfp(N2v0&s@~Y)ZwvbT7p;Xyg&eOE~8%q)qv|M{hTRHw1&rgk`(;Tg7 z6HUtF@<^N2R1!8xOO2xu!ynPtN@FDTq4ZMJEjOSkkGDX;RtjpCujPLGcb(QOl}PY5 zdaNm3TFL)!+S`PW#e!SQD5Y()GFvAS=wt(M6Otd@G<}xh@t$);3Uvi3vSY`{~)I{pD-5xBNafBpBr0rE*efJhEh-Gb2by&po=6u@xE6G zwl#gUoClT>1~0c6w-p9zmX9Bs|8h%Ei+R1ZZM7Skw~sHgIYnE~PONkD`X507teT*n zL2w8)t*(p{J#bUq5Kq757>>ko`8Z?Vw`neVTII{){{-w)o`(Ms*ta~68NrNUM&o$| z{tv}HT_5;e#y(ckm~Uau$ojr4hF0z^o%!d-_z3r6P=^Q^@HwywM(bHKfsJ438iA)7 zSQW!JZn-pahJ}+&4`7)vaP43gJ=0jm1fLYlN`O1fcF`=BW#2<5zn-%oWY{fL%59o>S$^WEXQ<*!_ zt|;J4LpfQXfI~u|*7|P(TAhj1RDKA@jakS|Jwv^#1nr2TbcJ($*c5;Bp8ThN3niIy>w0T}^@6q5T4$}dUbmu&%zEUXE}tV`Dt|`4 zO1@6MUjBjnCwU)5h@!t@pkk0hu3!~9g-P+0Vud1Ku}ZN{aldM^%AtB(R`25JyZRHxdq*?@$-3OVoSS?KJ_KKur%#kfuPh+OpBI)kpaXx`O)q&cOLX#=!( zXv4HF?a$f{x*oc4U6L+Sm#y2RJFgq1pQ(4~3-x9CFZ7lAU-e4E3x?MXdklvSzZk9? zx){TZE@QRv4`U}&FH?jm$~4`y%XH0jt9h+?t9iG1pZRXfEQ{OH!FreVeyh^D3DiZU zZM?AUCSN9hR<2MO73m6x!l_uO$X4VkmU=0Y&PpeUJT+ z{fez(KU4S6C^dPS725UMx3s&pN3^H4p}L24={kqbsauHp=jxW~R_O9|t90vh>vaXX zLS2z=t1d*()be{4yQ%uB?pEEWQmG88C{?s77Co1azH_P;qTg1j)~VL3_N#)}0qh;> zG3sa4W$GW)f2jR5k7xpPkLjM!{jTe(57LL}7wJp%2lW-8PnF)I_cMeVb{j?-CmClL zoyMicRmK8Sp{dAJV%lpeHIn_GMAex%vI*==I6nsh1OzgiM7mn%zDaNW4!{Z(&&ay zM;;&#l!wUs%UQWjZj;B#56klvYZUX9&nQ*aczeyDz|K31QkPX!0M_0Q_J>9vOU zO^k&$nS%Y9Ir6{cGDSN@M@45vH$_iHAH`zj7*&F5i7K7#tSi^uVR+2&ml+9dGHxDU zr>s=^t2VM`?GUuPgQc^jpXC9|OpD9%isc0ATVbiRRH4o_mRiV(ddqbSWAzhcMGw%N ziIOpsf$lzevOH7%q&!c)R=!DIDX)>&%R6J_UsAlJ+^YOg8K|mLbz(PZH*2?Ow`q52 z-_gFO-KRaMJ*xd!dt7@?`>5`2bF$?li_&VaMp-9Vr&IsM$(U^5?ktaxXDD7!+^amO zT%cN`3Sk2U$q=IMuO6r#q?W5$wN7nP+tlIe;p#|rlsZ}+t4>mU>Ui z99ExFm#aPM8g;F@ULB|j(e&5+rrD#7)nC@XVffh)ZJKF%!gSVrpXFf-3eJ|{dk+lr zuyTxYoH9oFsB)SzK{-=7TbZWJRL)aAu6$DIRxVNIfsdY7u2sIId`0=H@^$5#%I(Ux zmG3IwSMFCHLfgMmwMT7ctJkQzYSJ{tnh-=b~E??TFkgZf#33aYRt*@&YjUOlXcz4i}n zgSM0IRo#2KC8j*nGp6TFYfUeiUNOCDdfoJ9R?NF}>0Jjrp=U#4^Y-)RJg<*Ai=e+RE&Z(Xe3Nlz$@+#EcTJa4Rk#)E9^b$Q1vkNRP|HpkJV?; z>oQFTO+Sp>2Q}fE5un^e%`DJvfySkIPV<81P4v!w$p6nYr#0Vce6;szXJ{ST6762? zVQsmV(e>61*0XxO-l`ARr|1{xx9Z=~w>NY%+-11eFvyT(NHsiZ$Th4mJck+K6~ku3 zRztDjeM70?nBk1!lHoUlk1@!2hw&cc14flmXS5k3jFHAijd75QX~t)atBr3N>x~V@ zo~CRqG_G!J=4dg5c92;B1^R;)B2&c60=1;$&6ANQ-ffD+$DcSehg#2hvIF; ze#K{s?-bV+e#!u4Kcz_-tBeP~W+`>5Q1)SV3A=(_&la(7v8C)`wv0W-o?uV0<)Bj~ zTf^3}b!7Hmwu+Ak31EpTZ97bT4kCMluy(=JN3glbl#}ua( z6=?5Im=1S&`v^OUoz5n)sqE8ifzZxg>e~f*F&1+?~o#|#Gyrwtbk^@hI<0mj>mDaL1wuN%KGMwwnS9Ws4u ziZ#zLuf}ZN%@Se>wWM3-S+Xt5E%}i1g%*P~)H({9)7#dMtlwCFvi@RaDrHOo+7K)c zlTVXp$(P9AlJAu7mhXY?bU@B3wkUQg-a+qurRW6B#Rf?;OUYm^R;!k&UQoTEI;Wb1 zcD%s8fw}%W@O5veFf)xb+XsquM02;gt4UZJuea_b_@neS8mYGsTL^?M$g+;8%M(BPs}cYuy#+0*J_ z8oTBh%|_i?{Y;a~{FHgQ`DycW<~8OQ%^NV2_;B;i-SXQMk1KvskJ1)EqW1^esT~oUPMNK0#h8pRIUIu~_kha+xw*m8W`5wO92q^viEmzpL7@ zHg+`ns*v5!W~-N|zg6or!!%1Z>DuSC!MeLJM&8qv>ORq((ER~7oN%@yD6g$sYHiGSlS<{43 zK3qLoodv!6J@uFByR<{K8?--YpVyV>xcw>Sw9a7wB zTxiTT=0clWVa$g{x6ZiUSY+I1Ja4p_R+-*09XC~*4CXkDkwWt!^Y`Wej1!ebXBlHz zU|9`aXt{N(bqBcbEKl7iAEpZR>?9u{->wK!-UTUdRHdq(R$WjH4^cB?tae3tq$&WHP5P*1sD9xjiR zPn1uWC&}l^UzL9<|3Y3azeN#@zFnhqtA0~mhgRPK^BFJ8hO^_@DQpTm53Mg?x3Fi} zILyZm@YX75;J{LI)L^Wz@V1=HPTjky7QrLe?VQY?={XMMx+u_ej6618Kp`EirS&2V~cvUV+` zKs(G>dfg~pg6^pPIA)x4`a4kS!-h1&1^$3)nR16WBr|Iw}Y3RGWlI{h1@J3irL@@c)_B0SP`RmUU5+IF)Y~* zN{z~*8cI%`QXg3Q470_!%Xk!Ab_rTkdsBCl#WdNJWOA6YO)H==6qjx6Trw4XG#}FNd&uup z(nD+cGABZlNLD_EId(1l2JKXRR0C8BSo6D7@2S30{REEnVfUC1m_IUqZaxF6r@?v_5WiS^p-w z2Kq7s5ww>Nl+Tw}%Y#78%L-p*U+6^P(APhJO!-ySpki#k@Sos2iIxEtHMo2#w9omN zzrVL!w#t_r1Uc5(~!-T#(mZ=pg;a(y-MxM_vQFIK;BIr zEq_eDMt+xKh~jC*i_rDE8tyX;H^dp1pdN?0@z&RLpGgHi3kRpAnw~U0WHylvS>Vg* z47bAeTO}W=SgW{A)n7GS{Ukg!C)KMopKCpkDZctB{T%4YoeUO3kVyj!_|O|i_rHxj z;2+5~b%DLV!2E>eb?E+ITmQ5+Q2kE$GRF}3$~(wA$-ByLmG_qS#oX|%JY6wYakp}y zl2sa&Q$(4x_hCeCc)}o1grlALlCs4Va90VW1!+1;~sFL z2Qs48SO+~_X1d#CH4THFzR2{V=?F&LAagQi@Tbl1!aI>+x!d}%btZgiXhfwi{G|-@ zo!m#ERUA_Mspy9KPEoxLtL1rig8BfoP&=%uP0-}7z-}9?(?V80rrWNI(Vqd`w1%OE zb(mp3Hgq!1GHy5CYI+=F{SDJx=wLsZeJyvuo3zUM2K0qbtrb*WtuK>};05^w`Biye z#bEINWJL<-b_iahD+(WFFN}nTl#$AbO1pB6@;p2MT~xP1+k5~r&8QlqIt=ezPu2px z`BnA;tbzdbW3Vn)Y2Jp`auM9$8J1p82by1CKlIi0(>=hoHVJmaO5MA<4a4n0=N)M_va@mA67l;n6#xFNe>{ zqp#K1Lwoi&1R8=Mmj+^H(ivYraaa3 z7`Un4bh|mreAx0D(KE!4n@3JUN0^};rgE?g*jVjkZ5*cu;;t$8%}{r6`)gGq4odkMdw^2GpjCfizPA~}G4f)KlR>XUiN48engzx} zW3jQsxYt+;E<9x{myAq*Q-CSh6k_Uc8fY41lABnQ&SWy#AibhZv8EJLI_65JX(7f? zu4yUe%zWspCBPDB z>0t@71Vc~mZy5-0h{sWa3Q}`&FMD7X83_GK zu3}X>l}Tk&g{y|EA~}C_qAE$10*`dIDpy!bSjG9I3si-wBGp#a4)}x)W2QZ(I-xqH zDpys&msN{dp&lAF!!})U7{tn19czNM7S0Z5BiSf6nvG>AvvF)9yap*=t3zsUv}S2E z`cKHZ2*RpG+rG(0+hU>Mp=@qdlwgg6yc4{on+xlf?AlV!t~~)=wqAQ39w~olv~tc1 zW7EZQ{+D#vwE3K8znGH;rLY7m;fJY%U(sJrk|2olB#Waz5#xRZ;0I|JfKfaMx;l;BNbji4h4!%(60R7d z^%Q)6G>6t1#W6Za7?+db?^-B~#`UIRVGN$axVvs*%zowoXbG%YhtU^qo-B;Gg&1r6 zdO$HoR)v|yRE^nB7)Sjvf+C?sMO!9Y9F|OUQ4Ovu;m#1+I5^q+m9Px z{HThyra<2!-EWn!_Em&A?F3d7$}zWA@itGC9~16FayLjGj5URD`EXcs(ef1eLV314 zpIZ|vkeA5!%1_CwY_F5P!q2fajS5poJYL^UWh8r zM_s25z^dFpVNE2Q^Wa2lQs84uu4WYqvtK1Vj~;NmKR4rr==)>- zr+H6@**~tyT(^Sb`BKdKr!eQ&aI=0OH>VARKUa>K&4f8E5%awhvso_Yv8|ZtX$GU2 z-s7FS0=%>J=J$&J!NbY zkH-U8;aUkF(-}<^w^A_~J(Z@-(faACVF?Y?tMvx`eEn1UJXqCVLw`y%&V^U#1>*+e z{g`>9Of!TTHy8HlE0{%lVO1{{qxitiOg<27%cvLY@ z@topi#U6~5Z=pr^f|tmQ5t4v4fftppDGy*={Dd{_JFtEkfwhd;SoPYZdQ0^YXBl*2 z?_m|}DDZqHRyMYqf(P_gPQx z8NwLhc~Pmz6wc*v@mM&P9ifpGFQ}=E6_t-klmE|$a^XJ zD^4pOL0ySfUQjmCx`@z=5R0=^@0oR)%VVFBLlAN}eQwlXtW*NZf`=$TG#eV%D(Gzc z;QHSbm5W}88bo^Hmf|*SjENG@gEGBAd`^5B`X|##H()myNV>pTlf%&*BT19&!#yjK z+=db?N7V3y)|-TV!nmmtSudG4bf}}UGqPgYL#Pn%WyYv!2P4x>gm0Aq7bhKkSDyT# zyiTr({AQ1C_=SS6Y^&^qe%Kq;@$i4x)&QH$=+mK1}; z=#SmwOO7KWuz&K&W8`J{3=Yt;JfPGc+;HlsRdcTgs?&$xVv0uD} zi-qw}v$umWxCR&HDHPRubaO35<{}r7uV}0&3j5}W$U~ei&K6&U3f)2C04>7+-Q5;x zD|uJ>0QATwl|5+{y%&B-PZg&WQ{y=PdypA9(n5W5!1oV`YcJgAkB| z$PqZ=i>N*;Nj0j=C}h7UP{W*|HZ2mZ6CH#0d0q4z87C3>Lt~S>hc*B0@pSK z%ItFZOxbW~ng~9r2REG}J;-1(l$=J+!d}}-?j`S&U&zDocq^#Ef)RgFlU_o+eT0Zx zjb7hK*jYGSI7b-AUd>$Woy*9yRYGf#BYbN=Xw9=lx5e`%8^CS^fYn$E9quKnHba@c zEJ?OQwg(xCFK;QAqZac=HrgTI$L66*xv4^=P{3OaQ7lJCnE`e1kwT&DkBTZ)*#g(y zo%W@t(hAila6ZOZS0U=PIOmh<_h1_MEYq-wctV(xmf&{?XcPkEqChC@W3clc!eQzs zP8IKlx3Cn1go9iG#dL^#Br@UxP#ve_7v#6)kK|mqUPIK|L1A2H^j9lB`%J4gP&Ox{ zDoTJ~S4fl+mFQFqKnAUan_EMQ5UqmYqsLI2sXVH`UhFd2^Y6s)*oSZ5sc{lg_ek~m3{I#@3$1W*qH)f`@%`40V|qbsXKqeZd=n z7`~#LaDp%jcQFmoj}l!L?~phm=b6a+qe=)v^pE`6`7VVMyylnw_kcW7u|v_9cEtKy zs9LAm!Nfi%KAzbDK9TSy{D?pz1@Y#PJX}E{ddz}1o=m6Hwop!4|Ga zD3RVql~oIuaTUDV=b)f8<)(5{E=C6ICl7{#J4e3kd$(Woy-WDf^H<4VLm&C0^Jn@7 zBlHd7ih1n%%~hOIXe$ksZIpeL1EDvrfaAIcF;z)VM3=pg-a_x83!r3kkVPC3J(sK2 zt5UF+Z-G(KRJZ)uB`eiVYG<}r_EP((hpGM4{^}q^(=c_oI#NB8t@AUm4~o@q)SPfW z#~s&+OLQP2vG3Qzl{p5r@db9i4cQw`-vPMm*U5)u6?S|(R381ofTW21WQT$gNt$ zR1RvdE{Fv(ks6Ve$$k;=oZ>{OqB>CvaR+b!VATcV%YKc4i z-?@^ta6g|y(;R^;mkVzvUwT%0S6T_h&O+t_XL~aImUwh}g|ch1$EbE0-^CH#U5b1c z__gDpH15jZqIx0Fy)9Mzjwte6p`q-6EH_RW0g5COdq{&ep{;2(9gVz}4sN57HbZ6G zM>Ph~g#f+d01G$Bz6>gI6$QHjS2ugH3 z;fV9|pc!leO;bzppi5c_Xu$wn#RY;E!gfM?_~04PcfSa)!&$8Wm*5~?B~C(()`;s6 zC<#PYa7NloHd;OfRcMSN4n)Cyw&VN)<9<{IU5_;Rgi89c6Wh>MHhXm0?kRY8BG zxlmJoQ(Xq9^;~5J#l=}Y7%L}Ky#x_+vpNTU{-b6Nat)v5FU;WO4Z(_8iU_w49L5Xc zEg?nR(4iOtaTpaqO`?9o3b_a;z(8X_?&u#l4@ciIfa}Ja_%1ajO>OL|C#zmX+y6e1Zreu53qvFT91O? zv0Sho@o6WjisR5@E<=ZT0@vj$Tq1p82cb3UQ8im#_=Crs4Av+PHF=tFr!ZG|8V=f3 z?1&fG6MXa|#-gsG?r^GI(Sr^W8A(jh?KnsVA@XN{kGm+jDQN)>*JY5 zNWf~`fm-OZxJlezVhxI@FOGH(xCn;Num&Z$2c2puYUPQt^}lGV*TD#dp;H)+KH)IP zC~dk0ZH~RxjlKi#uuAm?)$(w7Xo(CPcY@E>%(|!n+kTaK3gnsu)fAAM+tr6aL}OEw@!98oa^c`xfzPNXdxI5Z>Zg^02;qLj_syb8 zaA)Vi%XJ2q=f<3sERfBZ#_&6*gRD3u=R^Cxtq>^tK#$&_yr`UwUa$qr6fwkTHB_oj z>h9`6>XGVO=mP7R_pRZxe4s8d3cMv3wP`R&&s3@boKxB-<$ahzu}Fz5-lRCtRh&sF7`vUpLZ}YAWc@3Y8G=q{Y_d zK14Y2i1G@*dE&mT<~eEg^}0|=S7SP)Em6ubnzB( zrq~86ps!>os83CJG_$3}(l>bb8S?euN-PnRiWLvRzNrw24&iFcRlYca*Pw4=an3kj zBQ3U0?M|o&e-LjPq$wFfE<@LEEN~QTMZKs84?Y5QOonhZ&iAuOF76G*^er^f-O^K1 zp=_V*ucWNBDBETb2u)%X@e}2HxLZ=1rsKiKp;JJOs>S-FT*Rn*=(W0#1%1Fz#|lyf zBQcwhfIXcoIwu++j)d0GMPewmm%2(#Wn*N^WI0d~o}&)#hz`je%~Ysy)p#j@Su#2n}WnTSgt$PlVQ zFrMw7j^G}a2rHp|8HhWJJ43lzp}49TgWApk8oI7Zt{MTFq8@w}C#8AMi4b8-NCUwv z99y=a03B@wdLcggSyLziOGTNeR~+FvB%$7XA=L$yo+DGsr(<2e$BurYoI}Tg2+;(~ z5CDP|=bo#@GHs)XVxkSXkE|oF3LXju3r8dGKNJpuqHqgJPc9f!QbJ3(AX4h3>*a$L zmz3kdBWWS`HUGUDoJ&4{=^Pq0Lc($tA)QyPD(yWbfp|CZH^Uw#Rb*=o7F*jg8Y$?Q4$~c6Py@r_SyuaPM!q9a5|KRdE^3c^rxtMsJ2LPCrPQ?nzjYo z<46l=39Y~i&!^X-11ezp$u-UIeT_5~>=nNS(OQSTxCs=7woD&+ClLzvRt0`9rTO=k zkYY@LY*K7dY*(Zs59|S7a8Ti^6vE#OV;GOz=HH7T4wC~!Tflm!qe9&SRqY`7iI&hP zcEEAQ@14+QucN4AvX)pgkWHB!(E)b*cz zS6ok{=AW-3rh>37qe#@KLeVbCDXB!B#;`k9I_z=BB2t%$c1n&)T)@h2Qwmi5FjJw! z=A5bMwqA)%z`GB`idurKav$#7UXV77i#}8q0G@#H&T3>u@U)-F(?CNEpq)U?xvRdY zm=1Ix>n3f7e^jM@i+JArx=PHV9LFSz8|!S26fhoQ9imH$$QiM8zI2&%B|2dqtDQ$9 zW;Q8f;CEf8YtW~Zp+C{a#8x+}pQslg#14MzZefRb)yl z)=AA3F}?jgR0KK_BX$l!4Dx6e@=`srC0}YFZ4H;j5^P2{kb6>TZ$vl`=}^=SOeHoG zp34>x1!DC4W^zj?LDBN%@*b$ZhAGBCftsY44GuCDbXqMsj4z0P8cHpt9(;gaIFqf2 z%2sqA+Jjy~Uqq&R2))?_dt2b{U(=qdu2R-I4 zNIXptEWU7oukf%HU;dJ_GGH#Kdr)S#35X1cg!7)LWjGFCCzd{^ys259HpA4N>lAs znX8rRE$XA#zdCH*>ICX>6MMYIWFYoy4H+vi1Pi!MxDS2m4fHadLD|}%qK(FGIVZge zcd7-tx1(Swnq=8vAxQLN#})0A3QTCc1V_{xWOW{Gr0NP)_^`?vJ@s~IRGb(cP6DnE z3EpZCsBueDK(0p4vZ8D;e{zU25r|OFwT z*{D7`O8ZGCpi|lA=*gkU`$}e zgHTSRf1}Uf-rZ;R_8J{dKK|DWvDgm^b0oP8$FvC?>pi%c`sjkKs6n6sBB=%FnwZ{V z8nm?A0zxPO#k&c|_!Sce9Yyx2mb{=Qj~0c9c0t)aFM0wsN(2X{KRm;ISg9>RyS$fp zN&Rr-OHl>XOApDWpnfirTSKeZ0A-D#BCkWScncL!TiJqTB1@I)=*@H+P!%(v_?BVM z2*AMMfKznXxE4b9rQr&!x8Et+t~{PQB&{2 z)IQ+qif4=_iw7j@7bR0Wl&>$Ne*)d32WJ?M-bsJ!okLJb4) zwu&l&He!h0yA!(a(SjgBgkT10!Nusi6HyWFfctv{yW%{idF~0kghN3IrX#zSqpz+O zeuR3WgL)zYRI{15i@3XZB;25d;^nB+PeAp%33b&SJ@$CX3du&6JlGH4s~CCy9(ekf zk{U3@no>jbYwe|7r6d%WI1mR-Ajap)s^z8VWr~zR=wWogwDeaERt2j<;kaMLoT)aV zVHQge;~t!7-tWEPnJ0s2EP*y@2-TzuWe++{NXaM_)d#x&NOp>45;F2EIDLyTZ?zVk z$5v=>*-(uO;fPxk^ssGj*T`5l)>o1rlBK9WhW{MMVH~8-N&rvE9|NU%vTtS+d)yZ z6_apwXNcEg^2u0YA#s${qC?b0$8-b}3idJ;rW1US-zLD_-2hfMUA9|RDO-Y`Ed{;z z3;9R%ZdxqwaTfjC14Mg6r3q-NM4UOpMNOv%gI{GnVay7*y9o1Jq0~jmE=(bo;Y`fn zTEr=KD>z2Ftgam`=qM}|)r(zZ!-QneO@<53Wfch%+0-m%hU zYpmf!Fs|S%?B7~+r&?rdQU;%RFg1dTz(f#!kI-dV(^H@)H4yDTD>^IV(PIy$tLX-K zQDRnu*JWAQCG3=guEG=(y!{ov$YrM$7qOO2L3;L94rW!*hnQ-3r*x)A)1hEJH`7x= z3@>0_!(W%}BbSQTqn4>eyjsHQ8%%e^m$pLAT#DZ183@y_QW~D)GN^J*&@(vUx@>K< z9e3cM_?=jej5QRM>n7x?TbPS{FKK|98z7y?)IKq~&2=+0v+2V5!i}hxUkL3*eZWO} z!#|3FvREtn0)Mo%cmQI45USu|$mmva$r+b2v(>xg^88}ExwWP~^bTGv3uP(?8E zehvuPd&u{Ch`hI|?HH6tWxy{Gz0F`Mbyq- zB9?OhA4FVkh8W!;$=1oh?~QBG)*ebLu*jP%%jP=O5A z0M&`Wq}Cj`m-#r4UZ|Ls!9kv?T7}7615kltko4$gt(yPF6#e^DqMB$;k|2wwq0(55 zDlK1nOnM!el14l`Bs+#Yug}!HgdV%z3*cMa$C+yhS_{nB83SKrl8Ml7cMC$%%P&FI zor*YcpPl5pD^r0(_J#U3jd=|(J$C<%M9!Z>E@5;2@8mhmD?EZjVuM-O7*&b-3pf`& z_FPrMi&&SIm~_g;`oiCb8YWQ~0Un(gPbXP;6 z6xEO)jwVH%BQ8KsVk5DGZ%~Y>GF#BoInr^^(N>`r+Ns#9xTd&^IV6H5U){mr_<>1U zg~&G+b=(Ac5`2&8a2V&&M(XA2N=)-qt81Yve_olYiI_KwfR{6ynvbV2#35&{ zqSk>nPolO_Co%VZUt)krD}-;|8?{>w=)f%Hex(%?OH=gNSZY8SQxgSK1&Lq}iVzD* zzt8eDlaFO=H}x96?T2PZ260A@6UK6RJVJ+^`8Qz+JuB$rcBrrjcK)B~x|)eSFEA6s zpqBeXFCP!ZJRF+&OqStW1V3lxcakp|3_u2SqHH1;bs0nToxt-0ilC*Jg73QncdLx0 z{9Y6P8xGfvbO)31_cZR(zj)$9E=vj)k|+Lx%&kJTUGo=wt{Gya)jv?WjK}8ux2*0= z#Kf3ih}}dgnRPj{SZ+5DakdaU?aX(2_Xf)%{v*TNh$^24J(QsnO%PYwqZa#no_84f zaeq{=%~WsXcYg8j*xo!rJ}8wx6TS@H%K_VK4!*)p=qOAArP2y?ib~WU9Yug>IiB&6 z46^GXrstbPI+(pNhnMOIkHQtx%){Xvri*uCZ|_3}K8$^J95W*4p|4#LD=-UbERDib zEi7cqWi3$c$l%)Ns6^19n&V#qX0+}i;?<#cEfU@n4iilT6L3S!_~eT*3C$_hV`m{g zl6KS-_*^`ZsYp|)t<+bxR2qXLvcSBVHRjp6!x_bUp7X)faE9rz4pcyf!A&=*`?0;sw|aHD#lpWV>Og|k=v4BQVbaLgk> zfhK?=DHK;=-pK%jR)6Tai{Jre!~dy<^3VfHgAY8sBxp!?q}7<;a65A-eE7Tdpe}`A49Bx@xGomNrLO2nJ4(tRx>nef*Egue2B@vnD4(NAN)EZvsK^B2R zI)`;{hW=t0CRAh42^>RDTaWl`g}GmUT#2RVwsM7!(B0Mxtwds6jk(~JGDMf~vJqL&C@!Hof34ssb(BWnqUq0Qs%+v#;pI5O@WNBpQ9gHx)Y6be*4$owfva=8FxV8+vIUaKl zGx21WMPLD#sfQF?Z)V=15VNC2?2}nuL*J>KQpN2<^**TaqGLFr=VAgtiX6PSN+LKo=;U)~=yM>t517&s-_>O%Dy z_Sr8Cr~MjPp^?d_M*6Hz!$Us!d#5xJF+K~i{RHBADPnpf*dL}Uaf0^bg=vZLSP3)n zB%TabgF1ut@EWnUku<;rM0@NIFDM*%FG9chv%>JS8IF@a^Y{`@E;>{v)Yo&N>gBUM zzZD1@yMK6cOfx0z#XeWT53@}{@R1o}Iuh*ZT=uyh3_HCByC)IMM+!?(XM@JggZ@y6 ze*FxTu1j!Q-Pxxw41+@A|8vqd@}HjhQzmyp59truCI+M!L*+A5G(}h;rR*Hd15655 z{4!0`h*iVGx-r1YF;SZR&18+6lBqF#u%ehcBMAGDnX`%cWx^&=nT%D&%-LisbFtd; z|HY)uue_EKm=iO){r6SagNEAarO(!|?Lpo%*}9OJi9FRPP@*PFk>umaHAYbB{%8J& z^B}e@xbi3 z9;jrL?9_uDu0ssYuL5478}>#PT$R_f3D)~ktnLpgE3Da!<~hA^eRg)*08b_IN3~Ie zbtlAHOU5*S4m^!8Ov~J%{&@yw80KG+*@)8v(<)2R$31|Wql81W5)p=jjy@bKr3g`F z5uROA0cFDttDsRT1toF@nxhTac7|+shD+rG)-@UDWP)R#iPi8LQ?^*i|Np=LN3TGl zIZjLibLX+BQew?#;#-j#TrR0k=xXu18)|Bp12J*e((A6p<#A&r z8eCqA3XDnHU%u0l(AC6qO?YYexF-y;|M7P`lfy%=@1E%M{OyR{yH*^1Fs<0)YRT)A z*ftA^Sl($OR&!5^rUq9-!7oCj5UUM zlg30VEqtM4tT%M*wDEX?YUGs3q!D4rd{f(4dvI{jq$!hw$PPq%<~w@EZ9FCfMogJD zB_z_S&y)x}QlEV+KG})r$oyQ>*zAv=Gtb3!@QxfiDcs7dPcNcF+ZLo4jyQ}TJY7mO z0$)mh`I1<0@IP{7EeL()$n=eQ9s|7wleR>c<}W);?lU2Ld~k%7v$u*h0R|CeXv9UKugAuyPT<#zt{3Um1!%~)?0jKzY^NCG|bZ-pz1_qA(h#&Lyf z61*0T(ZGtvhdOd~aYguqB`&F@Aj`q{Rrb?@`Z+N*v4^5k9JxdC}!7?r8Uot zFpV*>7S`V#+&5hBjZ;HZ!@=&kr$q-_54A~c9Dm+MW?iz&605Q&euWsOrGs6`=WBDhJa?i$ z;r8QeLL*N3{S9W!nDJL{fKMO%`&W)6jG5!@!ZRTBe!Qfn&acY_8xqTf%Lz+q@++NH zaQpdQt+E2k05bH`mT_6tdgJLXTVtGc+%D}ZbuWJmQF%sfYDz2f_Fv}6oOSbkg`_^o=Lmr%Q3ShY9(y=Xzj@yUjv{t=mF4=-pPy}NOUf9TZlwn^#k0sPNbBM;8| zfH3w3VeIA~VT|jvaaVP?@3%|ZjHknO`qNb-X8lKkg*DNsdDEN!TrCK5LBUqu6UI$O zaQr2Z!QY@5xL?8qG6@Ob4!0E^-9Wk~w=8iIQIc;j-Ve+$&p0@%FlLL|Ch^SGDL12^_ld7~ zP-yi>xCp$|0g_c&+K)LoV}>iCdv5Boj#;V0}7JkFR$?(jJ3d&QI-uU-_| ze$xBuo5b?!V2f>sb=r5Ezy4_LyxvjL&Nt@F{g8iT>bBDfA7bM~u{$D(KRQy`ck#@EL6nB;>x$1EkMaghuWY>~>eb>+CY|+CjqAq#2uyec z8h6xRZB)%)qE+&BS?@`=dIX3+tL* z_e?j&plRrnyc>5v`?)>QiawR$lfQBH$M_2ijSZ$AuWu~qd8y5`_nc7AF1tUR(ThkJ zynTj8xAk^9r0LzqlOy+>sq$>Ie>30N)4X559@(?1k1rm$XtL|uV|T8t=r_Tz+rp2T zN7F4j<)me*)>tKf+}@g=J$!o5+k5GY7g4P>G$sbk;O>wm9;{BY>lc=dNqkk-ijW=+ z8g~{tTCZDMH#E2@o>fS1u6@btzC zx-yj{10(#YTpPnyXnMNqx-MH^+arkE&QufGjcmshj=y|U_h<4W9fn_5-$pt$Iz5#7ECeh@8ciWdtD=kQ7DA1Qenf_5DkV`SQORX#Z7hbs%E6 zUppe`xMh;Rl~wP}QQl!Hi(6AJU3~X4^xGy=qq4{H$c5&I9aE^+O^;6X_O!kk!MQIQ zs<*6ouT{SfHRH2A2E=C`oi$+U7FX?iU%NcsI(_Mt-P4?-Z!ft2{%EZ@PKOHE6sjpYA6Zg70&feDWH+Ub8=7ul^m z%F*Yc2{F9>T71CQixyfI@uX8Idd=ljsn%jYPv2NOdp>n| z!0my7&#yTIymO(SXX|i2^-bM&b>zyf-c_@A_pj}HMWU2$%bVes*>+p}#a63*l_#@x z$7o*v5yD0zgpD9tGLgZU%WdNE2~GU(m+^vX8lMp4B2vGt;*$fBAr+wHtaTzkC0-`e|H8p)%h$ zsm9xSv3*8t`}O4s+LpEDp7kqJi>r(?*LoINTw5Kn!G7wbE#~#@YrJobyVSYK&+>BG z%A>XiW(E2>rwzLN`9=CL--lZ?T$~-pe7LvwMl3bCF=K;q#j6R=cct|>R@B|dFnHDG z`ybQ3wC<`KEKPVfyJP=?t51BZN@s2~^SdB29rJL#WxrJp$8vL2m~%!w6pidu zl6YRXda>ckfs+i4J?XjK+>#@%z7H!t`8qs(=(?fv65>-V+%!kjT}dCO7nv!3jALQP77eC4FyPZ~J1_8D8G?h8~YQF5i}|*I;bx zlvDBf$*$yDmKcT)QpvSYcS&%}0+X<)FuikJW{?3+8dt3M=*QD)@8^6$CqC-JcD93VRPOa&jPo@iPjx4=0 zG0T;7OnUHiDt((XKfv{B$ubh&HW}Y@JtFP|7>YfuxShaekebZ+{n|=uvz1Qtc^dq|7?E3b!&5j#5WUxVnW{-x6Yt|5xm%JZNZ2dC-)~171oi@#{ zzh?Yi=dkyr!Feugw!3lqyN0x~?G}=?sp7iUg8pfr7wv52YN8vvebJjCGrw_@EWLCV zbBu_-Zw^1Q?ptui!Dsuv4l{d^GcIj;tXQ}{b*#oA%NF|^>$V)=mUJHA)AX5t`jnOa zkLbMz(R=6r6utkl6aI(jZS*q;BYGpAbBG0rOl-C0Em%V=h>tP(tMHo|m@$_4PnQ?5 zMzeBEQ~Rf6=D1HA_CedYXYl_uQUBlS-EpmrHZ4Exr|B$y_#!W7#{H66gFLwVdqz$j zImy6yPsy=4tMhx_Xq~olQb7Jtjfz5nYAlQUn{uP z<;Pa*@r&Z!%4@vaJRG=ZUB&bGi8o_TRwmSHIWE?GvDV(Eb9lq2#)_Gnd$y?4E)Op> z^W3^BR4-yfeyS{aoWt2chA#vB)TW6mtkmV&=G5m)WdA6V?jE6E^fH`oTC8XM_>|t* zRW-Ns+rIK#5q(zFeRTTqSB3NRd(XMy9nq8>^G9zR?o!n+C7uRkIEwbdqjIGf>-=pA4pM%dn zzn*vKX+~D0DBtt!RO{AVqx6-7S56(#w~tBT!GpOT(S;# z+d6kD?en7hi-HesmwMc|L&dmvwRf`_GvcN1+Z~TKZ!MNjIl90$Qma*URHx%xVo%!o z{I-80y(~3qY~JKl;~mF$yVkUx@^v{CcHrCNK}9RAFN7T3YPqC!kOu9rZ}{r`icZfC zgG!UAM$|dS^!}OJ{P*$dz4=r@UQM-09Y<4g)VF zRrf2a;|5Pzra!M}LQ&=9mpeC=klmUL&yMuF<6)6{=ZoVub6>o_~Q?G zB#Ob-MyoqF^bZeqJ0mMlzN_ukpvecJ-R+d%p zz0*DPF1N6$Z2RiT+o~|J0zQeam{y zf30m;eZFaA>Y%CH$2Dmmo^AGR)#q4w$*dwGuwR|bG{mBp#_7ZR2i@9L+QYJG{n@b0 z#ht@+D&13kM1vQ!K?J&=btydPyVukr@WTyZ@06#aAj1M?e#kg zLu!t-9c0meOo~Cpyx0jj_jMNRTeLE%FfKJ#!;Xm6u=(R2XpylRZSbvD?5bP!U(51; zZ8`k1=0*`_e;la&o#v-TQc?lR5TIn0Wl>U@lPvm%JyXz1Dza$j1yem zxS9oR^KtIk>({jcEtOd-_KypuPtD(ZtHs6D*J5Ajr|vd-vd`BvxV~wJhTxFJCk@w) zYSR%@O_tekR<1D6YS^&R-Y;rK$cV?HnjpJ?(jbT2n{#>feTh>cZ=?(BlCGJi5jIB} z`x|GbcV6*(#=96rkLP2R!$(8jmT-q!ay#Cuv6&}1^2RCG|D&s!$Ztf{Gug9o4PL!R z-CUUv7#i61onDvl?v^8**A4EwChzjSf;QIC=T;6DtPPO8t7tzeSLLwhd|*gduFIQ~ zc|J{?cw(K@ da)Y&x`}GbXlssu#(vYIJ9SXa>+0T}t{|7$*6{P?G literal 0 HcmV?d00001 diff --git a/externe_kniznice/32bit_dll/rs232.dll b/externe_kniznice/32bit_dll/rs232.dll new file mode 100644 index 0000000000000000000000000000000000000000..d6ac6ae903c7608a8e4a3761994d106cec5dc2db GIT binary patch literal 57442 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 Z=2?SwNHlBI=n)AcB%@YIoJo}Se*vG)TaEw# literal 0 HcmV?d00001 diff --git a/wolfssl/32bit_kniznice/vcruntime140.dll b/externe_kniznice/32bit_dll/vcruntime140.dll similarity index 100% rename from wolfssl/32bit_kniznice/vcruntime140.dll rename to externe_kniznice/32bit_dll/vcruntime140.dll diff --git a/wolfssl/32bit_kniznice/wolfssl.dll b/externe_kniznice/32bit_dll/wolfssl.dll similarity index 100% rename from wolfssl/32bit_kniznice/wolfssl.dll rename to externe_kniznice/32bit_dll/wolfssl.dll diff --git a/externe_kniznice/32bit_dll/zlib1.dll b/externe_kniznice/32bit_dll/zlib1.dll new file mode 100644 index 0000000000000000000000000000000000000000..5cc713a78754ad91576a10d11b15d5ad9e5f8270 GIT binary patch literal 76088 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 literal 0 HcmV?d00001 diff --git a/wolfssl/64bit_kniznice/api-ms-win-crt-runtime-l1-1-0.dll b/externe_kniznice/64bit_dll/api-ms-win-crt-runtime-l1-1-0.dll similarity index 100% rename from wolfssl/64bit_kniznice/api-ms-win-crt-runtime-l1-1-0.dll rename to externe_kniznice/64bit_dll/api-ms-win-crt-runtime-l1-1-0.dll diff --git a/externe_kniznice/64bit_dll/msvcr100.dll b/externe_kniznice/64bit_dll/msvcr100.dll new file mode 100644 index 0000000000000000000000000000000000000000..0cbdec9fe4c8f501ed8a5cafd52d644db7ac72bd GIT binary patch literal 830616 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%0Ags5$(hIgFbF20%@2 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

Kr3RIJt zgKC^gGlH)I_xvyzf(BxbcNEX4d=|}^%riRuxStDoc02R)VG&Bl;WH4VVD# z4#Rz6Cko0JP}fJJcXXxF9`8`AD#*7Gg6(4TpGVXYbaD)mOu#4vx7PY>VV4Tz71z17+C1_cIhP@ukWP87gjXw(7xG~zWU zjP#LW+K!>CoHkUX*$D(@5KKm`w^nXfFp3y8XP@gkAJ^kOul!_mcibh+(b#tRs{6ypsz9Hk(?4o3-56FD5YQ8a%h_=_H_4udlZojhwe zqS#avo$AB5T|Qxpzk+Y^GxRO~5`Bw5FLsMR@>`Acam~y4Vr6G^lRu740Gm9V!8&g8 zCpy{W_tW-AoBVrtAR**RZ0{6-4%6bN8Fw%KP4tTBcs0WF#9mspE`Xn_T|O5Pl~=O@7j;$PiIK z5i0kxdSN$>-~2R0?!qtX6Dt0L2XP~@8u?R`gi5lZ@}~hXLyzfC{A;+{UD5Y2kbUAIG*3Sa;|T zwCx^%$+1=)3(RJDJsE;%*P;I#9QT$Y!VqNVvL*dJ-e|c<`QIjNP8h z{bE0?$GbWK#r55O0@^vt-TsWaM9@QcDKS+LIMz1Cic-X7;!!J@1-7Oj^sM0o%vG@5 zCXaTJdJxBByH(RTPP>GPOQ={>x(SWKy9?S2<$baCE1Rq0EAI>!E})!?#iUp>yVRra zGFJU6XZ~eEMLE`r;Bkc%ECR2U@5S}3dz}6p#FF;@oOmq1-I-q~zZ<@htWy_ zcB;?v+D1A3m#OB##$=QJk?kcqT?JeO(H0uTQ5hOcBLiUK;R@vzT2)p--Js}n*KKD! zL_6+FjgBsSB`xbP^$}z=xHz=*rx>kI_#wSvKa-AD-`e8u#ZWgq zNN|F){PJa*36HV~?7pzJhM(voO1yTW4~vDTpblMp_7)55JSzx@?4s?<65Adh-}X?W z?Y=P1SQ3d$+Akoy?hohy&PxMbx4#j6iyQlC+rJI%Td(18GsNK36nJTEat7w4djfMTrAJY>Z*ex)8B%mcpPl_}o&mi$~0ME8(K` zwl*}C2S@nIg|I1upC{r+Qgpm&k<7sdEGFDf&m1BuCgK-HTrd$^=ubju&q!_IrbS1= zeO_1Z%wC9buE@SFJVsbMD+%XaHO|7iCH=&lMp3D`GU%}^bOxs+{mZVNTZyK@tX8EW zy!3wM@^ly%=ffHnH84}y%b|+f!L4B{7h(rwQ4w@|*gqwk>ADbyNx9sjT$he)6scn& zl%mYn9I+74H>a{GZyS>AYCSxMJ7lk<(2emW5cdNuX@!16?#98H3q3)WQ_4Bu2|htR zk%CtZ@#NHtt>z?ex3X>-RnG1ohkN2R*_%<;%?>u)_OZX5CM%p;&wfFwaEyx)r?a`2o zDT7xR77*%L*qki3Cx*7*wsd6IXIEE#coK-vuHSb0;L#M5w~yqjt^tWN!9PfOxEc@P zyVlbIo%+{_)Xu5?`1^s z#^L5x>oeLn#bF7*+R3pSx)y5^#^yCk^E1QjIxy%F-)R^`0I7Vdil9j_XrQRTS#azvRD4Ej1YET%Nc@GCNIVokZ7{@$YN9&o-^(MBz$#1N z=5%Mlt=V?rz6V$iXZA?kBr?)FK7Te8&%)Y#VXc&e@JX3Ddr;>kL(rkJ?iRQCO?S>t z`6zjj0Xb|(Wyc6=TPx6iv z*1~vAOe$<#G5}=af+1p+Sv0>X+L9=>*u1l_@gB^5ZF2qqd5;@65*M4_b?1C3zlwP) z|C)wIJ@pRveQojf_kG>Nn}#E)fv@tRy~>C7Dj(XbG&E1n0ZcbmA!BNA#n|sQ(6C_G zEtCcjU#m9Ro%1Fb34q4U#{nue1hn}S3?pwd_oynPkpk>^yaVHm9`J_9wXo3zJ~U$s zVYcMhN1O$-VFUmOcCxEs5{z+qVmf8cjT+%9DiMh$wW!_at{T7ZzD?b_+OLZwH9O=ZJ>TM7NCrK!1jGN%;e(2e9~NS#~W4 zJQm{i0w~hdzp+|WWUeG9JV|+wGJAp}{`gsnsU^~lg4DAlci~RZndjZ8KES%r5;3>l z*MQ8)LM6pOZ?*orCB+0G;VZmsBwB_E-n$RfOewMitotXWnv^12z`C0~qzA0q=m8fp zSnqoEM1(>-`HovxW=bX7g>}xU8Kq*NLUP=jW{T8>KT;0T_wwU}Pb>Q%OOuf!-qIGwevt&EBoOpj;e|Qv{zG(mhs53HT*sZ#djeZl8uJcL&Y;6(gEmqrNEGb z>?7F@_u6|h63!vVwUL;IUw=v&--QwpT7VajS9SLy;gt^X!`3`3!PijMGhZA!evs(& zbs9ySCeMIeQ3oC@=V+1=B5F^d6JXA_d9)4ybo3i<%fezk&{Z1EWX$5Nz`8^KGM9-Q zOKm2)hAY8}1zhW`xZ;5nqgF@$CElVcNGaa&WD%`4g6)RPrZkdUYGgMcLq3>zkpV0! zvemmY^pU9x-{4YwoT&_`0F7}PjgdJ%=%eGdXBWmWgXC-21X)dIP7`%L+{WC2b5a~} zYvX(XXBf~gV{6J+KY^l33uf`@Mv~cZFoR={7%pA2H%U0~R%WUNi)```ZXy3@7K_r- z?uGlDp@#@>f#_Tc1#h0Pwzk!o0fRg;z;i&8{4i{|5YeOdLt9!y;W2CHMhiriwy$8iR$3RQd z8t_$E+Xur#o@AaU4|xty9&>5!N66ENucd{1<$;(t`5zrd4(Q7oRD*D4kp}&nG2NZ6 zlRhOZR>vp62t9$|=F2m}%{)CA3Y#;E4mAy%EQyAr)fb>L(kAW2*E#`WHfdzlcgTxL zf-Yhi5GsS&L$FCZuO!J7cEBr4nT{QVT?F!f*n1c7sH&^~Kgk3L1UQI@pdwMDA`y*( z8VG7eW^kg3VgZeoXcUatq9U9rQ2~Q9u}P+*^k%iSEp2UUt9^^D6;KNaDg;q3UMh+g z1jTcDs)8s4QRe?yd!KV=5(4_R@9+12|IhP(9>|=_KKr`%+G~B++H03U_*e-=L`GUA zexp$HFm4O1Q&TyJ0tBHQ=@;vKFV?c(o1lI-crMCa1%aaR;{VmJOIlHzL&OV2CJKv> zaD?k*w3^dO_C{b2?x(Nm_o2?tNt#TgSx zPK0?rA1VEOPQGr+pdq=q!yrW#Js*2FJ5rSP?M#0sIq61ps(+-@7^4{y7hDd%Q9)^x zC&|o?>_0kRwAJ^7x{ItA@Emff`$aZ+9dHPMW(hx%r5x}Bjz8H7jlM1~IzUze%GPP=V=rF1?BUEyds?H0}?60oQCHMwacBszSbag6=G0>E*ie7>< zn_rdnwShKWl~qy|wI-;ld{0%SwsdXuv|57nH*A7Y9nj+t*f8s?p5Cz7HZig}s z#s9K9^1shL{^u9_Kf?dC{wZuvW~_B9GOPHK4vXCmx9%mf*xf)@PT|Nk&XEdElVu#n zqR!9F$MJ$gx8w}1ZIP+1zFL_vKbe-9`;0o^XqkMa1KV|OciC<*CQ?{|%XObU+}nr8 z=}74^oJj<%TO(}rH1Q7yn-Twi;hlh*t&!68ndkjdVW0+rlB}Qg5`TyX_gYug_E=*E zS2>8^zv3&I8-1X=9qE8r59-51c%tMoG3iF@>u;I6`XWS=zw_&5|J zu}+77<&EelSym$((Q$~mx|y()IE0DE3#{T9xXS#2&EdnG-sIoU?B0BrFbfx?TUCEv zRLS3G1OZS?`US{EJi8=6Ch-TAdG(R$ zQnP!sSO!Jg64May#68F^x(946Qu>y8tia=p9A}0WJ(p@DT#Geqm+X$qj^b#tRs>KH zR?t0^5Zah;76`4gK%LTzBQ`3D7|==j3^Uef9Jk*&Lf+#8xQ1aQS$F5DRpS7$DC@Wb z%X%7Ta<$w@8YjTucR6*Gk~SfI&Y@`do@k+Bh8-ksL^neDlh!+($isBe*fP$0D1eB-ylsAP%MtNivHe*`~x z?4YZ>8VyRaL!=V%7cTYF!TFS`5Mz$(!O3Pp>8S!|Bh%Ti~=`y$cWSvTiRkphdpE>{*_A?8AlS9CFl zYs$sT0b*eq@AQaem7;+)(W9)bS$-?F{W&K~3wFO(uU|6XjVu5R;+%VenG&l}wg+6o zycLNyq9t00>qSLh$^_Ung+=|UAV^FwF%h+fZ$y+6d|C5ewWt%Sg(n5p6`!a@{bcKE zzYff(D&SDamjUJ^6weh@b_s~OBd;a&8DUD?09qLe&$nH!+u?kTHMW&Gw#rVzoJyZl zT&Bce@2Fy$DCbvB$2!bOyHO!r4)0XENQ8=iZB{`m>eIw*}RrbB*L|Lt~`HM<-odLYP^v1 z(KbuO9wLd02L2fH+OJevG>B-#=m2KK{AC*A@UhIfTNdJHJ@QffNyJa@0eBL4{j|b@ zEbIHP&?R4!KV@nbsy_$Ka+QnC(Lvr6%>Y^Kxx&0ydqbnI?ZB|MKv4E2YFQDrCvj~kzlDmm)P_ofs>q-!GC05~sx1u;oOL39 z2hAB;8wehSxAlR{I|?k`!w+?B+t9GxP6qNx@4{=hJlI z&7%X>rWzGP)&<)(;uj;+Y4A){kuC$~Jm5~7Vb&F2_@i6($U#+#86xVw>@g-eT2*5! zhvP1j=0vHh;6xI1Cj(yb*^t&PJT|o9LnQ+){915Ir}+NTFFU&Gmk#^|>E4zjizAy9 zdug|N-a>zftfB<`BK*J9+0Rx(H+LRa;Oo!<%P&VN)?9gWv`Bj3Bx@Ls`>u|D3TJ5_ zcwRgzE~aj9xKpal{N2lju(|-Y=i@eBe9QjfNVJzNj!TG zYvlM^eM*R|c&|Hy#P0?0ZoPcKJ2|LC-hBAqU^^~Tkv@ARv(M5z=1(tm<}r*J+`5xY zYITxH#d@Y?(gC#3?UN(^pk&ey+@&lnlYZ}}&N3+?o03Vd`j#(~E|$+SWzt`&2j1bz zN+xxM(RFe{^EpIsrT0V*Rh%CV5=p(Nd3nGr75P()#3F!>OToiOB7SmQt9hm`XRa$k zl^25+5*bL{*<-OZx1GTB3XB_HBxuF^!ehh`~0()yXtcn@9HT3 z07uK1d-6}a-`9Wm{lVm)Z?HhIRGp@l?Rq?ylFS^^Ck=-r>Ss=rd?#hkPrAS94WdO!W$LD#0cRQi;;LHz2_NE8|_i20GBk`rWoP$DyMxC@y- zqZTlM)deyqk-J1`T;0XYSBsQ&zk>SLuIWC>DAVgRCzH9JD`?sNWSu zL~9=9iP!O{wN7Co38f6`;#4YiWF;PWbXo0gzsqj;?ZFtn{R`D)f-(ZWi!h3pghZr& zK`~Dt^|kO%K??HmQgg1;2;^(lS)Ve^6&fj`DaK0c1fB>0$3l^~NZ>||vP<+#q*TJ~ z0XP6GYT@+B50r4)&uS&0vmRIbn-u@=tP(<>2kFla>jbl{lN`Ebx^$#3ho0rv#X9?; zgUO*PV4WD~WDa#LhaQI?l%8DIWHLF2=$o6(vpdS6-|$3GaT~r+c-I>T$e(9i>*c3p z^I}&v{~Ge=J!$^bK~7Jv31@Y=CivzG!RE{l4H_tjuoj zN`tY^)dov1?l-Hi{PdsGqc#}0cz|${7H34Lcfyu-lVU$iFv8 zS74K>~Y-RzG3$tjj*vMo;Ke8Qo>lP_LH9q0{1 zqnMx(Uf-DC1?$2QO~gaAvl-xDcvs96?}|EMW<+!5z!lF+MALs&CjF;*@y>M&LAo-!r1bdkE++gyD&`+5L?^+8mHm0$U;{$N@eY z!^^}_lu+F%1gGF`vLDu$j}GVu5s5Tz2mudfeblSd><|6Mnhzd?cAfdk=pGzh$AO7j zF+7zn(*R>9+YiH@*a+2$2zeq6YtBd6>kr4p=_G$c=_lgFc?X9f3P)na+vjvI-HFLy zA4%hDqOB#!J{nI;ui3~_T{RiL*kTVjWSiaNW2D{INl3@i4X zjC!G`ENYXJ-)uAo)RsA!mlzfH&FWf#^>nFD!!EJAP|^Ki&)EN)rvIH89ux)Fc)f7D ztw> zHwf<`X0hzDb#l=t3wRKH-$8|!M{@I77wkfvEYKwtXk9DQ-$>TWMK7j1#l@fx!V~&l zEn*H$?Br9jj+kg_`W@1zWYj`pZ`u>CU%zw&7&Hq_0s%fbMe&+MhbnFw~hY$70)ia5I zhb~r;xZVnn{4hLv1`9l$^bdi;&!dwbaRd834JSGq- zIo}_ocdO(~lQ%qb<{MYaV2e3ZcATlOGfI@ZiWNdORvB@e>0q4c4w$Gi z+Z<(^;<4=KGUqK9<9j)=lu9^+jy-1*KxT_I?{^BdJF@xGY{sIXIZ)Cg+HK6m*`_!t zIo;*n1b|x|DmmXAM}Y&@C{Lm%c=hF%2cd1Ooj`zG$a9czB4LbqaU!wPti2x2b9 z$$G%T>o1Z*8`}Tu>-&jpf+=+N6DfJ`OMl~I$qx_k6Zsp{?SIry1P2k{Po#!j>wuJp z^b;xg&;3LuZ+7=H9KREZyv~K|NUY`s$ zr}tZRZhPtE|Lbk1i>w#cef_oYXPTNw$3NnMyuNbzCBkg zFW(8oTFMyQeAmnFv<{MRfpyFlrpjEb@_P1kw4JGK5FPyR1RM9)$Byl~dE(b>mmH;& zcm^}C-fG*15+(rK{BeSf<(c1Euy+wD1cz$r*2+~;TW~?Uv}IP`N&$y6(Y$#hd1uy zIGK2G$LaY@ZG9$4x>nA-1^eEl+0m}(W9hxbPj|kVj9tTs#M;lBQ`+3kT-u!jeb6>h zZB8Zo$G=PVPqdV7G7rC?IlkcW;{2@gR7+|lNVMf}WGDw^J-Fa6JoURIll}zZNIS+c zpF5rnEwYe1pH*0SSlNurw6wv_I*+uEBuGRDK@qzC4Q&eHc$e%GSkj$sU)fY}K3gUq z<4$&e1=&4Y+BSdtf_?YV#yNj4IpSx$Nj#4ipSc*1J$AD-^I*KOWYVA<_QQsYo;OE@ zM!p=}voZ@F8toTuSTjHW0uFW^lpQK>I)L6oDo; zhV`EBdZUFonLj;BmMTDVXIf(8FlTVfO4hCfA<)aGGv=dMVy6|X7$ zFovHBEVDBa!Q}+9s>tf_qN{ly;$a=r$cQcXA|%#Uj`(YjG%Cv_Bl! zFGrn?vgY1^Jg}*Bm3g?Nn6FYq-vvbY?)5oYm4WSaQ13#kRzLr^qKSP|b`_h)g7sqy zPc$03tIN5C*(VzD4|>ZEXsJMr)Mjp|xjmGOWXppJf-OE+A-j@-RIw54q!Aw_{s;MA zT-LlJ)Vw8>*ijkSOL;>ny${R;LZ-F@$0b95$_h(H$rYY;@#1cLB?C9ZqoimEBF-Yt8&a$y1qu0pe zGbO;A_n3^DS%&c*Fye)f8@)Y^4j3yQ_>oYvSvXftovR|W;)Bvdq4-PDD_Phdjx>cA zvzZjzJ=ck{c77K+~mqC-`Y!J^&F zC+m!9OwTnb-AU3ur<;1s-p$ZXP`CATO31lfLhdFIet4;rCNsB=AM2;)4ezizP8sN<5EGe&bsy8As7@Oe*41)yESQ-MpCmMg_Fy==j zkzLkYTsCHp(I6*F<3|-P+Ae!ff5V+*b355c;kw?cLS>Dk4pEQ6ZauD{9?~plqL=A^ zuRR-C)1@Luy6xF{U1odob$cFyNGgOt2FqMeU2pb`rNTx-K6hTJMx5Q>w3D%scBqb9 zl^eL;>&XtCIK?gW*9d~r`ni6gvGx(svpVLIIUXHy8R+IRg#&UQY)~tm>a?|OprNN?g6^WKmR3`dCh;1p~Wa9O|`k&%@Gr&HHT3Z&^&gnRrhyS-6^w2daJ+B^aN6R%gT? zl>CI7j8qxOqFY$H+Gr?XLc?v#yot-KZMc-QIE^fph0?x&8?RUu2R>{(kqQ}?wpRqU z$O?3|tSiwTgotBJnSjR(0e1-@QDD6uq(l-_>t;lI1)r#{3~XB!-bN^j+`_TdMqIp3 zC6rlU+t?A&tHSZ!=Hy^=@51`M)n)|`Lt}Q%?iOlZ<8%)!q!gftN4Ho78O+$!5JpGLbA=!_9k~ULjUDq%i))wy5-c+1w_z zcxkKpgvvCC->xhLh_ofSg+{}88SarEa=vC=wrr;%a)0oWHw}9wi zNf9t)kG#Zk}JnWv5l*Xrjopy(B_poziew}oGfilvH;1~encY_VR4+eu9;ah5X^Zy`1f1rROd#OpP$WOKO5&~ z@E(=7tRX!TZPszsIaw=;`G~b}tW)fN^ZwOd(QY{gLDz(721|F((?!+sRS51tV9+mY z*_7fDiqME2_ONm3KDusHBvHLEShN;di&m!0!?D?u8BBi)(V^8l*Ie3^Ux6)o8GAq!|*zN z)EItX>G>p+DGMjMzqTn{FPt8NudkR|FM^PDJyI>t7IFqX3 zok<#f%Q{vbct%MWJ@u3Fz-IZ<{sb}BT{cf)DfjrwtZ#xizT|Y*uOy>L=_Z0)0b1#% z{DW~28Vv^C79mu+ifCmrIKa(uNSqbg>`BFj*)!T9`Nm=PH2IZrR0ooZI1>u&6cLfB z<3E<=w>uAmdfh#}Xr~ZEG>=ZoZGPR+>u@NrR|~bjm%&xCikpXKFv1ZXH7?P{IL^JB zxmHW%$jwx=&OC#^GtD9y1?zik1Qi+($&$ynMDt^*l6mtZt=j|6`H|$PCnAB}&ekip*^>$@ zB2(KUft``2Xya(Otl2G8wACyQ1wPjed7J*$4Y99c--GGJ>68KRav8vU7Y)xzmgTc;=8 z(W(ea)<20nhR0R7G18P{zeYN}FsVp-@^y*XgBNRfQOj>Dzup>UKhBNPeoz9C)w1hL zPOLCOTUeZRONRR`QR^HMrxG_yS4StR?!InD=|!r&r`;+1t5BT@&W{9`~jDjrc$G>sRIV^IUrXjq<6Aph-;VSJ6~9 zsG=!SAYm@BQS>81%6U5>&{#Ukg}ZO+fV6|G0i9ARTsreCdGy|Tt@qY5)gy^+XFlrb zy%JA~RTkBkI-uEbXd!I4##4Ef9xVMPdhc9xMwuV-C!)3Ad4xZ5jdSzoYVG$DqM*U{ z+N>|j-(Qbc{eE7!=(BL(Gg-+-S@VUg zHU&$c)#~q^DoJz;3TWfyIa!>I!8T{>M*VcBZKCYfpNH0amt4#jop(A{qVvuzoDyoB zSFhCFxrLL02|@y*Ezd);np-$Q{*=idv`A_>4+MZ6Rl?)6-dhpy^xh-z#l;K&TRTGO zy}@L;)_YNVC8VQLd%M%8O6`rSC*|hlqV|p#wKuAmsA#=KzSet;y+P)Oul2%SE1D`B zol87LH%wrXtVyEuZgs}04CIY-nyd2m*D7zm=(g&u^Y=~~uP*fYRH#|BdC_=>GxO+_ zDo^9B2sKCRMd7VM%6V8RykTG{(RdfL{w#GhUg#r3%U|&4?d&BYxba%8|O$ zgfdZhRe|bhD5sTHgc_-UtMOJYtiUazCfNMCXuLFH%tW&%f6;ljMgu6m$O$aguFm@{ zILTD=9RA*6o&l#Bh00q44QTEw;tBzh+N^5EN0oBR@FpRmceC#t>S|a4tcC!1PvttonbVz$uLPZ`tf(R*-I*;PadyGR4y$~ z^em6H<^>aHR3=`h6PC&yr#md5b+$_=`gQ1W$!sqEM$eJ|>*JC0j=9Sb0|AvQQ&_COWjsMpa^& zarXJ@VYCIy<5Ig$xOrzS`(adraPxlqkMb+|za#l)>ez4jI(C6tw{%sC-e>AsZIk?Q zc|Ij8Jld{$AHrj;N|w)z-L;+zQ`?U4kbyR z-}3X6PKuwWItdN?Gofv@Yy?ZcP+Io130liOmoGy&Mk30G&}chr+V~AJ`fb4?_It7( zj15?)PY7h$gGs7|ZgAe-!2lsHrxaGfLqhN?vV&lXt_B^-5JtKuXT?cGmjW4%a)OL`gcT>3**%dTRj4K=fPyK3_)8J_61aPDf< zX5o%XYhECXJ0PGQ{2!vwb8IZ5vX(bvtBm+F{0i+%V%X};62-EVW?N@KzY$F&E$PGy~^yX(6nt*>v~4X)6*Z7K%0ls z)3?*T8G8C_+;-N}tqeVV3GY2U-Q94>(jdzg3i~YSJf*NFkqclu{Y4N+wJ1U0cxsZN zwzp}uJybYXEgiUe&h-@cN0keJQrxE$&XvY{n!D}8Q z^WN)51YtT+C{(ytZ?uWuU7UkiWlCWV6WUYcdokErk)OqAYejxDY{^yR0U|)m>21~e zBU!nrXo(FmXi-5pjPn;BhZ;-l(eBd`?Gw0&tJmwtvgCuZeeU%2rkT-D0-8{? zQq8o!%(Pz3ZxBY&KAEQ|%%iO5E4=w&_vM+Vi;rR~L>GT%v>J))GIjA4C0*#^2&0*r z_#`xO?A@*|j;X}e#bw?E-k=XgSrgJF{{?QFS}RXIXyl5Ev@Q-^81eUns$5lk6W2`5 zDKZgT<=UNyW~L54gc=GdHvfvba$aT~Z*B{io)YEv?G@F~`&bCeD~ zrGpMG%~TSrXy7ATvMUNFK?PF)?^FxlHH%dXUso->8Jf^j+P;zoc5Gpk*pku^p?s}^ zPoWON(Z&;^N-A!IR!bvBKp`T}xohG!(Vnwe1*OKWE-iE@%c*Q9Fms!7oWAJUPEVJ( zh>l4?HKD8-g+Y`sardlozKQCECw6kYXxw;W?_jakTHI2)-V&@l9g8J4?;utw^i^66%dDtxYgVNl{4E8s_J2Pgq6Oa?-ex*LeXiA9pkDZ^o1sfFX zcY_nR?(kEgXC^G^{N8%vmD*DoA~oAe)!CV%#|kd+!i8i}`h`9YhnfB~_clv)N+z^d z!|*0IM1(?*MNJp6m)`XXvZ(<_qKZvj_$7?U4cv-U{%1mJ}#L0sy<815IddQ*521XP0F ztu)Z-8d*5u@BY9Q&d|uhpMeZO7M5DSDds5DB|T6}L}?$(@Q8+A%oM4q6#}14!lzDT z;DS%5K-NOZ*>66H42Um7n{~xSivLuEi#`emJ`zp0*vf}-7)v&>8|+zgu%B{-N*R6K zShCg%l0x=4yDtr^pML4sxAfKOV-;T?1@yozS6Ag2@oTxnk{ULa5aIMSWg(}QnA!m# za3W|FM1<-q^x<59hhQ_}>%4{GW*ea{5^mnY!5ihVl{rhrYl7Z8N@Sj@+J;ThGjKYx znnyw~Boz4yWwJ#I(6~hI6T!g7P|_T?K{B#;(sG4Myss`W$G@X4%FQbTm$(RA!ic}1 z9!)pTST=*J($}>?{%HGA?#h!F1eFrev>EI2SCN zMlQ9bt>#P1Zgj8OmfhlBEng<41$q1UvMTrLk6y09oV}cIm9vwb14eu~t87^#ybNwt zB0djiHM4k!5;rx= z2^P&lfsX*t-Rz&o*_wTLzQ`AreGr6X!f z*J)#Y9fug!Hsv|JmKN!6qQ`4N61H9(E_yc{u&tY6xY9tk+k8BM6b&yu3D-Dp3w^fKM~z(}$zCDm z#VSYDMk%7UX_S}if$i(>X1mO-S59X8c9{>dAWb67N_;5AF1ub0(K@qtGPp(Puc0ST zy<&~{K3=`O9hL#((S7&PE&ma{HvWT%!@jgzw(bt1-`#N<4yg)0h1+RXZMgKPXy0IR+%sX$ zGoY}>arvxVIgH&VBmM{}mJ4CZo7&PH(VJ_-gejR$ie996-Ml(o-B77LyE|sxHBKIj z!HZnkWNyzM!QHETz=6W}BfR4JBh-ci{}P7;!uJmtBA!pOd(i&p&qZ`D^jN zg@3+Z!YcxX$X9+f8?J^vWOZWz#u)L*E;3SO%RYI3I^a;SR|YwHE9=2cAnw9si__t!dK$aq$c+aS1)lpQSnQcw*be+m{;;H0J6|6qqbfLgfVh7cJGKr#LXjjHI> z8tA`R%I+<5^_!F+@5`D+EQ5%Ft!X4ayA%bW@mw(Vq7Yh;&P}z-r`Cp`&kL9xQ_YL{ zJDV`yvG$&`dhxf9akuCpOAAzA?}!%h9;3lexs|nOx^Si?|A+u|DJO*9c`O~Pl@G$~ z+Z3)bDmqPcia|1=rEaxNXGWmNNYms-rC&5nUMR1Si^Z{kFrcioSyq^cHtGQBA@Bzi z52)j##|h9jvPJj@I}WU&H91)?M5f{)kd23Bt_1Os?CryZPs#k%6PFe%89B|+&Zfl* zl4w-E1#f9c0=9MuSFqxm)H5Q8OK%wQF(OzftF1I*Fd~3LBu?dVMj_5)ybw%cfO;-N zh}3YF5)+{v@zdj(Cs#y!D48NdXc+F%cTecM8}#iA(qhw@W&Y^6nWSk0_QcU`@dCy& zzFD}-Ort^8Fg@;2_$4%9rWx^AywR|dx9&>PXP9tbFkc=mRTK}07_hX2TbWUJ|AdQ3 z>$ZTyN$ z`8y))ov^Dm_E8U2N0~a*VVTU`U}|+yYvle2fuQN}nHX0hw4Or_&%vr*Y@Kz!YP^~V z@|jK6`zZ~rbP#?H8`NTnl%i&>b;h|ev?PaTqA|UTfflr0Uj4x83BVN(S*t|s?4lL{Fd+%ju#pcz!j&F6=E8Nph zH9!|#IKBxIAkf7?@z4UgXlITCT?k^330=6{iHOf)hAyz~#I@!H;W|eAXzC^G`RTFX zBz?JY9ViZsb6nC1y*Rl4L}90tLikv2-960gBi%{pCkg#r+ADfPC5muaB$59ll2Miw zeHT%!sR!amG?%D!mxw%xZR;PavzRtWJAp{Ts0_4N4;&$)$I+F6%@s{YJI6;7{do~w zs`4n`N*>Vp3dtyu9|^#r^OdnjCMAoN447$ypKjN*6 z%QSJxQ+t6t@^P7?eO%@+7j>x#2ij@#Lg$+Yfn{o(pbyKu?87o^d{}0M56k?`hh-jd zGY#gn3o5fip)xH8LuD9;xj5P<<^j*7QJJL~sLWE=|3slO)u1w)8>{P4Bch#vnJpcF z87TTe*f!wIUD636rd`P2JIo-QvG^&C&9qzHN_=6Vw)B|{Xr}ONpczFhP~WS~)%BeF z`XE(R=!~qiYtQk&^j20Qelo5{iUx!jniV>uXrT*q=3~$qFsKQtYFO#^&o;YD1*7MQ zzEqw-2WiO*CrT<4ZQ`UQcXUc4*GqN1DofjE52PQAdzO=xSf}izT;P_n*js*$dq=}< zV5TUtQjQVN<9_KhdIWKvgW7m*+;bt%czeTq{Aa;@j^{6!&lx<0u@#4t^M5FSPZHQb z0H0r~-yNP{hA)f)eAt6x%azjW%M<%D;hy$Gz&%^S0n57cYz6mBaE1J@0r%YQ!98`y zDwSBnJs&XVJh%tJCA$l7(5Kd!Yd+|#1Z9`{{K zI>9|Fgunz{pm-zx7zCO?5FaN%xhy+q+D7~Y7O?|ipFTYG z$~NN2r&*m*6b1WaG)y<@x9z&y2{P!ZHP8Q518RqD>^Zp z*zQ!j(rC>ws>9gZ=60A`rUBi2fJwnV8KndR@8~-3+@tFpr6B39cSrgZ;fbu~1FT$K zLO;D}pe%0myi-~4mxTxaM0_(CK?XH*B9}H(ls2E zFCtoVyWL%W6&$oyvj^aytw?n|0}gtgXIj}7HnL+Myi#~;v4(_ds0WbHxmwCq(ZkY+ z(Dwup!c)$UagmsJKO9VfLD&RSL3WXN2#YM^X+Wq-0YWt*9D)06jtpf~{|+X!X9mk9?=HeBzRClwkLEbSldlf2-WP~x9bt_Fj85t~mR=dG}yQ1X&j z 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

%i3E~XFSz{Ml@6;*HtCA0gXT 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%0D~ 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 z z`y!nN0;8$yE!LdEQSAhwCr7_<@}y->WYTBAhQKWP>c?hbYCpnW(pV+IWg9Csg7w|m}%HlI_$*cn}!k_!W^bky<;Hm6#j7MNMu6-J5|7N&(sUi+=V7V${+W!%(tEy-Y zi{4O0O#A1|N6jGP9f)XfjM(aX4arSXiC0R&Alt#5vU zHV|jjhm#`+Jp*5QSIueCs~^J9j{I)^yBwc(5Ch&L5D>RhOzSqw2EAn`C^6ghzbJtF z4nN~wb?Clil;w8`G{U3b-_M8cpW}rCN=~D<;IZs-VCR_e8veDKZWQ;aruAcN8DS<| zHQl&H57(TB#(U}Qb~Y^*ssawc#NSyTuMro?k1-A_1IRqJsLpAnq)w|Uq z4NwsvgSx0-1eB}@m;uTdgEeCJes+&_rMhamW<#W$rmu{of)ka}q&AM@!nizgaENLr zbGjxHX;yyut{GHUolfsz4|4&NuP?f@U1u(1q*ti3&Av= zyGKcPxU4u{W6^p`S)f=MRdD3T?9#LXrd5t=aNI*&clb^Cx_|ELy%lL3qkP@h^QnwN z=_TXq-6V6DYs}?s2D*57WG=?Xhu3Zypcirj?h@K)Yxx1}ji{Bw#i#8b=&g3Xa&q#TM< zrvNen#878E)%1;3Na~?{wC7ij$w?>&_c#p7K|DUNmH!##*x@{8QjYzFILg_(_qS1w zK{v2Tl7maLaPUJ~{OJV}I8_Plh02>i+Vl{ZFF#3|g98~-(nE(QoedHQ4u$|%>tCbk z)AN_L#V-4~|2Dd%-)xzIrA*f-!a}N`FMxJ;*;ml+QqpS_-!{u0_khl z5^0&Gh2AeZi?~QbJ6+auusN^Q)-`)`cG7xwTU4&WI0Lh4^qWghRJ^Z43G1d3F#W1k-!Umj(N!}4}9&@_j+@Fz&io3G;<4p%^8+vM&NcW zkk)r%0W$RFfMB+W&2oeTG=1j8dQ5`}V$I7%U%ZZ+X z4;A*K@ZG9aaoE4Em~=mwmdE^L;xC?3wI$e<6`Gf}hGx&!GTSrrgn9Vo$<}hel)1*5 z;DYFEbjYwPpB0bv0m+>m)rMVp$d_@8dYe&Z+La5%kC+IfXFF(D-htniUD?ewNW1c7 zD_hu=KU^6%NYzH2hFy8#7jf;~W0aY8<%(EqTZLc#P1&xuDMRW=fDS5|W|_m8ctqbHfE>J+OED%N1wm3OX)>($#vnPFE>-5%Gg zCyg@hr$A+o( zyODO~E075DpG5lj=nt)Q_V2A_{-L$ZsjX$+-CE{#tz`~qEwfK+nO$1TJU+V>~JqNgxdSzON=9Yu^KTG@BfZXQYyow#ZlTpdSV|%CmdC$A>jtURF=r|T#k83 z46FxdsvA>0&h?HNUt&zlg18ocQ%Y#?l?Zxg^VvS5Eua`Kp9TIQo@hNnX*()E1RTCj z_8<%zp*#$I4~W2*cusc8@qYfS`J-5stH5>K-_`u8TxKa~%Qksdq?;`oqcVmP zD?@#74u+8zz3>mfPk;XWi&#fNvcIqKQ9ttwtC}-gtHy)(v+?ZTL`PZBDT=?u>8BSe zikynCozhs@pLvF{vVVvtBF;)K<{}n2NZH-fwct1zF&l@~!+8hs3%77#ZTdiBcCn-C z4J5SXg#!FxI-Yuz5dlD&h{OF%;-Zi)EirB_PJIlEf?Wn#pvq&YNtykgK9%%H^Mj-6 zTh=dE9Rd|o6$Vz(gf$m_T2`MITXTuk|5HcxnDBH;r+@DX!_P%W!r#_G zc$IiIzS8liLn+)*?_pdTL%p{mZ#MpZ2V6J@ClUo|8M6RCRlZ#-FAz(MF)R-UmA%*- zLgIvu&e@~*WnAx zcKkkmNZawvSSHeTJRAvSJC?O#Waq?cbW{yQv1BjOc6>HbrtSC>+K$Vv30_dz!gxF+ z)DamQ#Ni((!I{S65ocKzQnkRor}6kNr(z*|g_O78vWjLKtWUY%6JCrj%n&dZnpR^x zS;3GWxaEi8gnvk3 z8ppfu4mq0AnEY-+6(^XLN60DyxZ47=^4iYm&Nz-LS|22{dJj>SWm%8A<^m|=v9Y3S zv@P3;XmM`EynO6wiP-Cgc{ydUHF(Or+zoArQnuC!sk~bA4WE4T{T}sVi)Cgu-VR_a zHypN;#3PX53_J7radzgLp9d-Z$9CqaxZrN`ucA-9SrktHq7XG2goEX{AjAWha-eI-7^*Dy6p#}LX=%GCS-EPm*? zGBv|hJWfQGj6^&)LvmiSe43gey+~8@_j~!^9e$XWW<+Hke+Ajz29!wp9}=3HpF)nX zza!S1vNUH%B*eE{*zJy(?C|rbLu|qCI8$=~d6K00>7jheS*83f_H@7c?K@c0W2O&Rb4%s4Y&P$<1*9xFdEwAd>Qyv5XG^oO93#ul+wBxk(}$ZmV7*X7pLL?kgLK zvpWxEL!W~HBd*v!s-|>l6{a*X^BrcY+40E6uws(LRctE3@H_*Rax2aiQ<3696NYC% zQ#@Xe)k4EFe#VK#rs3JJJJ*5O3@Og?*}H)o)(z5HISyNucg%kH?0JKwnJ##42TSI< z^rH+O(ovK?L#kyI75H~ToPfZKQG`6P){rM2lUI?&FEUz^T-Zv`>?$uR#kws%tzB?88i|HLV|X)XmGEF4 zhL>QGViUquQ(^y@Ey>s!#Vqg3b;{o1T$3bvzl1PT(D+Ly4C5^mn7v9gy=Fdpk94Uw z_=@Z?mrjY{pm!%CDkl!e4tRh7i*rwo=bMibPe=7RL~s5N7*>v~HAKz^$ISLD3VGY5 zis#adAyW6k2j-AL$l$q1Y;b1dkhu=dY`~wCz=a3x zd)~DrB?q$2Z)Ma__3hu}{KtL9Yl@nl60{8o_BdAtSqe@)tyl#PssAGncsSoEqb?-l zadPd$lgdz?OS$Yf+8gs$z$g#nyuP243pYz?Z=_hJO!HE28s;)J?2UZq!LV5?)4Z~% zTBiBOq*YCs=2hA<%|Dhs2V&=TjmO{b5Ec3$}O6gGVgfDPii}!86sZQo-Aq8eKm^_&3LykZUQOFXi9AtuFiTd=8hp}7FY`EO6IHF^#U^g>(LlN>;ygcHiZ~tM z%CR>ztk=Ia&zruwcuSjy|{{PJ`8sp#q6S6ia{}(Fzl*`!yZ_sikS8<#7wH9IV}2zDq`CIlHttq zWh)dT!(SOjdfxamDTc~fN-2$BD}uo@>~RFsMiR_nJj_RexuZ3L`BnO`oIo&_b1mU5 zWH_>{Z9y*rBis-8Td z$l`yElSmD=RJ~y@&7#;> z$Rn3Vol5br(51TWZ+AzEuUtOy?uKiN8fhrG8 z413|p40Q#b@y(`m)DzrRy^rGfFvam<$1YeZI40M)yF_b-L<8SxImd8Wd(z8ZsXNC% z8haoa2?Kd&$p{iZC$2*FNyaz3fl+XAV?y2%6L7nr-tcUSbv?v+4JN7Luty*S!W%U@ z++z}7kgWCZAWQlT(OXj-kN$}#r{D|Oxq#Aw?`I<{2mXGXU5LNl;2YV9tq(7Pdl6## z<7|fc@;cuB-fIgZfN^YmsOeaW{nC@OOhe$Z(70rn{?jI%>*Jd#DA*((I*!vpw9!$6 z_sNrn>Hecx!}K?fGOTW-9#(hF@%90a4LZ=x^4a2Pm&>8t>~$XW=fD<)O|FdpneWqJ zJY5*j&T2qiHSW%GM1|CIfQ;Y9C{2s#TZ~Pu_XdEk> ztvP?5*d4(|HRqQTy2#-Bt5l^CluSBpHi|sXFDBu@xfvv57Udkn&OT9PHpLE%aZ7>%?+LPdr;9`=2iRzXJVFSN+E-3{=8_HjHfv_bE}|p$WYKkCn!%!5Yw> zs@jjL4~_3`yx+r>*s^Iq;s&7AbY3|6VitTF?U0PAIrJ(z=7ZSg`=_; zW*0i3@GsB?B4a}Okl-lHa8S)Kpzx`q@+eBZ`j6qY@~>K1nyyxwrW-2{hcvE4FY>wC z;+JoX5;W5DKS9q@jedi4p#m)zla>*k{CR$_j-Clb(PDJiJK;on{@S2tjiU#8E|z~k&Mv`U zsv<%Tf~rJ)it52^Hu{`L{pa9QU(RYr&vN$XUwjXe01_>}hi{Yge*O2~d-NTU z&J?|$Y0x`@YU1<&S)|T$r83t$i!xg`46i3kAp^4j!MN6 zz70PqS%X@nWDQ)jWDRl=gEeqbbHQ@qf;Cu_V6X=3ts7m3uDzrOcTrQfNhTpCAYa#d z+_T~so(Zd{Tm0g=NkOegT{yjB7tLkR4ab}$vCmRKkTOp$`~?0ntA(GyT&Q@|er@^* z;C1Rush(UQ{RIAe;5hvRq;D_%1oEYyK=lWPpTJZk;3vS}@Do_5+yqh^C_)9+N|zw% z8}Pyjz5%cO&JyY+eq?&e2f2k)KyT5jHg;O-g;k*}!;mj1X(*&2ENqny0zbTO$YEb2 z0XdAn=^7Ba7A%`sNh^$7BIcie0#03GIQ{$Bs|Wu=6O4?pi=e4Rx^U}1xe+=QdNrts zp#X+y6ROudc&Ut-hCybaQ5jU1UQ1@^zLs%9|7}p+D`A_Gq5CLc!Au+rs`~<`Ng6F$ z52~x8e=3xs8TF4y(^`RERLVEqVJ?6w71BNY$z+H*6(JPi31vX6NIS^YFgjvCh-TdV z5F}QF7K#fEx*ctUzKrO)mt&6pU36VzO#j5#95tH8J6zx=m34iJoU6v~W{WM3W29w<^$c}-udErz=M{p+Xb85wd^rdP0khEx zQA75JEQem0T_<`TYO36+-WZOfaMBOYg2w&rk%oZ-vBfAV?AO2G7MvlreQfT&;1RWu;;8xx!@Q8DY${K-H_{R%q^^A>@(}eI5BeZcRxlQpw#)X)n|H@tj;Fv* zFZ%|+0uMqTtN#GT0|iG~JC^#i>AX>XH4WDXb8btAauF+=NAwUXgA+4S0 zJAvG&2xrh*e|IhCN8ZbRqzN|jU|aR#Q))lL3Ot?^><3lMWG#5v189)?g6daUuWt9@ zH*_-|*5MX;k6^%p_J$pZ(!J#g8o;JZ5!XS>g3@tf(?{kQ$ft*1$S!9c;39Emq{T(l z^gxrkgH89Q=g6set^<{RwUsS1+Fh^@#$k{Ac`%SAU)>hp|0sdh8bB{9phf%%O$k&; zk7;@vU(Q}lKkiv~jPl($-=utx~T2Y4m!+69W{>u%v|vR=;Qj-6GYQmn097R;>Of^3E@25&LQF=*2X@{+%GfGi{M<{*! zIv{-O;H>zXe;zMO@o0rnicqDob~mZg%dArPdBjTRsnW}1$jH40ZT>}-^p))u#+O68 zBc`iT#1J>y)Z%NsU6tlorN!~3gHS4KEkU0yNUZrB_3eccqBOCztty49sL}4&_?pAN zmm|^7Dn+>MSYKDE(m__~xcJgHRjJ!5og82KgeomEOJ|m2>BR&5P61qF0Z@Mz58zV( zgDn8+!Q%lgPyld$R$ZI546e)l!EP$p206bC4UgTQfS^#|#02U~K^DF?m zyu~B=oB}{NUt=Wm696UwKq6O&0?Fur5#l-e_7&+%=v8=ws-dS<13h?Dnc|C=0f2?L z#+06vB_kbJj)^G(7W9?}P0J#c4a&(C- zmD%w%I21sPwPz*({BW-vhZt+8W-PvjH3}fc+WRB`yrBSMtUWgYKvw{lO9b;#C`XfX zYmDT*3LwVX3lnPaD1aDi*Af8wD1aDiFHQhxs{mrGy(9tPn|tIqNRBQMElmJessLiF zeQW~2D+(aS+Q%gTR4RZNYoD9|aEAhjvG(!=0G9$N#JEWuYfx?tCb?#o0*JBp*$Fj7 z$I5P=Yf;v72>@RzfEa6^lK}9E0>Ht;;16>F5YKgAPymvdODx|>0C*Sx{5pu_TVzB`OdSZd(uSvuX$z|nl6%6B2zT)kvUo7 zN0sO!zEO!>_!_XNgV>}p3dL%b(8OYuC>9G7bGhM3El-R`eDm{m3O{FP^iT*164%4|RP3cNxt8^{XnJP`0 zNpw`{CZ>~Anv#(C1y1UkuJ2@8s5Ippv0bJ2G2Nunlv>0Rl}-ZF67y9$jp;X3I-Th` zDxJynQ!1Usbd5^)VS1`c=Q2G`rSqA-Q>6=;E>UTXX|GBbGhL|C9I_|uhQd~ zo~zQ6nSMc~%bA|7(ltz1sq}27C#&>xOy954bC@nw>A6f_uhQ=@t*P{Uru#D;uS2Ik zoHlf+Z_cWml7+K8qElZuw8oa?AG)v>A4zX6@#2^4Ij{W$+HzWxB3`LOZV=vmQloS# z72WfH1v|pujXRG=BU_hOmI6`&+cfCj^qD32p*ffO+wP0juuKcS#4HtC11_Tsi3#+~ zurcIG{<0W9YNt6no&6Xvvy1U)0emS9Io(uFsme)5PA8Q!Oy!gyXOPP2uX0L}Q=oFr zXHMLRSpLykQ2Esu_j;r|Q6b-9->(I=26#v}72MP#(5>L6%)qH`J>u4X#;{fCwxsZf z=+UC*FhuH&J;cX>s^iu#h%YsX2w$f!33Ewn`ZImxp9XkFiW&q6Uj#DSj2gb7@m|1XZ4@XtH{H9UNlt4;3$$&7yOvk)w*b$*3b}e9xP=t8rJt=vA z^g7;Q3i&YEQtcsO9Do4;z@YuO7y#bTBk9KX=~h{Xty14D(gC3A|X7Me*(9 za;&ik&!n3(%AMrN|gT(2^@ zOC$3avJ<=bL}kuancu3+xy+2Cz?cmzrvHtkk-YF)DTtf|_<)4S1cWa{KYR*? zq2Xban?yWRLKFj{!&ZJTH5-6=*Q%qhgcxo?$O97~-mxIs0zy{3;0z0@7^S8n;M>t= z`RP{q@VN5jR{8Z-`E_ySuc2IFH$pWt5@2!VGmY;R%=NAXH?%Cj+p7OYtNxL3-w(FR zud~W;h$}zODj#8$-xyck7UgQLWAiW;BlJCB)I5AWiV$+5t(h7Jh#xG7#S((Id}DP? z21IPd{8d84&vsRIIp6_=&BkbGss!S6n$=XvaDxDP&jPv;KpnQa7I02IA>;ifwKQVW zehGmVBfc5d^}X1|`S%p8cW`CVM*dwBrvG@W+!=05k~{Z38Fvn4+*`%>VG+_|xp=8P z??BE_TVI+d*bx^!j9(gldLfZmzti~}oZBof;cu{S^LHtKm%5g>Aw`pqrqb2)siP>~=A(0m2rTL9bm@vBKX$ zWN#r4mdI8v#_&r_tLba2L^F&yy`OMsybUKwd?tR{3`_UY$Zln}IhijqJ-M>-KKJQD z+FvE#)qk#DKly54KEMMzIqu;-pHq)}dt>17__fcrXQk{R`+B`W-&e8Q4yn1KJ|&%zt0uxP zH}7+7OdWzR72|`@pyY^8)1T0|ei48pOYA)$#{+sod&S?9lggaA{-v2gJjmnA)f;We)dxYS@H#8tsiA?$2886-IthTC&V!WrTr^i=kN=He@yxXIlFG-w=P}|O}{*`iR(ETQ#6I*Ed zw8V}A(k^JyR>j_0H3ttrY|Vk1m2IN*Zfg$g$6L+;0zzvJ+xI{)qQ=%?i4w<$#QQ0q=*j}^`9t2wVcje zai**#kWr!L4Wk--iIWz76xAM-GnW#WUhwwy$nzI@$IN7+MGgNvA{PX%aL8)a0!RtI z#04Ne?SL_r-vq8y6-O>n>tSwkpbw0pp-#@fauuEKKO>4K1?o~Nk8l+=BnM^Nsv7mh zf+S$qyUtmMS3^gx7dySsop{ftuY*cw&3yhxp zNn$hrE;Wd(An8;sbGfX!zVUABO_G0}uFqt}W;5uZdvQ=^ok(kPErQlA9ja)Jt5wn3 zeJyE?`vqAF0dOdJWAX{h`44wm%lUHb%lZ=>EX7h1mUH~F>n(8(q@OJ(R4wKgWE*kI z@R|Lx^W6*Nxg1f^)WG7YH4N(kG!_|Lxrogr1x8jb;u=iyX?>kzwQ-uhV#*ie4hHPv2z_~vP8<>A}Q51&5i&1ik(Ytw2sW@&hH2g}itoSz3Oz@X zp-)oBilOO@Bo_XPLmRrLPz&b4t1*qT#2MxJNq9s)gkPafa}iK#Ath9CRx>BVCWiu0 z_Ymq%O;_JI_zOykRbmXt9k=R`I*e51!|6$m>ZfEQoxIQDxn6zo!a`QpC<9OV;Ube* z!`ZCiX4Wu|sbZ<%fq-%;-yi8GzG=gGmE&bhE+!S2-U|Gp8TmID19&nJh0F>O-@P zRpd0Pr7u1G+q*jE4azEmN(6ti%Yu)jBAp`r+-3n{e%Ca*vK1u-F7hH?CMUcQ*_8e3 z|3+sZ|HYIFv*Kb@h{J>6tAhqz3kVALp@nLrdl&ox9}GZmeLPq$q->*r@GiV6#7FH} ze@NYn)En{cRU7eR;7C+*s7OkJw3!S4dh<$m{5um^;8+{>X%h@?iMMZEI^@Tn@T!D( zV>BXle6AIoIgi25^kzr(CbWrVGI$E#mt8lU^UIUIqv}by5;A7|iCK75_JLtYu;3vU zFsCRI_|B%Dqsl z2JL-`Ee5a`n!8X{7tPqt&)LqOnF!jCB7|CmimacRI0cFCWKgv;Blv@WApSeNxU4i< zelkve+i4w3^nKBcQrXl_y5IF@LsvvM^ABW7sSL!S0M`ik_5@B;)J+^fE%MTezwJTH zXL6v8W8wE1kwUn<-6dOV^j{jyXwOzqP2Xsf;dI**0A2&2OEe?wRRClR3P$gACW@mO zjYdg2jw~vIiUd)szzdgVY@k15wSoN>D}f#_rI_B|%5SzcUr+e_>EFTG(*=#Q^!AJ( zT!0aHX|D_3o_pC-!`qWf!}9igv67ofGmlN<&?iR~wW`wP^DQLY`D2se)fax-1{0m> z^7$2h1^n=8birj2+!fw$2O>8qr%!LeMJ=2@Z&}WhW^=sL=cOKQ?oe1_1Wl*UU;cce z)2BDsPhP);XgnEypLd~EwC1Ru3A{k%`QCyHZ$}<@OoU&9cCg67iOIM;4%ow|l7Aj5=HpE@TVFto3{QMg|IU6+_ z!mYb&&WEbTa^`#yFQ)=XI&&_AgK*55vn!UW<;>X@Ka?})2M|{hojJn;3}?=r=ncTa zZvx1ag`_`r{L>gxhg%B1RsR5nlZWS`eF*W>KJRnaqMjH+z4@G^a`4{Z$cA9i65Z9N z;#=P12o^Qzu9S)&qgOM%5pnfG6O!@JU{UDqJ;9=_7188cgwpQo)}aI_7**XA=%m?} zd7Mk8{uJKLn>>zx+(fk4RDRHW~K%de|)Z8Z2uEzsEsmvyL? zgGB=8|L0x3x7h04dXua7@|=2C-4VMxXRBvSz3#1Uay$OE%~AO@s&wJXpT5jDrhdcD zLrnv#-Dp2^U?{bX_FSZ$#HPK8P2?U|$Q4DXTC?I>qvB?}zB#ACH>P2r?hZ9=*d6Ma z?ra#J>RdSi3Y{O^Im-qHy`d)0n5N0+6@lP;>F%eSXmtt|CcB-rTwaQZfA-Zg$T{8H^p{b&-gR8 zRlPpP{w)4Fn;+?Fj2;G84d7!q5ju}Jp12yrnKQB$wxFFZ{kW!M*l@q32%fjTCS6Oz z`PSBG`Imj{b# zUBPruWo@ck_tm;K?DFPp4s3OW9!l|z+2GSxLc8fXw9V(NpPGUD0eD6dk*88;>0WzN z(3{Z|u@4Ml8F+J+P1%mQUNas<{R!6>=Cnxv0;9jlnAWA7)SPwk~#OY*`DMQe*f4WtEzgHJB7v?`5sb$~S>6zA@`zz{I5d<{4S6?+6!B^0i+M+!P|t z0cRoYcZq3xrG*^{wa(u*_*@Ut+k*^>Z>*xBAAcbip)| z;?wIqc>ctBcq-JOTa4xNsI`1jgQGqH86BVUg%H7J+2GC@u=hdC@~lP|n9%4Y-D}SQGUe_LwYq%^3fvuvnkt(M z10D3Djqc#U)F9%YR5oV?Z0=wR^`^dkl(wp`RHtrv3a?yJY8fkIFVq=wSF1ezhr9nD z=IO_N_y6;Bi>KH8635ebV7nzx{~Uk+-@(&6qbL8L*PhW}j|1O@M3yfOj>D^KA+j#oBm;P3sE**u8fH3x6cNo0fot=&= zS2wlCKkYuDEFLOK#%0e9xY_Hf+m&AC?!6VFIo`C^hqu9xO>U?U(p;g*$-%DK2<0^8 zCfA`lsOP5pi=kI`=?##4Qk`2M_%!04W-4Sih&&hRsZXH@N;OEc4U}dZ3E&QPd`ipN zGUW?^bXds!tjulO60zxBvvEZ&wao3@6to3Lq`DpM9pqD+EzRWV3E!+@t0pT>SoG8dJly2)OHm z$S^CZf0n;v|91Yg{_Xv#{W}HhK3iQxzyyiEm51$)C(eL)?Wj5eDG8C*=$rdElCCHc z1I)xOpel3t)(I2Uuj3;Xf2~O054>hVuXu5!9W9$VyHIoakzD^zk)Gv83a0n0jGjKh zQT|=7%XZjRbE?m_4j`(1Ks~a({78>%-Lt3 z{oZS@wf0(TuYF9&hH@Z3b3tePtkSKeAHx|sYesf}RMg!h;D5At@I9&xw z(SfPJ#LzRz_jNfJ58Qb^JM^KOS;Mb6WR18 zk#+T|2m!0)6v=;JqD*4_r-O`DyGf}>je#;65$knTVdUuG(2dCo zQdQz5`UZQF{si0{wZ;nEOoqpUY z;F2|i+F3;+I)9d;xB9pMo z75@ITIjh31lJNi0Z8m-!rG%BopR#&;jr(B6k+YWGdNcMgkq_rdgRUUz4iAyf+~UgU zep8~S&G~T{S^b>#^8FmXucvAC-gSb2ZL`wWU}WR9iQ}$F=fI}$k1LvPd(>#?0h|I4 zdDja#ap<=^7`rxx8?tE^E*ukx4vt=mUT4-e5ZJZ=E;5?@JG~_@HC1*P&s~bw&`SKf z%y|+t-&X4_Y;KzKT&-`?W`bL4{e|0nvFuFHYh|?7TeiiBETbMm%|>LQAe`qvr+Kx0 z?j2wCJ$YZd{u1?`STck%Tj)k|uH-m!!>7$@2@jn%XFZ;_o91jz zPE(2E;ZsziOLJ7BLDOcV6q`0W^t5-KEN{>&ga4#IcI#&|V%bH$rdg{hZff&4ZeMXN zK8v~P*t5POc4v;a5E<=r10Yox2JZD4PqsxfFO5ykDeID*_rXOjdTe8nZc#+~8Gl=dfYw8QV(o;WZLqZ0P)iR3uiJBF^c<~I9sI~dI;oBV&G{m)6p zI!GA5x61cBZl>w+=&{=FUB+|m)Y9y0xa~u`y zzTC~h5(w}d3axxHytT1c3RevbeS;Dcwcgx~D1e@n4p`a7bN(kGZI5bjVLCT0$@8N9 z?&Th}l}9t`Gc&?7qy9hQ6+=T@St2|&>VKwb&L0V#N$#~xbDkkvYd9CsSiV*!&C09w zx;9Y9TF{4ULzDj*88B<83jdL~7lblI!#`dlkPHQnFEl7Asv(>HTE)Enu@>GYO5>%q z>!bcZQNDk3lRu%8StDw_-Mi)f(K+i2H@P$Fd+VC~n?xS|J{D?G|0d(PS?i;fiRki; z2{X@{5_OjH^HRArKDw3Fts0;NT55nSnvqHdfLNKx>c@DTWXCKrP-R6k53XWsRf?@bgJs*|MR$u1rd;$6Q@IBa zt4{ul`7bc9M^~ypB2nluuRS7nFlB~ak!@KbWfuc38uIcvx*^KimVLXUD#uydUxH0H z$Zdb9%ob4pm3{Tkxt~p zFjRr%VyouMcwSWG7DooyamP|3?pS7l4%>GD-*v#{WkUJSH*@dR1n)fS-bag3y840AwDvj=dEN%V?rR&~o7 zL2>{DG_2N}FkuJbM6*Cv%>u&)Z4`{j`a$PD%3HQwSjdainr*g+#i39nvT61?KI&-~EnbsNJ=r9)YH=kOZd;6T0gf}J3ftOUBh(1Y$jkf)r>{mPhaOSn`g=8m`#=M zgQ)qh?8XTUo=eSR5Ho04H(WO|>i1bA*l<-2^u}fmBh~vXlaI}97>gP&Rt|zZzW>=$935*LgEn&<7p31Xi)c?7dl2>k!hTJ&!hB+9O-CWd9;hXc# zK6$>fZGf9r09#;|TE}|jR@= z7%Wd{qj?{9#8m(o1r<$WEH0^HDVR@i!JkhyE54>Nba$fD-7mAPlqEg0BD&vk`Ku1@ z1lr)8f;a6l{{_$B;-`9s`2p(n*o~(&;RC7&4(*Gsf^b3@!=oMcN!TX+uo!zlT74Hr zu5wsG`@4N7{7v(5%JGs=N_w1)!fQ`WQ}p7@jqxAo}IEp3Fc~b z`2*3*^6IBf3}GjJS+=*g?T&%o?p>`jGE2RYo|~7ASu?KDy4u@qBA$*m<`Oz#?)z6^8G z8^`*ltZ$&%NGcC7C$80+Gt<|qp#2nzx%wYclm|jE$i5aldhpL;;vQ=+C~^BIbbZd5k`h_5YE+`tFQ_Jl@Hibs|el`|PT@Ds(=8%+NZ<53+_ zUwpC4GWo>it;93zo8(rxa$HTBFIS33qL7;llC2Ab6pE>rFM3~5yLz??HN=+yeU?QT z-PQ_8%#g?e^8i#{*7^d$Umb;M_$$pkK<>_+3Or!7d^0&!#-w1;$cCv7S#j*995*w4 z$4q7l8jjAY5-+T=%1(cDpA6V0|3r1N)MhC1F;ulDmlLLhb-1!-eKj91JTgL+tRzFv%`J?#Rd8GnNMLEM&EVus^ zm~W$?W#q?Ft~AhScmZOb*2v`Vc(1R^Dh&^i1=hPMI%j6-Tlm zCzh_h3TM|>Wtn#^6I6ra_wK#+rv2I3Q$~3KKfh`@D=~ z;CV0ue}<^%e5=QG@8apy!o~D%M~bWk=yFg zdmNVmZt_pGa#}CX!hUI!t0KxgZKoqlRoLxcJ<@^#`8(6Ggm<+OY&_k#M+7NByFP>M z;yWuQP=WW}mxG0IsbYr-f7^nC_-Tt>wXWvX1A}lLUT#Y3-Bjz1Z2atwm*C<*TzdJ5 znIb(oi}6))d2jvH+K{_`>SbX@XcRX+SRVy3+Zl0hPW{no;eqwd7p~5;1|3hV&aqs_ z%LTSpjFSW5_sSCBW)}0m{~}bPa%RAFj6V5evnTqejs$h}!V!;-7joxhZft`73T zBlpV-E<7>g;AJHNg%-h#wYo+S_zAg=IJvx8TYXb!^{h60tFOqT{Lnpf@DB=l_aH@7>h`nO|YbEiW2 zh45oH)wixkvbPWmpd#}wNj+D{`^5zB)MWdg3*ZPkYI0C5A?!!WH;`;qr7{sYFc;@mK1N4 znMNhvB!v>cV*Wr1x@jx!RW&7k#oYNiW!==WPAy?ljNGGW)rm}zw&??*{zwk)a3hCU zGKp8ha$M=#h9c$H=q(C!;C|xD6rm#NNeC4u(lDYILiNYLYC@G~4!lhfsv)Ndp|XA` zRLXLwRGy+z6Z@!?53(>>xB@27=W1niCzdLvV4L~v%loL(c%e#h5Q0vKD_4jJ=1w*> zD#$Q@1tv{xUjj@vy;_=Xq$V^-Gt}m(Ah>?CNA($F-IX8IQwJS?5;>4EiBay?=r}y+ zA#XIPXhb@N=A89m>G%;S^w1yC@lodRF?75onUIoTSxjG)Z5p7(#hyZ-1+;`_$4=vn z=%*o8=T4}#qQyS(wYSy0_%gfW12U`?jE}Fk&4;tYM-q{q&z6;yZCw8ChRvZN4u{^o z8X9BM>{Kawbi}VHw7MYETm`l`8EMB+Xdh{}lNTda7t(HgqDNGb_9JwPt%(ee7=oq| zcNteCoVSE-<<}p&ncv#*DYC{E=({RZVgJeWSn}<=p(1|0q0{@PC?@@Ul~T;ItP8*F z>+5X7Ep@#>U+H~$A7Fo+KCxfebMFkK=Jjvgb2rfCuitb3+n%r8a|?9pO?RN=L zlWx5KX|xRbBSlY8D?Lfucz?lutG|xq^ULj?u^as#>qshokkXM(qkKaISF82zmI;3k{SgPj~?4L0MMk8bLs8^u<~zOQ}u{z;ocIlV4kPA{SFD z(fEIWrB&ctPCyy@i0Y&ZBIpRemFfhOo(V8@Q>axzLjeI(7Nr7lk zhNfvXM1f+rgLI4b7|%6FdeEXodeEXodeEXgLM4$Nv?!7IBVIVRRU#VJS`?A@2P0;d zR->H7n=*>_MZ02w3D%ja#xtbGA?I|sdeGQZxY{k3&(+yiWyd0f1^x^KC0qKK8{@?s zUm0Q!r8~fJzLNK|97;mx@Jqw^rDeS`L@cHiL+JM-lCFj($a7A5!>m7}k5SV7+Oouw zQ3x#2n!dCh1C@@(+NLs~?K2t=%2cSFqMw;WX8lG*C}swtM3SmJqNI_U zl0&|tc&(w4-r*yYc1sV9hKpq|1xlzdG+Fo8aQZvW?ys7T&uEKEspmv62t!~UlyR6# zDQTTI?&4KNxEzNnsv(P%#n(6f}-rvZ9`x7w0+rCt#=P%U2a zSKUMl)l{ky+%zzy3i?FW0a~CH^5a!tu2h9e6*P=|q6)ePpcI9S0OoK2GaT;I1btho zhiA-4mJ)In!%tQ?V*{f|11lm;Wag? zExLR-xs+z+Sp=_NqnR-pTd1s0R-621@(84;*3hxfkVq#MueO)osr1lj0KXx+2o@u^ zUL`Pg6%B9{P)0+DugQy4n_f|aisL6yNF~23*%V+RRPo2ECs+k)6@FW^QqQGprSejP z<1O2rsB8wsN~8Vl#(D3dNEN-2}( z!$+M&nKYX3O5*KZtCUGfCLTSRGRb6x{C&!#tzT3ob)i8@Xl2qtf}4@gcH7FNuqcx@ z8<8JTk4%~oQOcurwlb;NSoIIGM%UTOq~<txRh9GG&t7QNVRxN}1Hs{dLNu zgu=Cs83O<IvNx2uRQ98U;W=x9-TT& zGhJPvvoBR13IEm4mpS~`ZgvcD$rN=jzu4iwMjFrEf&KL`)CIn1Fq;!%dR&@j{b`-( zNf55q7H;vy?nEW%M^sVBIgdH(H~G6|1GdS3Oh2&OKXyrNQ{~USu^Hq1u^H#G$U*~r zt7l|cE`Dm^h9+RsV>EsnVgdvkjpq@lE!*NXeDT^%GhCSy(bScY)VKPF?qm}rfrX8) z>wzSDkv3z%(=^6c_6kxMv@+AY#=3o{FGMbKWi}$(l3SbuhyL4?6t>|>vYdF{;0_NW zPH9(}C@C{C;^7M@D}1|M$eWyi_Qw9<6f;wm5&HIt`KL*KX~IR44L^yhZaFxuvTga1 zQe6yQBdX@rGhEgMCl=5%gaYhr^T?*pNdAk?H>7ojYXF+%WDFkm#GEfmP8J9rmo`Js zKTIUKY&Q;!CKF~3zVEN|x%4Rce-O{BgshDScwdlq1S83L9Ns&~=-u|d_eDXFKipn< zY3#nNAs@c*fv@S7=VB{*6Gt)BTHn!B`KY&hkI{fBflSdI!zg%;A2YJ~{Kkv*&$p;a>lwBlIr2h@VOhg0*5;;EiT! zlm2Wh`mrl$@iu*f>M<LCi2H<$=_l| zb~rJ8*O)t3gXdiXdq+RmtY{U)usaeolSl$)v!z> zR~@Ds{N5(t@Ay6qPNWP9wlFG{zeJGuu&-gx&JfmETUFs07MK*8Ptd9D33`-00nFZRb{?;XQpyv-_X zwM_~>#to=Hy0K~2`xVj3U(3pAd>Ii-xDbcy)fzy<0=&xU=U z1N%M&`rAlJG?LBBs2BU=B5HsC98?}L78jO0zvrQuzHYt;WJ zll7BZ8_yE1v4m4S(GwApn;X3iWZ#uK^m+=H&|l_fjE@6b$(g$8!H;{sF}e&g8= z7Tk(&N}kq^1E3|45-7=EvZLc8$ta)e7&x6R7Ais+bys#pbf?(({nHj2gGlOqvP*Tz zaa6pWT3J@#!c=Y`C15QTZRR_%Bq72DOl>A9M|pj*i}LvHEBjOcyJyi@FS2&-F_NQp z-m;cOE{v~y(KuX)V9sFT!-C6WMci%ExzOz|dlwqu+Uj$?B3M4UiSjRxK`){&Q3u6i zJ2EIYF(WqO5`W2I>^2hSC_0{vp{L*St-kG$cXd{!YX`kpk;6zPzXf(z?k|Y`58zqEZN5RGe-N)+2O4};0j_o>05n`%eVSRqq4o~ zn9oR2nf}`V&3fj*mBD((8LM==C5oRI&asO=Bt<`|Cfvqjt8Z{&QCRtN<{!m_fItos zP%X&+DqDp-Z=?VT)4Xi?$w9W)uCDKU{yXKIoP{YV6P^;(qi&4y$L`{WzYF})TQTTv zW7L=;W`{Xp;KtAwHEUQbPA+0pWpYz9Nn)ZVsrh{cN*p_Pu%8o8{-!H($_`+Ao|M_! z$dyHsE0Fl8fJPxZ_m}Mwcz9El;BT6pO%VhA zE;3w^<9EFryS5Y<7ehZLe2i``E3@ev(pZwHW=Y{*nLyZ8|s{6f)ldQE!alou?7?S^T@y+VKWW#<+iQq z65hhKi-uvW6c26jV;<^#UTqc{Tf$RyL0QU(F&=GG*jCL0lK_^blq_xVWEVl%{>GNj zOQPqQDtexB(enhbo12Yy5G>4)Ea%w%vHu&T>QcAXl}q;ZaVBnU{WvrPJB_nL zMH6d{;x1KQmHG5?k&RUpU577*HC=T~aA8|*SzGv4(zKdCy$eI;wonECllVVvokH10 z@tb^oU70Dyt~hKK-$57V67>omTa-&nbJ|j(u2gEot>#SXpdC}H{+ru`QN*Ib*=m-l z$l_LvD}6=R>PTZ<*EqB*HN?#1S!JF=BGqN|fZRfF6w`P*U!F2o1RnB&Is9ZMw|g=& z^cd*w2i7vO@&`N!$V}pPLY}HP$FlCFmkujlcD5p{ZB6f;eK5LW!?~}Z322B=^@}tnqrBmj=v!XHzX$j)mpK^d&3#jcvqQ|S zHCVr7$%kD!oGIbm5=N>pd=W2yk(X#_f~M31o^S8K3NvV|l^TIvn|aj%-MZS+!2*ESmW zb}sX_EsMYq31oWp^n5&=t!ClIP~mhvEz{Mkc)VpB!+9&WIn#1nrscDhZ_B*MoQ$!j zBv)qS8^*eiM_EHiZBNO^r;2H44X33*;VA8wp|l4iPjIMctUEM3c_Sio8()FJi&q{U zmoX?KJUa4eZ#Z8T)!6k2I)4h;=V+9GanPDC#@ev$0;f-^uj{0h36lpx!XNn0dS zf0Xl5U@aV+{AtQ&SA@ZqjnTU50woEtv$01c9fx&|E2XMB_=nVRz0^lnY|Lo)hH|7$ zfkLiv46t4NS-daLq_|xw35<0I#|cE&*YzcF+Gv2E6-7=flimdyF<)&9O%JeNE!z?v z=`=kjLk!Qlca4d6@9O1F$HvXhmyG)G4Ch;<^Ztlg-(qJT+n2;iFg_dp#Vxq1e-WYK zsT6V)#4VVKVswp>&dx}@yx*8Hp!Ib!8`1W{j^8lg++bhU5gs}ogp!eJC2tw^Y>Lm4 z7`tsMj--afr8Ng3rH<;WU*}4zTeufBYV(vSh=Qhh6*OaB5Xw6ULYhd5Cby5nftd-~ zKmh}z*qZQFK_LB#emo2OL^)$3Q&LeRybH^zAMau-&|)4p9xK;<*0C z41D3uGx;BUluLgBw8ozj{<6lN$u}-1;n(R~SDi3Q!-z?GsY`11NlA{CAC{$U;mf|h zJly1_3hJTZf-2nHQf&I02i!jolWC!DN2WfDW9LMUKq#JVqYsDqxsE8UzG_&Db@Dukg|czph11 zs>(Z6m6e**AQbTw#g(RJwhTvMdS;J)kEY2AVAHD09PDlE2)Q}1Vf`1gxwwk0^Xc6Q z8eeBLiX9_!cVzdN&9dH^u)B%rO?VmGyPUB&u?>B5l^WPPm?6rY-kXqK^^$w~*XL$u zoGM@{1%$Gh6}L=Ey|=L~JXyvfH6iJZP!r;lp_4h0GSr0pl|IRQD8$-tJ{0YkX|FyT zfKW0R#oVaC0%VU_QP_@?7^C3{Y7fYf5dOOAg3-1>;nqOe*6C zxWh~eH3^io1rqxv6Pf%kc@ze+YI35B>DG1=w(cb75R%>uar*%rj zOQC~ z<9K=jyTcB!sh-ItH!_prXuPaFoa2usk{{C`iji4-hoG)8ksRqSY(cKT1fJKur>tYe zn39gjrz4lY%*?rAbIg&{=w-%!PoBiSk%|2yOSUBcl^2<=h?MCr#6y>^i2JmQTqmui_d)GYyM;o-? z>&I7$T|yw1JzDms^hz3a$f#+je}sg~oNo;cx^}3R>(8vya6vGZ%_dK0q3LAVMHcCV z$};&%zFURPGOpj_T~|fxsA#atMfM!Kw7x><>=x-h9?Jr5Ik^x>bWT2GRBz$G<&aU; zrUu;>L-Z3(%yXKe8>EO~bsJoRr-RkB*zdrZYNB95EOOV4lEI64eocx#V(*JxVUfBx z9oWqK=de$@fu<#_S+rwE@)nQ;jf(TXIk*l`|e_eGIY~dI;FT^tP_&w2joGit2`dQ#m#OFgCsia)&Px^opq#;o3Ku`Q64g%wP@fSjON5q7 ze{{d>ofzSZ14C|i2bBQG)rN6k&=XRC&}kIW!3le9zP zA^tTz(uZ9V>ow-a&2MrR7@*%I0=@-C@v@?MbPb^A7r89IV!m$_bNtahc$xwz;OQFM zApS&vQf5A14pl=GRBiaz%nYt3r#YS<&>RI=#@)~+1#9=%Jr>|vNLZR5r=g%hHJ_*S z4HL($^wi`Z{icF1k37k@U%gg4;Pt%33J4h03cA#6{-@5u$jk+0-rjQ9crWhMl}LWq z0k`#+DsUSmE%`EVbIC^=+_pJ&^#`{#MBCu@xvIE2Uq98rt6C2&BL*)xZAW_P7+F^Cwld>U{lFbv{d!Jt%!3{_m2-0k>DZCxY9p15X6EstGo@ zt&+rF0Jk4VtOB>^-p5SVxP2?bEVvem@i&5=puaEhnMl;jjk7rt65UM?j{uIl`MESI61yOU-2 zIu~c0MR{?)z0Cgs?9&yju_`5tovZ`13h7I8Qf%D`Y>Uk(qNr`wXvvI8wGE&(aRG{i z;G1|^OWl4!uZMohG6IGpEytzh{ZgtvsMOTd&1BScVIiw|j@KoV-I!M5z%nE;Y7R!M ztS~)h^wu8*P3R>!w^eXOx!?-H42*bx0!kw~(z0_I{&!i<|Ypq;0kSmE+UjZ?ly>r9V_rDasNl6F%c`J2EeDhixI zA>gAulBbXS30PFSC&@?f5eYrL1$L|XAjeNN`E#2@Q>EaRQb`TW>ZigDpE{Y+@zJ}I zg?Zmhp0jlg)t+LNS>vO))F~v_a@aF+kh+3s8&X>&HIS;G3Tp0mGNnV!U6RFy)b)}F zIP|=zGM@mcE1m59A@x=%K(CG`RkrGU{Zw@>b26pZ`F+XaKY~3PMb)abi%+>+( zYE2mxKWe^8oRoj_v`l?d6BrL_xT1*6ZM|{HPQPTE3vXAmjq+6;Wi89zv<8roJLE_y z^eavplpFZJQ0i!*Ktg-cbkcqDeVoR~9(tYHor;uPq)?RIhH^y26Z*h)5Fs4fQ)QGO z8#(E(zWReb7miK%wZ%+AJ4jI=BtEra=8&dm<5Xl$qLVPc{~csbLbd~&nzQIM^7dtU z=oRYnM7$$XxP)~V?<<0RDjc*mA-IX_<4)~P*~l&Gma!LZN%vzW(1wjHw zCn|&(tI;x6qF^`AtpIeyM|?V1wWeq(Uw!hMW;Jtj(E90w}SCw9p3ePq1A=B_n`Yv5Qn?|~`^v92+vY|Tj2hza*m@Eyf*_eEg z)FjORXB9E*@uGUkuE0X@jhwbtF|5fZ9V9!LiT(O`Y>av*A;0_*pd4@NXKWdh%j2Y8~e8jSbJ3-08znywYjJ$M&NcRd|WEUyjx2tgVA*z@% zHx;g$@|{$;I{#vwp1gCr1Q>tCEYRXI8LMy`L|JzF=8{{4jQuo**wopDuxELXQ>gIPHfE%5p$jh zp5piC{|-NQ{r`!dWn9+{WjxLME(4IqDL{T_*?EBPB0<1+uL4*R7|`h{ubdBHkC52x zXdhaR6RSb^itB8&ygLQMe-B!|UC@eylJC8@9~cWt&OdTb3MIb|-pGG;qQHg#CtpuQ z$$&EWEUHT%beVfK91lp@ApW8tm&oSK)Aht#tYm$?tRRe0SL8?>pvXw)5EXJx=oEh=- ztd`L)PMiqf8vi0}2Q5QXS&wR24SQOx%Ktn3i=7GOVU`K9>t`eTL)x#w_8%_=Y&QXL zk)wx}oeS9h$T)9GHlGD*S?^P(61IjDX>mBv!MkS>se$&vYc$?%NWpA>y!(YFr0{MS zc-2UE$});hV;~gLttSqw@;X=}ze=5j6nSl=J4hD^Pn+jHS}Mg? zZ=niLG8L}!>`sNN^Eaz-jUZhGZubIi6s*CGLdHH$f|KISK70v~ky4S1Y76+H&Lsco z7__Ec8q}sMew)fVc=x=Z-*?bJ8c<^bIy}f8B;cj+r?UsJ zZPpgpj4VV8h-~Ly83`07aH3NdHy%ugRf2GKo*AGF+t8`rRWA10_xz4QNV9z^YhHW> zDdQ()ZdsdphlGXzs{bHO%2GvFG%BpHz#BS!GlHbr}16yD3xF zG&&%6=G8WyTuBbnjemwuJWI!uQ}X4j=iGfsQ6)NUJ$woM+(#D{pU2wtB+pf7XZ$|( z%q#6s&niy`g-RJ~)%)Ci)}2lP?_DC9zsd3*|2vha%JaBRT>1hAA#h{+B;!&tT7D6{CDm6t9881WC{;o^B4XtXFf`c zS@AS#;}`H5Iv?jc8Sz*67;`XbFS^7v=n|g*BJL~dlxd0nPCsqSx!yXq<6<6=QvZ^) zK_#h(KCYgkEqaKbz-lG3k)Jp>^KfrafFnM}+1J9?7AAtxS1UOBR@f0te9WHgC4XU$ zvNec)=tZ#$PpJOtgVDcM7Mj6AxjB-ld+T;X&g&nW$!D;dV7~+t9&Hn zkzw~D<4GPMCu4skxsSlgUXkz^v9}02!i9;KrN*${X?v>6TB?W4^oxUqxmAToZy=fS zS0`4pT1Zv+awK^(CyGxE+_c;IZq&>7#M_etxx1{390Aw3dha?~t}Ik-dtmND&gIP9 zcCl#sR^2yZSM=f$k+UX2OieqifNNI}hsRBir~#*$Ppd!>m#~fd7_hYyDJ?07l|*Wb zH*(R5J?@g>YFj=?4b=?PXPf~H1vuRonjs)DE;V9r<#JWaKafC%Z@awQO;M@OYb0ip z{rR`@auc7W2xW2Ld7=)0Wc0QD!7q42MK>X_c%-x=LAbb0_gCQwJS(9~;)^LlX*j(J zrK^xg823Or1eccnBX3xI(RzeoN03JMZ0e?ERi*cj2iXRUb6<;H(M3yNXuH35kjRPi z9%#$BQH5-bR$;FyPT(UA@)f@9FX2M7-6GWM!ldcvCCwc@+#pG1Q$9mtaAj&jTR zOKf<=GEY!VCj*MzyT7E(Thc~ldPxOt>cGHApaVCK`$_nKO2~H&&ki7A@kg9qM?n|n ze#$t=bUsS~oq+Vqsf?^iy9Rqr2H5>&^rSNA^q~Dbr^XtG2C;7w{#Jw#)qmxwc6DR5 zAOs1SNMKShfr9gY4KzPwy0~zm;$@IY>=Hp8F*}ilTKp^Rv-db%@q5 z(hkK)2~Q~NT?dT-=`yVx9n^zCx$n|o2WC&~pcc2tI8!l|+dZ>eC!3WPYD9AiWs`u6 zsHar7xmiX~^k(X_h+*8h@ej%BZ`&w$9aIC*43~sugl{DylOrq8;h)iO0MkCZbi2*nF7}PDTso~7Uz;n7iRrN zXttMIx{U_Gv*Ne$6q&|x0~JAbci${QiWNLwBO@5;|^WjdFiCdH^Npc~q6xu9zr<5%*Pe0OUmA)T~oFn~O<7~^zxB&U$%ytD+t!P;#_S>LMTqt}EJ-fJ%p2>-bbV??}&g3%T3EXslt8TbA7O*Lr zB(*8pZlP$>23n^9EZF!~c(Cf5+3J({*{#WED2o<%TL`^x>#P8^CH75tb==~#LTikXUfZ5^^#Y*VX4r# z4@2276`xCb39v1g(7kv#IA9b1$5p2ZbXi%-TH-xg{XR*?|C&Ae;(w%q{09j^)i#q# zv_Bn>%09mz?o^_GGYg(E*+S6*p&vp$7f+TQ`n>d9OM9(M1(uw%YUQSfTd5A~DLuNr&33Rih9 z*Kw&Gv*;gWG{)(8X9t|x{mL5rh&FCKap%kVUUa5%rALZS2Y}Eii$VN6ng&(Fx;UkT zEuRr6Yxf!ta=b6GaE`Mvkg-k}_r%p0^(lSzUQ(4em0u`T-;S{YCO&p`F0=4k*b9eP z=>h*_0$Z)csloxI#3BepJoG*6=R+eM>O({tM7 z;9EvuM<<@n1KlV-o6~ZMJ-!Dx2|;A4+)d<8)3T<b6772B7N(c|ZQ7j_2Dz^!-?AI~pFa%HL zpUKH9ts#wYKn23_beRJ0x>^b0Xo4b|{Vy_VAAQ9+k{?8-($BFratC+;l2*-+@cCpl1!}g^br;V6Y06?SUJK8H{S)tDZY!hrLtp)X0iIHEsAgRs^)pE#h zS5IXroBu*u_=!|l8Be`N9^p@Ai9r>r5SLfIE-R%#KJWte8J5QYI=41p3uwE{P8njz z&@CWYgLYxezUm2PNXF7$Md_$`;>C<9*2sb(PY1BWilz>}o$a`=Q<}m0m|K9X_nlK7 zvcy^z-nO`(O-J8yqUMwc$AK`;V5M1A0DjZx_PXIT%lyf?ptRSrkaBG{S5c3!7t&s4 zNp~Q*hL36&%Hp&4s|Q#fL``t71j{V^7APf7Rkm>n%_evMMx03;Dbztr962QKfY(w5 z%%cF~ZgB@og`O)E(#jiqp?>C{!!r$Q|9xN8u^>pj_ovA1I|+GOFh0mh;eI>^6p zL#5M^@$j5dDo$mX&06oJg0Q3XLTyR&5mDlLi}TP{QW1y zFSX<6pAg?OLYE)ti)Vr7-ItiTY!K8{?Y1}aJgT}vtB%u}9{vRnLGG)O15|xVSVcM=f5yiz*pk@}-23dT9h^6x_WTVvuSs}}FT;5a&z=wHm>C8j|1avPab8%cm6lQein-j?AJt1q?|7#Tv5*X$qv2<))Sq^_)mVQ zS~uPU$S$1n1(bJUh3P0yACa;eglv8!g1fsTbdWL3-=z$T^2WCD48)*mHkyO_**Fe5 z&iIH$J-3Ev9LHHu$$KAp%rb@JAb}t_5Rfpm^ZJh0NsjrX)xVg=02f+i+@9=GO*j|M z6Wqd;J~4O8pSpXs6=F>%^~o}OiDw7@f+6Lgb1PL?(gXgDtuX5_?)!x(6sO`kObIyu^_5$ zXlswCLZRTZ)2#&4m>9st6>}q&}+HN3b>jI~YuVC6Lt*R?Sa}fc{(h z^S`5o|GirHU$M(@FJ={5mr7-SC%enZZO!i1xPNiWiCm$*7x)@}w?gx~Gtw5riTrLZ z{ibV6fz>Z=s9<`Jn7?PGShK8aG}AlEVR}V&{T`}oik`{c|v zeG4c~VXB&tiEqGI@IP_)yAQts3n?zE@>cH4@MmP~-M_o%;kP<#f0L0N{^X6*ifWB- zWEbgVImUC>7Uf`1MzS|{ah#qB4t)z(Ch|Nl(m6Ifibyvv!Y&3{xK_v**T7(Kk~fDR zXa0M7twEFGwLxP=+>(L15#+3#_-b6n`Ymukf~Qi_nQt*-5AWS?{ip7c^hY5<5dum- z=nwy2*Pq>|6*0tL*`EvS{+#pm{n2(4sxMxrFTaF+`?|h7S)lv!Uv^&*Qs${?(LTn6 zCQszfLQsWRY=%!Y|I3}aq2sqtABQu#KA!vq1KM{G$1FP^ew$gmj$EyQXivKHv00Ja zUUM|tN^Zw3<2KM0r$l;O;qzmG5hTXR*d}v#3GjF&OKa@If6dBRH(`x1sldGAJk_6b=#Ta`DSbK(#J(dIIE57S zORU(pn?Im$$%DE_t?E#cpx1}L3n3QS5Y}B&{u6w1Cs%n3g_66C=BXNPrUvmc!nI5u zkx$i^w3M|i<2DkJp4Z7sU2SZ{set@o?!~@=CyK`vo|VlRSjwBX%D(pcm7lus&A8kE zBfHC~Wv%$ru>3@$Xl&wtzyQPxo2_TQSV5{?;3+U}Ug>AJ`urPs z?Xlng3SN8EZ%@i=$5-3Dc6`zhL958S7tw#sHhvLPXpPUP3hp6Bi2vwioq(OO6~}Hu(=ZXxMHjSZJuVU#qM_@2Vwf^ zT{jLGRLfWhHC0MY!d6p3T(e3A0;X^g??`b&oQ8JwT6d?yb;(5{Y=HCLfXvOf`xLSO zg`Pj~#&hhy>1X~w@%$TP4QXt+EozukLthL222sPezE;$rj65EaUZeNaVh`)a|3|`x zlax&@N+VnyS1xM~8Rx?8-;SZ)dvOp;CsV~1VA$hYdV$vQ2^stG{PcjrxvtcXLF^Ip ztopS`DU_HHVF9WsNldcR7td0>_;mfOD*ZS0UNv1mm1IG-?WK$Dc>P4sQ6H1F+?T*_ zC(zHlM-p9J>5!gagq=X1vPlx+qD5 zP@*8Jwhtfh@_1tAeM&+hJC{u|f}&}!iqm)YMb(l=Mab#RDuH&?^wrx`5)~sqqBE~* z5s=m99}mx=!6L*G(v1a84@xKg6GMJ_H_eW*_o|sZgg4n5tnX*NHdIC>Hb= zQ7ok<28`bailj^+LOZ!(?X)NVs$$Xw6{COo)q;vE3e`eZf{OEWSP3e=krqC3rb?sY z_oRhiObh>)4yObapQ?9TP?7g93Msf>(}|RDVr^RZU(>=X)55o;g%9>BB&qV|U#A+> z(AIgsD!APtk@q^gRrv&+A59cCi<{~g5&Ar0C;;5R z`H946t)iZCVh%TVUn@0x7YNXvsgJ?9Tl2j5N))#eUnop(1ykUd=Ee-LREO}arzCTZ zK8R_pRgCDoerJ(H{?&JyQ|YEgu}wzh@Da^0&YsL(yjYa^U5g6=n<+DiRXnTK6y>?K zUR2caRbAG2lDL0Q5(;Qt%z479DOx{THCCRHHnEjE4DYd*gySFiTyaLS@oEJC9&$Nn2BTt_~j{ed#D2Hl+dCDx9(qaDSjBR*+FC?bvvSAYKeE{rLAgW&0IT0KTDbv&X8A&!&ZA)%(HdF=jy68gZwftgv%@;-e z1)BAJ^bC75c_uA$rr7;^#RyilT0;PY%_zdnRUj@Q$$f?xH?;KemFSk)j0N$hd3!q7 z>h!_(UTd?idaXeWE}<5|&NKnznD)@=PJv>F-K==%bp?DgKh0y2t#nq5lL~QBCo?jA z{w&U%>=lQn54LcpSTfy3^SPN9*?!VRLHh`t<% zj%XFB$S75kt3x>n2^PM}eO=;(Fb^Z)qF`=&V8?;T{(;d$g`b4J+wp0zyWRC#WWTFv zcx+B#^fmmzlX}PgK*?*EQVP96y38H7XH~?m#XG&+BG#PabG;ml4n_rA6zJ{<7UIsN zBaqupvW0Kb5_~&u7)7zP%kp=8+BE!mMD2|7mzF(Bc$`szNSrG;_7_ojAQ#^U?F&D2 z3KND+CL|-H9H7bZMw$nZasXB`3lCcZe6H65uI<6H*A{*vqw6i%!vNpAl_ADos$+6v zWcW+=fCjLZ=hC~$TzQsqlo-s7i?O~VL&D-E7yK-i5r}YQl^s#XhK3DPexK!H75~2< z=b-i@MUT-UaP0!`9CdGX3gv45m-94toHBxSxMPHy_E9k@qh8A3q{<06*I4zOe9*nd zWJM6I-+9$&7%qCV=Aw_Kxae^R2CNTcwbF3s-(9LYP}P!rg@kl#Yy%ORQzxlyGNvf8 zW5(^Ct+LeY;=2$Y_oeE+dN=FWeVz_0>N;A5=k5YmVF)$5CHa4-B8`jZHkv}Y&m(+W z8dKee$TcgY&@w@h`} z^&Xupee^2$>V$QPjl|y|&OMy6LEh53#so^AB@#J4d14dx!5EWXNSmpVTL*^7T`>0d>GZ zBTg}`QpmfaBp!_PXym;$y@+LY5&9`bi0!&Y-sI58yI+pkb`JgQpM#uxzy#JfxrBbH zgNn`PkTYYbCVPlS)Fy?%_)95=mIxJ6Cj5kjYjdBe%a>Mk5~pBifR5WoocoZL+9}w1 zQ-$Yt0y}RrNn?*RXNHE#EPY-n#Bc5f3*sx|b^S(bWa?vQzmLG2+S|`$9nMP`A2|E@ z4-SiY(AU~qdH#XUe3|V*&QDLepP%=jy`P`=!2iyEenGzC2=eEtr{2$3q=l!Z!vDkl zyq1Ti?dBP{1&VM#q;S-IDMk@Lk7tWz70ZXkZJWMMyjX@XE`|tWl|WQ5!P)|{noY>R zl@um4_VhLbno`
i855c9cv1%hrpXN;HG46hk<_W|VQkJx^U5sMdnp`Gby|{%`8p7k`f(znG`RKBU@n zvrgf@Rz35k`_!|_Gg&?RmpV$vP0vx!zEZo+7PzRH-pNy~IBkF=PUq%|jZali@>RQ+ zzgI~)2iv8|z=OO8;JlRd(UCknMq=SBQbu45y|D6m`Ezv*+Z0OzV6cTzvueiBGNr7+ z)QP6AHsDh5q)s6rl~6CRit?nERNy{EUKvkq<7E$U8xdk{jww~mac3Jp{pq0U`^k)w zM5>Y^%mL-cb`4RE4_hEP-G42wRS!X^AvgL60NbND$+bc1bVAb>jX`+jPJTB9-M<|{ zamcc+B4*NN(qN~01wieK1v6t;pW*mC(dEez6Dd#=K27rkr~&u_p?wUoqHpFwN=tqQ zq;k7n-q>qCmMnSGBRr8hJeXjqp$fe{fzKlDYOHP{RZSb`a}orqTg8CzM-*kO`fp0m zp#D#));#xW;>D6pU|h1ckqPOt1mla(zDd&v`tp zb0u|w{bhuD>eShGTu-r-ROR_VJ*#^-!!8v8lB4aOyol+;#kBQHyptgx;ldAD~ZPfb>2uEQBU=hbI6ZNbZ??_By)?= zp_(*W1GV8;ezjDR@6na$QzNq7(KCxxqLX?%$=ab|48lhKUzh$!cK)kgeD&SjIXtaFGT{N7RywKpad9>4fRHgV_MUCM5 zdqWm^))vT@M)l=m(GyRd6qnmIadyq&YUp-B>S8d~=d5e4yI$_U3dH8OVE~*1oX8n* zc5X{r?46sxGkT~Zy3hOPlq#PKExpmBY{kr9(2Qv1JV8-YF?c9f0K!fB}C@&E6F9^i&!r_a) zA`u1V5U5XN`qfXeR>Si+hEoF|k_L7DRM_ia^flDwfr_S^@!&E06*v`;CelHLI?>17 zPU$)l$)efG=2A)zn18tcXfKT$h;sf)7+hE!zFVVty@*#;Iz^jLl0kKEVjx=CDf^P& zKX4qW%G2s(ItmUMJH0izVNMDKitouUALHT8f5RAmi;C?ro+uDk4%$XsE`vN#^=+!T zh%Gp=UmRq<%OJlUX>+9wG9qvCe#sy&!PF-*{e$1jAYaQM&!k{Kj0u9)sWKQ7)5lql zEx*{l^NWPZTs71g*jYbL4eTLiPBmK(?AyFLWtrEJL4BimJ+RmQVP0 zwxUJ%lVtRh-;?zd%b-5RjAj{6OrPo~ALMXW%=3G60;*GT<-}6+I6b4yU+kLdTNBJc^anBrYC3*mQL^H(Td5&CJn{A>JeLJnmc~ZvBsODi#T3 zXIif4@^a#{kSItzS|5qeA}Z64`ez-LO;olW1#y;CIYi~yQOLL?Di0XspX1=>z(i+u zcl#u7PNXyMd@pTqJ`759y6g`*{XPsv5@LVI?)M?r6}RKFh^KTZD`5_?BQuFKhhtz^ z5#9AfW=K^P2@c77f?N3{DdC(aawP1}iv)(yla{>H8(rnLL+4v&)U`Ha9;>S`5xO`q zJ);1-y>Id?=Q$Lsg)rEQLULTzSt?L)T)$^oBlY{|`aRP^{zAfn&*ZW4J(0z&EEty| zk{Ewp;yw2uRZt)ro*D@hWJZ>kXK+%MPwQ~^*n7rICec4Js#?_)U_hne^EeFS&pTu0 zJb6TiHU(x{0qLH14X%BAquv6nbGQw%$*VF4bZ!76E&Hsz=%w@QWS6RP0?|_fO*3bj zAAqYTZLf$`=J{fmW=6O5=D+eY8PGX--Xk+|^0>pwST|{)gmZLwkc6{!c(8=CbU0VS znL0eg8+9RG4VALs#`5p!Z3`C%R_4kGTjQie4?iVCt>F?LDq#-;x3aMJ(cWG)CRi=a znAtSI8W`jmXc{1N7(9o+ZFP^UkmEjL0q{FAQjrKi^NK||u|QKlxr2}Nfi&7edP%Sp z9EFsaSwA7m&-!OM$+_`~lRnh`zYAbnDx)SGj4yi77h9euJWRg7A$~_*tTNM_!tlbv zBu%POT#T>bU}yxqbLXH%9&@DndMvqxugVjxuc6y$_!BLX6oZY3Y!FfmY zjWsfW6@|M(HwIT8Q!sk51j+%@u@z;z!XfCv0MU`{_sVW7&%J+ZR>qRqme3*G|+u~E^pYxUCE8__zd6s9VU6CobrZkpchuEs0uVsxwM?){?U!V z<;0Vo?JbTR%?yoLF*b74RX56fZqL!)O&LN>tz7fJ)XN#Xkh|D{>S*Ffq98PIEnG;3 zbpcp!pyHvevp|Le*JerVX)2~6!8>Y!3~Pw-Y+QXQY;$dn_L&cg%?}zsevzfiRkAZH zVxBddvNEE((Fg^jiD`M9yo`Cmo8iJD@jO&VV8~_3NpUMTcvBq5yuqk1k>lJ+qZXI8 zi$(t^_wO!%8!KSR$(5WTo|9!Q@|?!j;*qo$RzIiDrxZ(799j8lSl+rHWQF_Mm$n+VHGbSQ*gD(^D@xkyJ!0FzooOS3> z10}1Tg&+sY%mWl?on}theYDrM@ZGv8L#DuN$IR8C)Dx+yJSE+;?+T-?oxgPIl8O)w z912EvOMS(APEsE*V&19iTfgfI_09W=`h>TGH$aobw&XW#OFC&GY~C)mC7sVYEc3WP zbWUCLP#`wzQF=G)*Zj+4fIp6_2-|#{6uc~_&D2%M>T$o`F~BOx_L@`50ctC zHQHtlA>a(FSqE&YY>>EdvRzoQ`gpJGFr_oW=nciP%j{w^iDM6EKbhX|Khp0myWhC% zYNPM(Jmd5o;%xVQiS&IH-A3zQjAl)`J_6K3*Ds0scWRXzy(L+A6FUKV{WE&ahJcPY z`FAobOPpa@r3d1>7&qGkaXZK+GX1T8?>7)js7YN0apFMyf9$;rd{ou-FMg6t$bIAQ05>k{pgm>kpEiYana|AH&$ZWHd+pcS zug4IYF@oACixIVmOpI6yMkEj;e49BVD0dbkXu93rjT_cG=BQ2fosN3mJ|Z7jy;_yp zx|5DRu8KRps`a#ORnqQND8u1M2A*b9LiHa}sfWZL-6bwJoTpn+e0{;4K5Uo89_G>| zTtKO`N7>Q20cq*DP5Oh3RZ1%KlX#l0&kky9;K|mxz(*&rZ&*n=W_BHm;J zkDxrG^dUAaIXdpr8Q(_z1)3hFj$vf&By460A6S|*WW2TNkbHK$U+4cZ zoY7yj^5(zR&WGcnIJ|avc6W-8o(E5kqpi)!xC1_crqtwc5OajH&b0n1>KQ1!aL@zh zou8m*1N(?y{pn7qemkXlxFm5G#zFhePhO!i1NG=BO&-#SHG>%6J~KLeD94O}6DNp~ zLu;3`$k;swdl!rn9?VEt)oR#SdMUu_biC4{G#FH?c_J zCmU}NzfNjrW*R{ zdKFB{sGrdc#fPMhKHHkD%0>WzL)Yz(uOmmA{c5LPF;v0;#Y)IdwpC+E4KtnX~0p*9sPbE6w=o3JWTg99MrU{0OKy?ltT2vM7!j0;5|3NiJyD&nXt6dnN zG|!9ofaMNnt0xenUAWel;5iU;J&W1j7v~8iY8R4y!{COg4X)fpTszSD;&KDmKsww? zK(TwYf)ojVL$JZXBgc637)8HJ#-p6q;;}%CCLR7p{CmdkRv*Aq6LIP?TzQ}_q`!&u zHvl1Rj>as|terj;{1w6iDgmI-we9F)FpKa6JSoA!JVb<#Zdb^ImNT`}A?;A#P@8~Q zl_NWabwT^Pc{8Y2*U_eHQszO=LVj#j&vg2IUWs zC@h1uxSAKoYv-rd7HQ|F*WRd|zsIqufCbEVY@))~&VR$P8EfNUhbIs1ZARBYH4VRk zU3ixiTUw=tl|w5r^w8!Fb?t$9EH}rHc?`@1X=nofY&?KUI2`^T0WsqHH!-LV?K74S7A+^ccLqq!1j(1L3G{iT~6;Sd*H|w+5QA7oIWzrEbHHa#sCf7Q&&OWvOP_S1Z z9#t<7J^nn|3H0a_9R6p47n@x9)y^=G%z<1I)QDu(vSey=kjx&W8&~^Ha#;KO(6cAX?T@IkZdwJq))}t`K!C%a&wO_~{A*zd(jSleYm46P5%g|l^ty>& zo}$K5{5!|j;g#bE4Gq900C9hgm5~yH{W!+BJ z=PfI1Q+{q)skDMnhzV5nWTm7T=2>;2hj|jzxP&UHVeumUJp8ip%fL^@F9j-(MLZz2 zD4{vrY>;^>H@A~{JU3H|5*o$L)S`q2b8{P+`*L#&%+A0p=N^w19H`z!JiGzMSWGtY z@9_T~b)Ot>#vg8SYj)p&5fWo6H3P4C0=7f24e)E4t+joRRC98|z_@L~(@UFx|VMIl}N* zUfocEmW@e4WJ>fFFF2hAd-xDt3-V-j<22o;F8zdpy=$!>#I*+dDA?b2;*1i91L>VMUp&U7XyV%w)Roj7ETO+S^p{0{ zW9V-v{q@J6??jH?^c+xzro!+v879K8oeb$PY$L-67>HK9a;-NJ148{^s3(IBEp?ru zok_@cytv;PcT&+V#`~_*=f>!Vu_+J2(x&KpJOO*~X9x{Xn{N>8j^DPr<2Dj*Pe2Mb zFt0NS)VUv~&i$~OLw|SDUk3e+qQ8Ok*Tz6 z7||q|jA%^Rm?$7k(yh*`16`aZzNh(dA4 zv67{NX*9Wym7J^N{v7a;iwq20WME+2Plthv3=CXkVBjJHLp_xcmK0`z^-?#2Py$iR zr@MlzivM4q|2Ia~i3s-lkxQyS>VG!-BkAdZ`%r&b+&^-}Qz*@AULx7pB-b%^+ueb=DWN{Pi=eJOPV}tKzJ#dipv1Y^`rPbH z?%0m_*@3y)QSpxPy^*pCqdwQ0sZoA0rq7(~4b1hr z1CPpzb}2?p!GA1XLf4NP4=dmgnuMdq8>4Ac{K|yWuDd3bM^CBA8P$*I1|28UHi0$ z(#vtGZ@<#DKl7~iaJpL^i2rim4f_6bCvWW1-v3HFkQ+*luuUMORKyrrWI@6+a`jhp zv3Nj(i6bB*o$DXJg!T{)U^}fyOrg;=sm17mcv{tW>rXIQ*YzD_3oOoa2j=Iy1A0BP zKCuNLsNqlF4}rfEg0@b7;w7@{6wk@0)4E1D1B;g+Za}AYFu-Cu0~#%o1hjhmhq82? zY2==uq!5!3=o%pl%wG~%jF|Q05zsgS9+LufrF}%rXh8hQI zR2+?116bpR5;eM@F|M`xFge_;G<=u`bsH4R`cH*o*`G$2_2ppQs2#N7I2mTsRheDR zrgPa_9!Z<$)c=a2n~YzXTaR_?ZkY}v*_EziLG2pCGz&vVv6iK8p#eEvAZGv-Jp*tO z(5b(T*iNVZ2_ejIHgys7WH*uWtz=6M&RFE6Ed$JEYZpz&VN|&9bQmW(o8G4g`Pofx zZ&{Xhms@|XlVPW$s!cg~3>^}-mC^y>OPo#4v?>1A9R7bp6N%w#e@$*5Td}VI zWS1a>JNOCOVQP4=UIZkesakNg!~YsJ&cWpl|LY(UGo(AU;8=(MCFUB7=^ARvQ?NkU z4IC2@ce*p~I3plP^H|~T)ZYM;ouRk!oPpAGlK9xv-z^x@)S4EjOvT;f&Xdl-vNR`l z8BKS*_}cVX#o;`LtW4jsByHmKIN!BO6X~0$Q$j8sVL_gf9&Y^Ve4xWZrj^5#FdXJ*!JDcz{CNHF> z!ItSz{V9-l6y&|d$fNnm^!oEe-F}mt`tyuD%kI(XahccJCZ&O)_d(I+ChJMco9I+5Nnn><63xCK(!Rq zrQ}g{vQR=fIp{RJ!TV5gmHJMHdIMWv6={Go$HElQ!SE%t36oVEnzmzUg=BIi&E)T* zzu8(aUY*1l;(IKoIez-{u~LvU_AqB)7a!$yy2F0}E}~svPX)nu0Jfh6f6GJmc@8V~ zufy@{-@uV>NaEyc7y3f;3)PNGH)=zYMte{m8)}(I!x=Fs}9jR-RiY2eP2Xb25Gg98d;t|D2YQ>LkZ6~ik(h)QYrRu zLOYa@T^E4_49p4UQw!E~fMQN3xt$n-&fhlMB8_BVx}qmF9`fNJJ{lM)^pf5>TI#?C zx8`AY7M<&wA+^UyzG>J-qV{bKUV{sCyIL{(p9NN(pA#CYonKl# zSv$X?cA$2?Ky_&6SJsZ!&abXTvTJ-dvPzkxo#Hhwt_|6uCXXtJQ!h%JtY~}VoB96Y{6g9VrWta>{J0vS7HoN7#M#Wt;*J3$b8+l}Qi^rJpH>fm zvY~A7dj_bP&T;u)Q?3Hu${n*Wkq^PT& z-L>^ZJBmYZ^XQGd@Ak7ko4WK4O3j9{D09Z0VwqsI0m6v^a!U*^eQd_hmV85TPDRv1 zq)#mb`0R>nXR%1GSS7*Yvoo!X-jpB?OyQFj$2VK;#4LFPLdk!8egNTg=W#3o@j%3*fiw)I z!3b^ofJYi-*3;Drg>T9u+t@l4G%!4f>854N?_ z6Id$hL(@^?d+*Q+x}P=O`d{GE`oT5W2#-}ZeTY-vLoIU&rev)K4p+7(h&H-ALSr#- zVEZVQ^QF+JUc;h(Nyg0x+Zsy3M4mPJaVJ|pzFvE81e%X9Qko{RMw=02e1Sc8tgmr2 zV*fM7+t|LsSCvOgXyMe6Gbm*>Wd_-N!y&ORfn%XTboVebB|#3!fKcd;X!A>3Yp|bo zDvqsij6$=24b-<|5o!lQ0ErYDE-Vx!bPZu5F9`8V%s>bdv{N(T{xsal>QGV-!b$^W zvi9Lt8j>rJB*L(lyim!&2H09)!$L92l$O(gR|Q~Ah*O`4fyr=J+^4M9aXDO{;y5TZ z0op~k!~beL8Ok00{V-sMmRmoE>9WKB@675?^CBPqUU`MqkV7{quZ$%)oaPwGcqk*5JNWwW z07_FU8sKp?UbXjK?E~^#0;jlW`ehnCarx$=o{Tr)h<#` zana?Q54M4&Bk>!Exghprz3?G$h~z_mfSquLK89g$*n{C_Oo5_+_(ZG#cd`MTey|P6 zswt5aWVVGc(7lA96h;wT`zGi{(m9N4pTa_18$(>X(c;=QL28YVeg`53_lca6g|Uka zl;sTaeKx|^bPThL1~3o;M$8M3qX7NS=M zTNyGkQ2z1=dw(QD4#JLFlmVN9w@TZGJ2NrDof3u0kj`#Khz#?elb zq#4^M0AD}Ldj49%`a&J$@G(}i1CPD1g)+kCpUx?dF+WFR42AHs_T+4u$L|-L|h9#_}0+kX_cJYV4oO&BNnkv#0 z;V!zZyjA3l7B&aogPqo5A5aA}fo1Aab3BpLJeRskxBgdjm1cK1Uw7^UM{UQ^U;g=N zB;pRBUj)xtCpteszOYaa>IsMtT?gD+SIQ&5#gz)dpA!Q_;++39*Y?5{<)Ea}hEysP zR#(UXPimWyv+WcH8O;+?kV#dMq+ljV!B9&8GLSwiZ^2dfj=!CJ6W7cFZR>Y~Qy zFh|YNPb;smhX=&n3+%!eTUw4j5ZjiDpT>soH*->tnYSsVNIAH?0(XDxSdFWM&HFy| z^Vpk9hmKrh--enImwL2bh}AJO8xeP`+4ddGV#l6ro;3hBc+A(6Tj%RbTIm9hL+t7e zj5k|@eQ|@wd_AYN!;^~roUZNs4v)SR2zPi;1iUgzKF9zI&!X};?cC?_%j4h)MvAlL z@;G?+jC|@ZkAv6I;6oeu!wHd7+;MWPLIe?@gy?O-F2hJFcbKs_5^n^V&zWg)ul$I- zJ>5N4UPLU56FinXB9_Gp?v))8%i;z1%8H0(F@t+$M8vYV!M)P0SX*1GFkI?Rqu zx7NX#5a73)<~aIE>={H^g1v9=zzw{TC-tw&SnTj&JNfvnDt+lWv7{5YSVegmHC6J6 zBk?i@FbOXGsNSZ3rlg)#7ahOgK6gTi`wQK-a-D+vcTb%5jQxu{^@L~IYjnj5?NFpE zR$AF-=~6WQUadV z_S=~dE83pPq3h`)Uj2|O?k&8tG1GnA!16j?V|E|^fG9idDLm{ESNJ->faC7w23Ei5 zRga|I?DiCqWx72Dk9645aGgdnf*nFt#{qKOq{5#7K`l&b!5&LM1cG5Y{+4wD1r9?j zouPk(&d^S#2cM@6pG#*fg$o`2x256SZ~95M&J7*nwoIIMj$eQvlq9eXBy4o0HQkhT z+c1iYbGoAe;YKew=F_uf(sP-J(kV7E}w-|7s)5>OhZs}Ma_L~Aj`bc14=LvCXl77he)joFGljslM zEQh_K`E+=w4x8zazc(Qu^&4C|9eBjaJakZX{0cqa%I;}dXBQ*V;uq}s1|aP^%qt$_K}h5k@1BCJ)nNlJyXH^PkK7GpZ2}molpJH;Pu3(Ct0{KpWeNUPmo6@ zj7*1)(@DU?OB4eBFQ&4tVzPP7wR2HHfX7uDw{DhR6G8mGh13}``vHAL-Sx8($xn$x* z-^^Q1=XQ%zP6u(yiJF)2DW{&}rBDohaLH$D zR${{8+4vvln%EhvYxwad8#WL`;}!E!cc28PcdBHZ?@r;Dl(0)y@H~71niKsHW_>d5 zq4MYkM$dHP<3J^K54Mf_@R-A?YaJWE0JT_3a4S^&*l_LZr!@Wv=c&3J{x{$S48~Mc zGrT6yco23{j_2T_o7NA2=S0JWOf-KE?YHnTW{Y5Gq@;!mG!}Pk{2R>9<{!jhvr4mj zGS>WXlcS<{cu4V!4^FkDe(7#~Pj)Ar^CW%Y)-SnFd_o$T6Q`Bt`N{4R@3~KW%pb>q zp83fZ?CNP&jyk8kq4r@{LbfYAfu+9jZ}gaFNA+~yNV*{=1f5xo4+nl*)iEKc&SHJ3 zFhe_p5&iY<=7F=!5vnZVx<=@KyY@hlp)~7k{-E!6VUxkBfpoYG%VTaObswGwLeVF+ zDQrNO;|34h>^QTP`~phs)`kmoGRrr_)wmA_-nvwWIqB+nC0GwaO{-KNQbpJ@Gi;&h z*)cP8FDRfa48r4>mh&s_8(W|uz$OP|XcThS|EQtV)Cy_=5OfW5hT-0$x7?B6Kw1avL(N9;~v-kS0t!^uA8LE3iIK$;62_EP71r>%ovgriGA! zxCJ6JMr$8B5yzR}rpL4z@nE&qx!ke&tz^iKf8byY=sWWro4>#mSL?jjq20|49>>N@ z%#g>o^=X}p9GlvaFRk+)$L2HeQlRNeZl06vaCKmJntm%Cr^opftiyTq`PfjmIKxbA zaW&R>m(&hI)V0HvhSU-9m%0>OT@X+DRM=;7y9_&yIj6}^UBV($yeoAd4jHAZL(r@G z`Wk1|jUvaN&}Q6jx$dnvG*l zEb($qC|;aERg(4x6gVJFobt^Jjt2^sEn3n^+0g=)BX?*PhGPwBFn-BcM;g#@RPusy zRPB%Zhiv%oNBPIHM`Zp-zk*$e{kDT)N+8ZC1))$V7+%MFRKfcv$izZhs{+-jAoP`OVyRQ2CFSO zX*Su+=T&968fg+97x1vE#Mqx$B5={N(_VDzVNM3X$>8(U)9Xu9-1@o zoXL!`3le4DQU6oMb+RO@aoW*rRv1@R2z|zc3xNwC#$!|POUDn#S1$Y(c65tC}$7Y)Km)fSUA-DWIIcNiGhvolnFKKxgTQox%S7j9i*SifXh(yzqWp0 zQ&RujKo_KJz^(%R~YZ`oe_sSkwNj_Q!3r4urw6%xQmylfDmE z-MI3ImJ~-LjY8=a9PB-j3|~6RZdbdb2GybiyK!4^6#YTCnKc82GMd^f%tZXz|y=;)6y8P*TKOdW#p7B~gBU2tpk6;Tnk8HbqL$xwf6VWoO?n%O%= zfxQk}@HZTlhG+~A#T`mz|4okX0hUIau|c4k(CAx6$X_+enM)fXKWuoJg%SY`wV97;;>5Ca4jb38XoEigA!V)2urupPNL*_O z4PPHbOntkxePGhb!15xra9-WDj3beOLia{(Z1g;#s$Pj^3O7Bn-OBxtDtv1i}0$ki^s1J@qYvB73m$o!ZXPng=WimGW9AX z6L)0s&X={scC^H{U;*}1lCa6XdvtGM9f{-^_X;m9uE zq7L7V9wQhJ^n`IeFf#mROtUAydUObB3#WlyK}Z8N>yoHh)YJ86WL^Ep3YG2kejto` zbaPOJAyfV+GyCW!hnRy#j0d|g9KiUn9dd#d`vl|GG%EFz#&w9$+vsUSCm1ZoPL~}1 z(3jYZNyDbbQ)HqcA@OH9$l&!^L#G<7K_snnY4vql=Qpr@uJb;J-QblNY(M#uk%dF=hgX z7|^5cvjIIDTcCdiCmIeCBV5=8l=@|$uQ^)$7FKwvL8mSf3p5TXb^o;ezNE(7BHs<# zdavXgh$ex#&2G$H=If)a&zEpZKtoX)JK{~nI@CohnTKfr9mnaZP&Euzg4ZK}7@?$I zG6$o-#t;yDJ#k)wdQ2S!qaE$SASsU~bReYv6knb%ktIhb$5~J|vhpHmM7V1y9OeKZ zi%y%*yncV{qq`(dqn2w>dJY-WIHlfg5G?|`*0Sznc;B=U@&O*oLAj;9< zrw&%@yx-x!i>A_>QbE4f>2+*6h^eI3xze%u8o1~<5wkR9^oSTJS~0A}wN>^&3>COF zC}pMpFAho{#4Lgu@{7of-f1j?RS5A(baLq9*bp*N@&5yZDF|!CXz)4(JsJ)WA2EJ` z2^Y`Uixh-+TL&Q*XZN7jYJow|Epm=rpN~%SZN1g8>(k*(G#U`5V`l39KyDFE$p&1@ zjMKx3oLsN5hUjTC<`IweyD?g5GiqcKM0BohoTE3MMo6U1?=(pT0cUZ$-{pNVhPdIz zh-RHOqS}tRl>$W(ZwaXl?7dG8hQ0vv_vo+EN)heJXW9T7o2s^HhpGomJ46G~eQF{- zdjNwk&ZU1%Jizc1cVhFR9|?ov*mcHH6A$n?cDSE;8(B6!gXYPpFXuJI+4z>PSZO#+ zOmVV)4UAZc>W9oL0FX>CNwD6QdX%o?k+OX^vDyXA#xPc`t^-?B>YdH&Vp8|xZZy_E zx{5-5`LGWqfWe!~8_J@-4@Y8%6ij(pg4pXXlB9C@5WGgJhXG9Xf58}Tvi}wkZn6It z_A9U-V;{4F=$ZXAI0`-j31?*xsAFSy*>^7$DC>z_Kp)i;(Z!BtFJhvHu!Xw@8}Hsw z*k~+KjktIYhlvFC^8|}v2ndE^V(j)WpcOq1Dn^fu6Cd7@^m)Cff;C95VI);uOf~JS zo}w;C^fn(rQw?#rkJZML#$i|^`VzAae(h+y?Xzxm5Eb*1qwxVaQnrR788}#^eI4BT z37-t3(@?KP6N5LZN3MWEqaiUn9u0lpD56Y?SV`#i)*$pTe}Yz*_KS~!K8X|$S2fqY z0U3xGnli19UA-*$V2Z8 zB^h5Z%SnB`+xR7xO9YoXwD+u*>PttX<5S)Y$-afzXZOphhq!YIIgSz|v)1=i{fRnz zU|n7?L>qhpOY?%KVIV}m2O@^nlt5E_6#ti35C&3lkz&U}yc~EK;w3OZ9!&O*5c-@X z=yR@pxqbr}ll*f13V`^R>t`b9QG;GRrr|d@z?wvA5x)yJ)=}$y^^*;!NZQbTJ9Y)_ z0o>b3qq|vDrDjkTK0`;t%ZKTEuB@OjrT8?2iRB-WIp0N_+pP|nJoPdIi9Zgp1)oA( zt+U9naSr-Mt+Uv%>62LM+*Ug_O&~+dlN=)&P{-y`2m`$fGSHAHqviCF>duYv3!1l% z4azH$WC!DD7D|Fd>TQ}yv<7mQurbALO5>|)22q-1W)m3%J!T2unrGae$_ZquwQry~ zN4Jw_++dKN8+UE!N4Var?PEOQv=_|==N9QrdR5o~t21$Z5inCLYjst@uh6y`=^XPU z-bs%o>dH;Df%V?Y32Z1XLK9z)m-CSOA-vz!&N$BQvEd5tJ=hr?8mmChnu6OY<*q|e zARSWsccCw8o)s6uz2WW*Lh!#+l<`p>THjmE#uxnIxmqA^-;F$9GNGe zn?Ye6$!!RQj*Ep7(9Ph;JPzEpJz|d#-?xf&!W8o!aXP||Wvb@f{EVkXR;E`AqbtNXeFc71p7E;P~uWeBvV~PUW3w$6{aNiTAM7 zhuVcB?9S%9LbTe4_G>pS_Qhkd??ij^bct#ht@b5hv2UVpnBxB+G+3GTrms)qadl(} zhaqBpH#8pi4aTH#fHUrZ($I+rF}^;oxHmD+bEWRZJ8K(KkK+N2(Ll68Noq;j9sD*? z%#Ofe5Pt_x;<$PvGVv%ahQ5vo103sL2^I6@zR+^!buW1>VqP;t^AyYk2D7+4aO&}M zZ{FDAOl=EI(9Xv)58vR_<2*Qd5dqnFd@tnSu2MZ*4?0s1x&jyrV2>y5<;1!iT2YmD zXyd>uEzF5RMbXl3Pg%Sp7;*mvE^l<=Tw|5thrZHWn#0~MX3x>*%4}s$(Nic?N#?yN z*!QVS#Dd8}TtX4CD#sjXQI6K+?sRNkin+GdIm4mN#Ee$!%yMi_OeDi?4lM;kbggqN zUM@-@!z9Nh+;0!VWXI;$;o_XKAz5FT!q?-jY5@5LV&&*7WGGx-A%zPT?Vxnoj&d^k zW4{EBPa97m2;0}n=73H; zFUjyxQva?_clvMk-9cJ{cGQ2CU}8-&u8%;UwAzM=2^kZsyaZ?{!+Ziz8C4<$iuNnI zJ@;=aR%0k!GR2|;9L!ESsKDA@QG5#Ku^z#xm$KDJMiudTEG<^uN{dzFX|XDU7ON&* z{bH3faU>XSsRfAnOe=sAxGLT+hcc0|g7p=t`>_6T2Yxr>N6Sz0c`S~Lgv2QJQQZENEu&10mw>>PQPQsjzU;)N_9>{)wrTrS+$`&}Lv3Wkc*=%3Y{}UK%xsm} z#=R^q5u3{*c7_Hj4F_6~PdrxIwV@u@I9%sUx`+`eqT-Y>7VT)aIZ-gwiaG$M(13V~ zr8K-t(a=;YN&9dl7X^6+O;E5Ne!UX$8Yu)B$J$_m)LlIh-?O4N!_+$wxg0SG)~_)p zForQZTM=^k|4wy(p^Wt(Y73aLlr<>YLR(5=iOmUx0X0ax!H8;DFc2Dy0m<0}jK)6z zt0BQqptZwf?4UN6E&IF-Qx9_W6}SR9DiD?YS>86i{PiB;au0)r^;7hq(f1b^eZ zcygGY)z_nhd0dn;6m2E?p48SE z@bFd-q0%{QOyk%fEE5UU$xs587#+Jp*EOI|Y6ZUP8xW9W;~Fbu0!)y{klmH~33OK< zL3*gEIf^Dd^yt5s{vW6xU~=+2Ojk<(+g8ZUF!hlB4CdTP^6&%bKaGCO-m5&&3XEuj z`0`5-MNa+De3$tY6iDJc9a1yL=>4g~U-ADaDEyhe^lfuF5q9@}Vh{s)^bm^1v zHq6Egi09Vtm3fY^v&vAkcV|W}#3=elsUKq2@R|H&AJPRx>)|9PK+GGhCBcu@Pqc-2lpKZO1~Ked^*YRp zP$IzxX@1mQw4TBG3GvgZ&qeF9IKy0}ej}(eC&eZn=$5fQ{|cXcSqIX|y!=Ac7Hbzkw@8e_T@D`Db;*87Rq9^mD;X#MTx0xPi-5 zw9a_nD7_Se99&_-2WaD={u__IE>GPC9)BU>idH4V=At7&cuCD(1>ZB*$zMLkI_06hd+zC%yRg@PcALH z7`|!y9h=ufwHK))B%FGF3g(vC7#y$xMjM;YPHXd(H2wqk&7-_7Vsg!Lkyztp4V)O# z)AqWRAOc~hH~zzyb#6~r*Gx&xKpZxo@KUq>vKcvId>Sz|Ncu7?u!@FSbrTzR z%ap9&j2V$^!x@NWeW<~yuO6ak?>LmRdu>=h(m&MRjSJn%C4nx7fE1{>FbR6S(zwt- zl7moxCZRa}{V{G!(m$c|c~$xe6!$HCH=L!2>5| zD=OxwVub-0%*^(N7Z~giAuKTTC2%vVXMBah4AI{>!5V(5fJP|Upx4N;piiu3dPgR5 zqOGMFOQO^Nv7>PwItk8H;^-Wg|3g)wvfc(or^(rfuG57$J7w1a&E z^H9$h%E9kINGa+C(p*NhMo8<5%oR#SCaai&q7gTyfnwSRu#BDF3*Q%MouV`~jza&Y zeV7t{pCSd1Z+w^%NKSJ+O9#LArtF~?bMZTb*H!@^ZHaJL7VWS!+Tnig@HyVDU~xaE zS1c?npF75JbZ|CJc(0bF04HIh#64Ok?)1Wcj5-1Tv1%s%r`XG#;x2cx zUG5Zrxl^CZof5h`^~_p&m*)zc$73u#cz*_|y*v^<*V2Q&WA?45UG!IMaM=zq!umRA<-#9#Euf}#A zqdQRD)84NBh*~0gjLdpZr)#uyllf>)*XVa{37gv^%xPmycUl|4g&X;}mNasW00k*~ z^rcyN?J!qwck98N=GjCu{97;Cw%=xDL;O=2jVn{ed0?n-7x_J$TK6&;;iqNoJ2Eo5fmw z&G{}Zw=M?9IY*%cuo#Pzow-?f6A`q*@mtqMVs$q+Wf8vr={k2gJ|o@{&QEibOaYJf zJI@2^O&Mf=`6rwZD^0v=+OR=8BM2v z?>bzb#`26yy`@P?S;?qMk4ng*X(v>Rl93nfAI=`i zvCi-ZqvCh-&oYXx=$~&mujrp)r1k6%Awq4#9yOcr&#>x&l>zv>jdzS*>D!q|8LYgy z*8oP`XcCkbBz9~k#0uxCddKE2%thmXm9s%H>|n#dL&i&&g^myoj_}i)dQZJE4XNwL z&?MAchRDh!NAv66(SQrt##`_Am<(}oC#D>dQ7RBbv5^93>oX*}avf;CM`(D2tezuK z`-q@*SPPp#H@tef!q@O^09pdKlG=$ z=?7dgQkCG6-jG#TQ{L{&C9_sH#O9mLTAnOYru?vg95J@V2*kMZn??U8h{sScw^o-S`9>JO7>{RX>sugITfHrxFS3RUMbFJJ?u?C=kg$IsH;YP&F@qHvWYU$vOG`}_1*p5^P#@z7WUafPS!h^} z@%m0~ol|#Jp~y;54ZX%2Bma2}+^6Qk+=O;IgMI(ja|{sm!A`6QO2(a|c*TusDpnAq)Dy7RT0B9p7%{$#O#}^%yQHK}HcUNyalHd!&d0XzM3qcR%&6 z>do##8hadKH*|Hz<2LB}r($vc=Lq+jgZUoa)>2<&w_m~uzPmGU>b&E9&bS^DWep-8 zQop;3VIS!(?8{EgGn}{ffK%^l{H$km)D-EtImSle9o4!}4sfLs<l8vqmX6c2hj*P1uTzjymQSvy;g5dV!pu86B8JQSIH6Govh{;_x@*Ujtd8gP_C|ulH>yThtBcHiM)O&2iwI+>j znlxq`8*xu*B+@X3^x$c~i2+j@meS)BEf=0PQc4N-38&xOR7VsY(=Cd`gz*NXL+k*4 zFNNqU>}THQ4h&D(**cpPY%3S{#T)Ga=^141wSf@)-vjLiL?aAbmPBw!ETG!pX7 zvjMv|_~M7GI4C@1qMZ<3Y%poy36P8m|7{p-2LERHgF}qjpKh@VOlLd;YB_lGLd#Wf z@~-b#1hIIn%@KS{r?h`7T#zKQ|1>hhc7$M<|Fi&^Xl73>2Kxz|79WGJer%9D~`HMaE#_dgyU0 zC#I0Gaa8=TbX=6s;zKWihn?zhJ3vCcFH!qr2hjF?q%RY^{@4OV8ln&WfLv;O!;L>< znx%E(_?9w!>HvXaeIg=0kBA|TYxkh&E(V-sd3sv6_{8kb84;qCLAm_KuPqne+<^Bf z!ThCG&YF3xcnhapt$M<6`#+FA1>J4=BKi!Fe4yVp|qlns_=6LS_OWkL2k;g}%W$Q_NVfc** zJt-Vo0I9Wx+;lw71bYu zb60j6mSUUT9d2F04*Zx^U~b-q22=>VJWMx3)S(a_fsh=^?jv>MLC0 zq#wdfLT>FK(CzMUJD#5pzhi12^t4~8r;*Xrl}vKv72&C1ciG{&#snRc%y_rvr35hT z%7272>P!KTf4R~F6OL>IbsOKFVeyioj%e@^LfdU;q1Hr&LP0XoD%@lhzF_KIVHc~L z&kxSEI_OCJUf>5$2OtUPM52=5WfdOmf#PoAPfqVnI7nixLe^AH66|(rf?KSy3|vZ3 z4#8(5UA*K{GB_d|GP(R@SvT1*m9UV|lklcT&?dO)CHwkyGSg?puww5@K~`kEqSoPP zRff<>9#pk_W9OuEOl~(;M->Oe6k zvN_zd{Oh3`Q3s)3R2`_Vr%?EGbZzkim|N6k5`4Gp+nDZZ{ z?r9YM_*t!PIhE{+s@5vlC5vL%#1|?yVpVN$+ zjd9-Hjcq;Iw6`bQ-Hbcv*tMWtgJ{73jn*J+hNnB|a_Aals7;;jOuED^Fzi#{rcTq+ zfgOlH3Mcx6&y5_2fB7;uQ1>Lo?HYX+(?6ca1MxrTDO@RWVp;4Z!HFYB4#cmzJRDZz zjJa&JsKx6J#Cr)jv~wmEY_+br-@#H`GV{zu$Xav1(ZEYVf>H!-HV4}r|DYBd&H&>l zM10s2h)rvK!#cX=+kMy3%BX(0D+RV>U!t((;myyzvc(V7=6}a=1SEI%VMGqZe*zF} z`rs=%`}AM*)3%DVOOkX_KtsR_0`_0c{nG@TD&PVEy#iJU_>h220&W-ZSpi=X@Th?8 z0@_P>I9`1pGk2*avtzHwZXMzkuIzt7_5YQ=Lo`6LHRtvaAz@G^CoPaF?9u=@%zz+qyB;bHDp6;yz&Jpk)0m}q@ zNWiTEJ|o~u0v;0Zq<~)tm|V{B4;OH%fC~g%CE%k1HVOCx0iO|Yw}5{a@IwJF2-vqm zq$A*X0rLd(3iyzKj|un-0e1;_RKU{$ekGv2lH(sB;7tPFE?~BR_Xt=m;3fgL3HX$N zF9~>5z&8baN5BpNW2<<&0|mTEz$^jh30NdxwSbQb*d*X~0iPA{B>@i!cv`>?0lyM3 z`9Yrk4FcXIV77pH0E15jJOS?)uv)-P0{%q6=L9??;5!0d60pC@ z@yY_;E}&b$`vqi~j`-Ui|HwMB4(-EXhJa21^93vuuwK9y1l%fM1WIN!{_JCTUs_ko zU|qsP3`U1bOX2?8V!6L9j>8xJ!sADW@5z4CBaVD>r?JRb{EWSclJQ(3IY~qI@qE4X zxysV-{G^US?=kNF!o-?x?%PCoo0GeLCE}^o6Q@pHSx~fMZE?Yx6;*0A!w&rWIi7)i zINc`9KhM+K>*4P0ukvsvUXu=5nIyWM=Mve#Z73iudMyEzMH;k5ilpV@y29crwY0JV z_QyrKdpmhL9RfzDn{t4s>lE~qe8t0?;ZlTqG#y_EI)-+3rz1LC8T^Uft$^tf^invY zd+0(gm*hpuI!AiINAdH{^ZXA4q~)kOKpBuegop5v>VNVD9AVe6AEO4e?|as(ZM+D17-*;bvD>yXs2Syz0ur;+h&sDwk@cLa9=! zmWuHmFBM5;_~Pi9Yiqy^I4 zUVI@>h@C4bEL6`JcqSJ~w@VpPCccDw9PlZiP6b`%60|C?tDp|6?Z^+&o6Azpfr)Zg z#N1Y~9F()LCCFI~Oa=I-80FGRGz$zMjgl`K`FrwU)f$YYekrvl|7gF}={PIWn4 zYnYuvt^sYFb`|MT?x{3ufU%5)sgzd1jqp*~nmH?ADVuy6$M{6NEJc`N&@7{#On_?{ zu-yXND&VVtowz|Xkqb!#@v{KG%Q;oSXe3FZSR`Yz_z%Z)GMaLMf#@2~N|#F9EbmEH zc~>AVaiAFCh+C_XR~ac(A#Ned^(ukA43OuRctLo%PdP%G)Q2UsyL?Tw((75i2wV4Z zr!-8y&j#H~V5jn-GT=U()5J5PbNv4i`7rZi@-4&4he?ykzn*eXWbvJI!{q-YDa*n` zrC-2m3C|bRww`dwOa@7gO`5{xIZ3+1!e`QRb>+DhY4x09&t=N_FbS=O*6m4R!Q*CexUhB;=^KiR@}_4Ka*$I;5+j4ikq= z8%d;Dis97E@}4M7vC`|Qyemt5wV}m~v!7o}YtuyagvtMV4Kd9~lwlclGi@*tv|7+)#f{ zJ%9HUIK3GW<#+Y?3y`bTCoD zAKp9gI3$hTdBpX9*w!$Tk29HG8VP%a-5P}nyEz(sPUhiLh)8_$gdNw)uusPb?vD#u z*k`-2cs$rkn@!hUQx4}ZO|*9$vtv16YUVaMfx?6Z9s4?k4c^Mrl4u-k=wgs^81 z<>6&vKXxOxj}-Ry>$$y7*mnp!n_R$co3KA5{Og3Bu2!H=m9U$t!aQNmWp$s%1Jow0 zVr6s>+^C#*t2Y~Sp0OyoMR186S>_uS{E@#@9@I7xszh$#al~`MDdj3J*)& z$y{YNR+UX}#L5Ltn1A>xaw{vA_=@i>E?QFJn^Rr7xPWpzub^U1@ygtSYNe_=w_x2o zU&TCMnc`c$xVUOzp}L^5)>+Ilxa1ogWjZ8_dXh4<&GbpH@RgNuBeP>CcpsXurATpo zq&~4JHkZp4PoLW|7#&i&oRycKV3+R5$hbETGelWtO_1GN;>8CO$*MYh>Kp2jK-{MKO&jY6#>XRt#>U2YNy^Bm&#T{p(CIg4<=tD4_(&u#Zwn&I z>GfOK>Kc+MDJikr6Y8p})>c(@!(T7~W9ae;RV1wi;A0ho<;-MC@Z(~BZhXr15~g0@ z?us=Pm1`@y&G`{s+R;n+tTx{MMB~}fi+lD#9)9oVJYB*~AF#e2?7r+nb8Y(2o^NjY z&;8$ViPK42y?dh1Cdm0`^z9J&{`=r{tWn%6pi)TlcDc5+vaEnqEb=(HqEcS8WQj*E zDo_hXnz@|?Jxp~m{;DcVE7aoZ-ohy=nv*KExJWLL)pb?HrA2b(DtW=(IXPxbj*{>d zt*a;~FD+bASWu&y3CXi7%d5(Y)na+!$_I)IRXL}!ut2S>zS+#@?6LyT>n<&>E~qXn zStmP-YYMANtIQzstb&?inFms;s|(hNh>`B$C~|=+r!&m*5)d1W3_jj6q+cf2sNhba ztd=kyto9XD7jeYi@`8$j)yQrwh^?%a3oEPE;jf}bt@bg8QZOqb16~oXb|umI&q5>p ztHmpri5wL}A0rnPTNJDUStk1=uNkhiqEsy{C@XykWf>8|TU=sh<*G=G2!F-QMDrg=LjBzUpF@*US97`GT*NEm&Db1r{#Z$mC2p5#er@yi|oqeq3&b$m=UoQGrxnbwz0f z67*iit#0U~2)>%-5KcLQV-ewcWNCzdB<&FxL_TXvt5qK)y{NP%%-ZsTDj_+h9A1$a z%CC^u9*K$Y?~NF54a%gTnimH+6(PvHT#JfV75K{3-bx~zK7^vD_&ft)^3439y0C)b z>@dqy)cbIS_fn%)xk|*M{E`fzJZo1n2{ApqmLy2h{TM7gg5OQ}O`kqPy7SH%(rB0` z;5QDxvG|R_?~z9k<|aVUa6f*J;+Kw&=~h5QVIxsQ$JkYpM&maDzj1etp<~HR|38lG z_#2DG02<|u!_c*|iZ?&7N+i=G5q}1L)ZR`9qC5HU)|7uH`xJJ?3SR|Uht(DA%4D)v zQ;Sks$cJ~ZV=dtJ$$-TLD@)10u&kO`L6PxUv0@ck^{~T=6>3Q-m8}S{VnvNw6t)t+ z0`lgu8NQ<8!ZNs1Ls`TdY10#M%LLw!*9%xBpjW^=0kZ|n5HMXpS-=zlB>|uQA;;S} zp2H3S+taw+5cYRWcLDz{;7I{r7qCshy#lrf_>zD-1bjij=LCF4z^4WLg@D@y{E>j$ z1l%g%;{rY=;1&V>0@e%oh=6qhssdICSSDbJfJFj&1zaXzzJN;v%o8w2z-$3C1WXrj zh=7uS9pgBEPYSq0z-d4z~+8`l%W zCQ>;*J{oX+R~D(Pk*^A;e3>&h#AH8KXT#WhtJg-{w^{OGf~ zxS|-XBxeEamnS<;nmQHXeda``u*L@jz6u(AgJw2vl#xCSb0w*`!dDI;6;_%qurNCt zhOa{MGTCoo{|H|PMpwwAW{=_y_o*dFX*p8lpDN$VveLq-+!Ib!)s-qnuEj;dsj9lP z7KLU7Foy*qI_P5qVaaP|%p4liY(XwBE?(`Z)tWTRR%3E}|(pnP!6)N->^A{|T)S0rHJx zrJ>N7GL7t0w_zLsebkfEFXl?^bMaj(ea|hmyYX$7wt1v>55AkE@6VUo=i^%={V-Q* z&&5}je!Ng>Ux=?y`e~ljo`>(ZrR{e~?RVi@EB$Pd)V>Jc??^viEVVDj_X+8L5G|3P z8zuTmF%#K{M5>!4Wz)j-x=bmRf;}`@N+bC2ZEVCNJ#srnM#E8Tcd${9^k^2>XKk1Q zEjK>(8C;*zFiu(_jgX{`GuX&T(n$HSL6Z6>;!X^AvYk_N7mmP(lT5As2iG)R&LmqJSf9M@GsPX*n;kSb_npv%4f zKIvh~#|_J+_0lj&x>0awFAc#^un@YfIH=`nrF$e?2R~t@G>i6)WK=-!)nAe(mP5bQPm(6x%0`z` z=6J66oXliHl5Qj1^r3Mj6F6o=2Egum+-* z&ldf%!B|oPDj>87%CK3|eNZA+g3M)5_f~;D%b}co(86mP=H4MmYhiIi_?rPeQzXex zo;3Q!XZ~aeI~fGYxwoScCOZbj^jSC&jV)l_BuV-<;9Z%h^ni;pBQ7ra@c)H_|(j-OvN|T@ob)tl=?ns(jZ0@PJx3r?Da_wSjcd-Ko?swM|S99fvrvklhIrF$z;Dvt< z2Hpyit1Zr}tn!ia4Ij93H;zuqh1Lgpi&>R*Jm%eyOBZB6nieSa4tim2uKzu3ZK^cXx{|w4KY6pAQH4! zBHDc+Lem}qGxTDFp?w?CAr%xhtrd}unm+Sjro9d3hwQY@XMPm6E;Gt z+ld=IT{9iRL#wc~B24Rn;rz^jOKF7L5>QT|Y9ic#4waEsv?%A@eU>0}q+2fNryVC| z8jIoI-A;56eUvWr?<_qNKiLT%<%94L-4q|y*FCkod@Ai2;-4aXZk2QKk;$+QALfyp zJE5pZj5+flHVPLV3F>q<)-dBk!`{sfrF$iYA`XL;w$cWeho#^sL~a zvM;4FfcC!7D(B*r)zI=;jD>!mSxJqLv?Sms+=P?x;a7q9>m=YJJQ5ZIXiY%E>VU7h z2p;%gu|Sx>ml9ufjb#JBii;|WBOI{8z-(A-V4<+?z+r((cql%_kq}No7+RO0B>wv& zIAHcmVVI5)0{@2HdN;Yzt6%BsN2e40?H;~C3V&mytNTV`*eHd+vFNL>=4-~6|62~M zkx96WOa8MZAg00k#$4scEJ1=BW5VCqn5+Am@x!_PkDC5j4WN_;;%lZzwy-%xy2=cT zVA0{PF1O)ODN@+XO))W%m7u<1qvmhiw0TRQNq?;Qo8Nl;+uwO&>yzL8-nQ@m;D1UsR@#Wcbo#!uH{OapVT~bVJoGrdjf<3WsQgXlkj+AQ#Tsv^k;OmB5f5VMKhYcSg zj~tbnHu|QU({C9w_SSLZCuB^VlsWmf+waJlGIiSY8F$XiE?8Lz)%WU>(g)U*l~+_& zJy>0%`fAtKt$XOcWy|kh;qBf3;YZd#y5awJ{{L^M|G&+DW!7w`YtCG^XWsmr+yx8s z?pm~X3EqjyU-}Ks|K9!opWr{{wk?=PS|7|&TQL8$KHrV9H^Yv3sP*|~l>J*#_Q#{_ zm|As@UQ2xBouMj=3w%yQLQVlJU!#y<&+c*F|u_-MOwsp4o8Z?zsyW zxRxl3mYVk2OP1!jn1%b#UYL`kEP)H+Dy9bTow;1!YKAk=ehgSQSL|nox5+3a^LX`cmLmQE_xTot7jv?m8^Mr6RJ zUE_SH_jBkeD=S`IP$sWjhb8-(;s<@j6@@gYc9vGN1@U#*PN2%PC4dj5&6zNBE~TY@ zTEi8KOo+FjQpSq=ni{#FwxG0()?6u7jGar%iYuUSmDNfLQ9*Mj`YbB0sq|Gt30j2B z2^13%p*FSPj}*oK;=9rno|`Dy`x{mLM4{?XQ!| zN-Nf2ma+)w$5mF8t&>-Q61j$Ln?m}Yidrm_6(Q@zYlt4u&ve3aS@9}WhDx`nxV97= zA^Ib!@Kh93LHCN82ehrSXTm~S&{V4{%VfS{M{|ApSaiU-f~C!;Og*^E$j@bTA*f8UQswiuiDLl==T+tm}Ei6%-WZ zhG;mWIiP7GrJ*^HnptU~R$`grn5HIrI6MlQ#Of| z9mYp-U3em-Yb(?+k{a=GwGc*;Avm?-zk;D>sH1VFkqVxE-@|_=6o(M;8ytFGn|{+k z&z(Q{+Z!YMwNW>m`|)3P@UtoYTsHqTig=zruIyMB=PUg8F7&+elfOQp-@(vR^a-G^ zftLOLNB@*7{W5?*Z$AttG5ohpJVg9*iJlnezsPY#PV_sPBp|8mbk;{H`0q7%8Erq4 z8wWi`AeDGRo6d;DuY9P3it2rhz7OdyY+g z8b1clw8YU<#`JUxPM_k8^^tD)uu;jZ)Ho`~l$FqAOfsHpVC5TT+@}J|4$~Lb3&q#tDAhWJSRvR!t_y<58b+aV*~iOtnzM zx~?ZAC$YFuPz;kyN@6OOYarvtjbh;=CdZGUvpOMEAh1PXs!te?{*8_`0lJNU4J!`I zg|6dqS1_T;$i#6>4i@Wi#81S1+sPB+lZ3(|d_oEi4RL%YcwSDUwVc-Q_!PRUP=>=z zZBga+8B&KEn;eJxxMjGpSaUI7TGOGv;wGdF6UDNIBTuZ9s8^l5 zcs#>6ENSAfIKJJn;^Rk5U|~WZbQW|JnweAL`MqK;NW_mwMi-;vYZ;VAuvtDUUkJSt#4JwaJ!A3a2nw{XEkf-5L;ltvjbi?D5sIa`hlcv<4$!Qvc zXKWd-RfveUj(1wcrSUG}`M53{$0D4@CON^6MsKCY7Cd&2<>JwM6Ne9v=Zz$#qrOT` zq(g!5sA(CGiYgbcja!}wF>w=8QGM2GVB?%RMQRG_iM9z^Q`7jT@bQ@FhN1It?fAUF z!!czhjcM>2oY}7DnJv1=i=G? zWG$x%kL}Ox&yKzNv7ksDAEM&}t$bUC_tyAcJ=$@R)_86hKkCQj5A4!~#g|(7u8c3y z`1W1;GQQ9n&++-X_>I^2CVx9LURK<$3w?tUT9uqm}Q>@Yz)y%H&^33x6|5FrBuAf=N59IATSjR_cyvRRN$A@ZsR5Y*u5RLEKzdNh1 zK#d>Rme-fF#&_5HYiSg(UlCud@glxJ<6~lYe-rg9>L*`|7ksY9i~1DxFL-zNs_stS zFFLq8H*v6caQF6huI}8sJ$|(YPp+4B|Iw@5{-dJjF?g%N?zTQ>(N>9X6dH=BOq6DI z`t)jxW@}cbYcDE2QEG)|b^5aK@vo*>&ufN`!xMeOMruz_;<+y?KT;V=4@?h7LO6bn zu!Kn#`Yj*6PYL%Y9(f{{S&xU0B&G=Aypa_pGO$U9n1{7oH2Rx~0E%LaWJIYEd9qgX z8B>3-i+ugi;jy7ZFPnxYC6A&k8HKp=>Hjiu{x6f$V87<|H!Nu#o^6-jw#G42$Ss3$ z%h|i8O{?oqe{RY-)9=UZ|LWAqHS*;@x9{1t_Jrxt(dq+g866`tm+j3w6|%{+=zid5 z-NJ5|UZ}NUUg?!SritIpdahm7uS~*GK39NTf&2 z{-$$pw^o0CV^o{>lNXuBd^hu@3#LIk5l3m$W&e{`*GL5IhG%)Ongc+{UR_P37d#6m8P{w4xHxyuZ>HOcOI(jMI$_GWdn}+~i^rzcFD>t} zYr{EH(?$C`99(|Slwa?&HkaERHT|>euR*zue=^6 z(ZCzq89i_vNnIzr2s}H_meUUElqTpI5+XV9x`LpLv+m-5n1y{`4MBzi#sl zAFU|uWj7G>GWFPviLeHIbBxe2;;xc1dD$siqpGqaQebG zoc6Oj$>RIB;j~2>r}wvVn*9f-fgz_D?zQ2Zezua+6K6R+;(eOMukXg`z}cMM_?pw9 z_c`4hdWPW&6FDtf%jv$KIGycxmc`fX$>}?DIQ{)=PJ`}oTD$4@4CgeG(}SxxHJ{=1 zw0j|ouib&u?o&AJxs}uBe&h6f%^w(UY=2JAEabGxK2Agb;Bwo#Nu1Jn zrlC0J7fz@6o@acQj+|b5jnnv#IQ`-rr{_I?VYr_oIo+DV>5%oD7M5|<06y0y)LJ(zQk!jG^ZaXa9V!`r*AIh^y0^y*4oQy zk3vp|-{3UP;S!S@U6s>Dp`4a<FJ9#Ioi3b? z8pvtgBu-CE<8;hoPVeM!nzWVEQ~Nj#IirPN<#hFZPV=3MS-u598g0nwu9rAn*@M%> zA)MA5$7#WIPRA_f^zIr?lXE%!A)nK*6P!-I!0EP|oc?6^jpcjWhtr3(IHftD@lO$7 zues7+UG~fQn2#>SsTn_3`?%7DQEGw7(6iowE~=&e*;XHyHdYfH4((ch?q&7IjoH^f zztdO!d*-TPU001!!(BSfOEa`rJ1lqmR;|%TZQ6Wb>-)E3)D4Q~Cx>1gtbX%#a%s`A zQEJM{jD=xd1Ju8JEr0hDr@?A=l_}Nj4n?Z9kL3L^r{4&5ndi1q^=4btrk$I4&s;r8 zy|J^3->kM~_0F<$m*<*isIk?C4(?mEv-)1^tESYU6IH*0l<@IiPgARVywUS$;57BQ zhll#s+mog)`K$P1*Ow-!ZTED!(6HTW>c;-RB<@vvsfS&s_nL5ThPruRwJG(Ry{hhf zyH(@^ziDdWy7~FbZVy+#TKXWZ`uM5p^6>$4Zbwa3jg6C6Mz&2>^H=ZNpV?%Z>R2l| z(ddw%7O!nTDJ-(Py7uI4yH`%dtGNL)L$cS$sdcw~8uZ?f5vuctJC4oi^{TpJO3am* zc_Y+LVc%VKy*x$z^@Cm8-a2eiUv9o>{?8|0RXa6qZa=c~Fm-#sP1Q2%%}_(e&6-** zV}@#6lsI;I+f;RaPL1eIPP5fI0o{|_AI?$()zQmdcyFP4xzpLpfxctZjFVC8QhJS5 zpWEl~{Pbb7)u{T#ZLcpgtK-zy>ec*flA3z9Umv4p&6)V=-f@f6x07qH$apJG{c=+DhQ*ubsNpfE zXAc-QM(ubrp?%4Wy9CiUmZ$UB<`E37XQ(q zm)9!;)R#7XaN@hy7OTqVTij>#3Q_-Vk{gkC@J)5zkGp=kbM19?!e=Z0nA~!{8nd#_ z&K8p_>KDzL^^5snfqJgv)W{(@scOMkW7RrgGu4chXCGfLOi>-@)=F(WXR;dg)r~K2 zRhy?81G{dY)~1W<_v05?9`7fq*>-)4kKOIBMmjCYZWca6buB#F_GGa|J#;nb;K07G zswb27wKX?;O?`9P2qkCEBsIZx;hg85PgY%iST#e z!d1uK>pH-!2F@LmGTs&wX@?^gHSOx4j~{KGq&n9dc_6dRd^Pf) z7rvf9d!kyjeQldR=Dwib@SM}Mr+J=Q*!N+h6MH7Bk)0bPoZi+_ZGFXi(b)qt)FZoQ z2VVIrLp|ZRa&F1I1?q!2_a>#(cwNm6dgu9&jh)n@4hy=aoHVPwHv4psHZM?1q8hyZ z%g_Ppi^ne8C6+8yy~p-$(r(r`HUH`eZ_;}du=I^gm zo9T*0Thj^_swrcqpZ#UZQZ@Eql>_rXo~-8Ny|<-K@d&l`*j3#+IlZp7 z&uD+_t(RA-F`qZgd9?OjHDT@RiG!-9tB3xK+IC|6aP?qri-mQ1%vF_jmhlDWN2}96 zn;x_zeV)4W$D)q6a#Ph$oA#RYLwcq<(fx~ddwVTXbH0uI>twBV>fkRMHQN8vR5jAM z!&fc7OHvD}A7B2%o@J`V`I^&$KL)9-J-aS0Ts=`OQMU&LoK8}=w;go2+s>8h_jfb% zZboFO`&ZVR)y{o_dU4yl^Cv66qfU&jck+WXGu1tlYj=6mZ?*J@0`*t z`BgRY^v%c*a+;~F*ZCQ~`eUxzx=;1p#k;1d;}_S>{W@={8n@{cQ=9Yes0%uLGOz8$ zH`S~@*Owe{T&+elXkK;hrBwCu?!D)hFP*F=grENM`SHo>4-K}Dzq@0#`cC$>wZ2=k zRsWPKJu+s$rS?(mMx45ssn#xdILUcdmKxe!oxh{%3N@|6+JL+hv(&UMe=M3ZWSDyS z{cWojFH2L0R{s0dw!!bH3q6LIy$YA9nf{6GOO{Mkw_beYzhKSlYI^q{KKx@)M|H*9 z<{^80-%u~@_T4tBZI=3)om2Cpt+$Zbq}(`1quQ&YxyuoVqq| zI44uB^4z}F*G|n<|NipGj3aaAs!P8v+SBL$64hMqe(sh^1JtZU7F^M-7XUQ00+S}**tY+@pP1pA4waj>Rr>WJ# z(2H+Q>Znd@lD;DgxYwL{I$G0lSCp;ypplGKay4E_Cwn}M2eSXaJ#M_6?C}lJ)juG6 zJhqARZnDQ$bX(Aj?D19orh1Y+{xB~Z(*zn>#}-1DYgeX_?x9;S65 zd;I3P<9*2<&#V2-t7MPwb4uPt_ITL0tp}4mKJLpJ7P7}%Ib_x%dwlHkn^urL-lkEl z*<_E;biQ+x?C~gP$F^jT*KgtQknC|R{sCl<|MT9%tz?g{TYl{ivd5E#A1o$&e04*Y zgJh2f^#1Wfvd3Kq__{iB4 zdy+jqwrT1Dvd5S9t=^05@fQaee<6E()v6wI$sX@{ec792kGp4A?@0Fe&*_c-B76Mu zPmzzv9{)Vvu@BkfnZw)UkUc(pMBzJRk8j)La)s>i!_DfxNcMQAD=S-(J)U;cZ5`R; zuNO9{MfUj8sh3BQJ>J$kq7m8S9se9)Bzyeg(03n`J^pv=S(C{g?=%1N-eiv-x#rY@ z?C~l76R(jy9`4iNIkLyYrX_7Ad)(#Iy)TkIUTtr|Y_i9%W+udvJ)X9F?s&4tyB_Pa zob2)MdsKUq>~Spq0c4Lanz-vB+2a?EyV#RGeqhfF_sAZ9ykY1Xvd5FYKXRDt@sjhG z+mb#0;o4Sb$R0OLm>Es>_=&(J^T{5+zimW!vd0Uy_>Cre{QIT9KwkUc*9V8K+f$DO*aYftug;Fz8r$sTu_d0;Tv-&mI_V}YZ zNB5CEemr~i8M4RUs8lFxlgG>iZ5Pdt98a zr6$^aMfUio9h}CHJzn*0k|WvU;R6F^kUhRXMeA=%@JaV?gSJ$|7@pJcMfD^J~(LH79aHP2lkdwh1g%z0#w_rBM5JlW&h{yzUP z+2ac;4|sv>aV-9o$sTVQRJ{k;8}%S#i;9^aLk;Xw9y|BUS|$sWhzA58Z6 zcSk+HAbZ^Yz&#JL$7^h9(}e7CEdIe{k9X^T@e0}F`xkw)gzRyLIe`ty9>23}H731F zrY>vxcP4wh?eED&WRIVz-~COp$NLSMG>Gi+8Rx!?CVSk!^WW3S9)CP#=ryv(FRZS= zj_mQ_0pDyPd;Id-=WCNaUhEfcNA|eG^)CjIJwE-!w3o;ppZUju&18>1`0eH{vd3#U z&Ywc|_~OPdmXJLj?*7elWRLG?-slCg$Fca=Bzt_-$H(uIJsz+$^8nf7=5}>gl06>y zZk2gtj~{RE{WjU-U5}nAAbb3kqE6k(9>?PEL-zPfHJdaedwj9m#XPdd?WW{^LH79E zqBcC*2A$R7WsuYW(X$FcZ(lRe(N zQ`!Nt$Fuu9H=FG7DWCKnME3YUO#%jzJ?{19my5|BFD#tpM)r9A!Gq_>9>?PEOZNCH z&4zqU_W0VMmDk7~e;n0xGuh)<{C&tCe=BEA2-)M0{q`7=V2@{~?bt;2c(=sJmSm6j zSm3{%?D0y9@?rt(@!B_z9Uy!B_xpV(l0AN4Z_)s=$FEE-O(T1};lOjhlRX~T%ntb$ zo9^En@DJJJf44clhwO1I{(fYSf4jfbk?ipy`71vpdwkT*4(?=+&%1d;C42m(*O&Jp zdz_z_Gkct`&DsrtlD^(+r@nUG6rPq@rSF52ruE}~d~4o;o2D5zX0{4geaQ6Dt;WAx zYH-TbaP6WAqdSl1>$~w3J8vfuBjVXl4;dBr7-+%g_iz50!4`k(zY?)O&_eim8!>D< z((iyZUfi#-CRHMFpXV=Ye6tb5s}B3D0B-^k&RmWkZ?SK>AZXo7A{Mlibdq=_eRd6T zn@bBW+AZR_KJQ!e8<$7o3Ey#VDQFH9) zoHtayN%b0Q$LUMJV$0r6g z95*6Pjp?(p;RnADR_i8=>5x!2K`r=ce`NRJf$A%s6IO04j8VNBPIXcz3{=foTcS5+ zj#llbmB#LE=%Maz+%D|TM=z@vJAL`rS#b~JF0bk2VQP?v#mPX^Xq{hd_G*A-KJlQTR(PIm$mH>@xJRA zHQTA-N#iexs@rGXJ-gmdRQq>2a`(q`-PKi78Xuiox1;K^=DYL-=SHg2OLr{(uKC=^ zzh^ay@9f_>5|#0HyQa%bZ#MY!YMai-wQ&(n;d+<9<``>#^KpBRNJJLZcd1KMiRktc zQL|xDG|`ZgFD4RAm{)ry(Wu|MzC+aF|G}q353QPYfM`aC);|-Cs&f7|(ag^kH=1X< zYcch12a{SlU&>rRir@1U;w9D02ebmSelODQnAEJ)RANxi9dJAEP zcAmRs<{PT>wF@VX?fFV|c^K|*Tyso~S>CIgWAM*v>hF$2He5fg9=M*r^X0vYsY>SY z&LamlGFhA-p0AqdVv0Dwa<5n0zNXd>zlf^3u9GQpaQdr{&JQqs?B-dx=Cjo%4orvU%b^S-xU0~-&VJ`x0s^b>idm5dET`4*5R6wogbQRhWEd_ZA$&fb3KDf zhqe!nY_*|Lr5lTTM&7%0?A-L~@sU-h_3KcjyCrh}D%Wp6-!L)q%N2D~j{fjz@{e!bqcfC$96bUn2v*N!~WCxntXlKKHg{H>uV3Xp1+zcV^XTdv1LA zxhchi+xl%@{>hm`-P;a+y~C*QjYFtiB**5Ts0q1j+&e!A^o&Gg=K9*Kf5jH}V*Tq- zGVfn$S9$;HGN1RajavUo*ZNn%|Azh*^7USaerwvOj}Nae8F^%snsFs$(y-XYYL`X( zl!9+CA1n{+wQ9zvYGQOo+~unW)tEhFPkW-;tY%QPZ>3UE9w!I^uJ+ zjd9ALi2m5eypdBQt6tkNZN7grVn+Au58L3e6?*Jg=l;9?{%>7>M>H*+y=Gwl3fJGE zvzAsn>D4Y$*I|@dJ9_P>^>@vMFGkS%ySb~&ueAP#zG$(h^*42V$w*p%D;*m3JgvWn z)7Oom^*8?8UVUhOOkNh6O7r8A+k!`MlYfD_tO1cZ2i60 zVDqQ6{$Bd$1GfJDvEFkbt-oJI2D#Asd!haxf6@ADU!3p;t-p`2uYOGH?>{f>-$Cnd z{^KppY5m`9?NmtLa_2k3be;%RrBxuKuX|$fa(dx^tw4O}tW%`in>+Osov#GwC zyxNzoCk^`h%%}ZI`_Ip^`l>W+46CniEAM9Y70`s&*I;EMt1tWad428H)tAHnBlSh| z64{|ECny=MFSnSEcgV3{j4&!0s3Y+M6}c}GFGXunW%el#VDlTh6!WZ*@ua*=%X*^1Uv^qc?Mv;Vbc|7*|wKXP93UwiiH z=Oy^Lfn-PicfI@Hy59ZQe*CZf`2T{vP4f}if%F?TqT;@(_+3(&oyYBuvip$y{-bo? zk==jX)74mS#p_dA=0$$A@W?MWO%w)%D5 z?CG~m)%tAveq>6K>4&U?_LOq)kP9{1&{C8mHQ{eR5eSZG4Nl9~M9`TBqBeEqEZ zY#A2^PJKD#nCWrD4%OSA$MYYxYK`0c=OWX+13O>#>v`HVqs#R#U#PRh^z#eZ2VeiJ z-tOy3(`OGn+C`1}HT?E#pVl|UzNQp^G5>_gVVg2ItJm+QPweb>Jm;8Y>an9+a6wX` z>BEf4M^CSN+jMx+od;7Q8t$I?sf)*nS-sTRC%^q}TS6n#v7_X!Q-9U=7wIM?f0ju} zp97x({|5Y<2wMXGHpW#p_;+!=+N4CT1;yD)`iHpQjJPfEpCc>}^lSJ%2tR=M!??z8 z-O^8j$8Wjve}c!EQTi3o-{I+Zi?~Oe&hG0f8Ht50*LZx~${{tfRSmDEt(siTY*lpb zPQ+tDT?(Tb9Z5a5l)v3{QT1DS)+sf(e;#O%RYqYHX^^I0{ zS}th$T=OlhI&NIqD(K$TRxzPjtvXN4X%)M?X3L@HZ?ww4ajfO4YL{E(|9Y@R^3|+X zF?W`>D){1h#7iGVv{NiwTHkp*=LOv2Yy0s>4cW5<=AR-=TP96ZhaOz2DsR5ms&GEO z%Qz?2R1}-3uAKO(x_amCR?`~wj2Jm`B&$mr{PAfPHV1$zLnn=cZw4Pq?+8H%zT2Rk ztqmP9Y&iY6H7SmVizBv?JQ&}dz`Kp`b5r~zw;BDe7*w$&)64P2^CPDA{M^j6PkJ69 zN_!5({F!$jmCwsd=#wYp@*$7u2HA{?bdb$>mKUy&598Op^Tqwod%o0j*Q@(a&c6Ec z^V7O*N$Fux+hvtb9~-xGN5cg*T`s!TXx4f5T8}eR7eo)MxqDsln2nk3SDO1~?npe@ z*ej>OfL&2R9cT5wpP2pX-$%abHD~(%V*?{U-}=%0!@r((ADZ6a`H5AI_FDE}dhV(Y zq0b-m*f8nP(CDt~gMCJPa{ZOOK_>$n+#NKj!r>}E5KI}UUZ@Ydl&3(GZ+=a~Y3aoLjjs!`^}wj5_cm*ChjUswg448kPB&`$ z^q9c;f7`yI9X4wE2>w~L2YYpG5`A74Z|oX|chT~aJsFNyUK)oPU&9;mXe`irFajTZ z5%oYkeSVF9ISt?2h)?A$(m5r0f~D<9y!S4Vde9j5{y}=9Vv_dFmpEJ{2{H7&7@O%j zB~2KgfYzn21`i+|+D#ZaGCqa9gM$(yUHb_sc=?(5d`)snuL<=1jgDzdc7^d;&WP`k zJPL0dOVTn)PLaNHqX_|aBJ#vrz?6_*c)xOA%iGDQ(bnrZFZziEDr;FVQmUoPxuoIF zaT=)6)*9W}NgHq4en7NiJT1HYD?ChI@dd6&`YkSJzqW3j)+pY<$ogMnjhYRd&(P>) zJI?1;;`FFSi?sCmbx@Q`=p*>+o;BXtQ=WF`LYVt++|CDyo zQ^Px{`Lr38l9-HMI7#sMOwx!kec7Alcxz+)3`^3$?T29v(IR8$#e=E6sT)lg&fg4- z?$l`*eY2TT_DmdyR3lhd9sw1hcRAj=9CgR%nSi&@3xy}po=m*4nCCD4=Uvq5p)PNS zkoue+ZNO=V5Kdb++2J_kM*J|DgSz6ibqUNPXqZ}3L=Q20prD0nlx1wI`<6Fvt%7d{`p z0KN#m1YWUI6eD~jycs?nJ_kM@z6f5iM?8Eaycs?nJ_kM@z6f4%KpcEJd_KH_A2me6 zr^DyND~{md)8X^s6({iU>G1jRiZia^>4o^|@brS`ba?tuTsl0xAU_?RKIoPXPak+o zho=wLrNiSh9r)rMyf1uZct3c5_$u%L@c3XHee{k#AV(jyV;_{O4q5}gCcF{-=_+qO zC7t(+|J(DOus4h|wSG5?(>yId(J$TS@bK0e-KbG9-$iQp60N`1)z)+3a1HqJl~!3 zIE~T5i?8!^70K0y7re#OJ8S8BWO6=sKBs;f4bkYrB|KcD3tzzbof>t2gY(%MF5@?@ zk62%KX7Kpnjhv#lGiTOtsYiKu`UXzpKH&6_MjvVA_0!}u)@T=v#%VM{lebCZXKPgC z7hBBrD%JGdnZ@%F_Jg4M@IO8Ht9Ts!?_M4mv`JtM8QJ|#z!u5)_lDyLnv@YxzJ;?MH^GVccG zA1&qhVR%>gMD|AaM4S8NXuO;lZv#$=Nx>I+J5NZA8?Sv=aa_t1F;oVIV`n$KMA-MT zAZ&i|is3GJEjIu1g$VD+-m%{U+fKemFCX41Y1k;f1vi&)y~X?~=E(>xT-1B6R$hT? zyq=dc^d?Vl)W&b9M#XuM7}w4kPNXl=nQL&%esL8izaz#Cr+~)aerj~T6m;Jg?x)9|C#HJmTte0qqBF#d4}HJ&D8XAKg9LA zqw%R4?=JMwX!>1VUNMgr9O3CiJ;rMBV*V82dirnY&rnUCNUxtiH)`>-zvFuR-`byi zcAU!-rYBc)<=Yvmkny-cL*Ypd$$Lnw986Lk-qru;Ee!n(P6`$q2 zgBBjB@tLbXkmvBRWFxNn zvhQQm!dETI{^T!U81WsEvTt8dTAqTWKF7Wjqp79k_kU07ztLahO*B^<4?C}F{l6=} zAM<~@zH`|nrY@iETyg9B$=dIL>qhc$e0aOkTR~*n`Mp4f6nA8*1%o$gJjDwq@JTv+ z>ND^wB|Mpm>z{#lc(J@b?%<7@61Mb-)#1%Le3SOU*Dk(T)g<)K(cw4h@cQyz*5R)| z1OHiz^7`)tA6kL_R3CRFJek4{5l=5~7sLxk?G^P5{CXXJ(=+gwb@=Pgzz4T1uTNd@ zMomFm?WNZz<{9{fI{9xu1Aj<|F92Ur{gZyiR^{~%0sl07st!LDyj_Kd|-F+pq7!BcvDdA(77Bf`n)<=etXJOxksn5Fup zqp7r~;BCo2^bCBdB%ktAOi$N8qC;7I5`N)R@Kpah5icCo|Iw%5N&mF=Wq6YB99gkG zBtIPS!jb$APr;LX{d}MC6g$6KXW&CSmeoJuBf%R%$?5ec`8hg#?o;q2uUNuUdwF-NSU%JO*?L%cWA8U+J-q%DJn0+RrA&XiiUn^3C8yVi@Yf|g z)sI8hit&^_2JymC`oT}Z%i}R0I7;~lG)fbo*N5<%x|PYN_S*^GSOK2WyLT_clRkdn zBcForpu_h7Z>#`sOP{Gv!IM7neuVTt^bEXyf8pMvVtq)ye*e+|_^0hhEQlA5>L=|P z@;B-5pFIUn^;0C_sk|l6z>E1gvZpKEwo#^n8bQfX`GgbupQDHuj`TnM6g=r8_^CSiv;RYU?lbUrbn+j84|z&?L!-)U&{~ zt3vtsfzs{I&p^9WfS2{L^yB-hY*1qbc*?H;@xqZlh0nk%{mbK>!5cLJdi{x?s>4V9 zhxpk#e01LqeIK7TU&#O9*G^wQc;`XZikv2ibkH?_nK=Ss;s zDMmLu#_gg6!dK*|4r8Tw3$C4y*uX=UkS*Rb7m2haUv>gRVIfG9kN9jIM#fYAg;IP8 zu5IN{vV?3of08ddfuXQiD*r*0AHE_-_*f}ELAs_iBttkkUy>_3Io}MV$wPdm4kP2K z+yzp6F|PG_6P{!V*>e6QUv>gRVFgGN@r{e(4PTL?{G+7!1YFz7pJWNya{eS=b^=3T z=>y%AQ1qcp9fsm$Tz;6FQUpw%4IE*~k)EYey!Rp7{exr)*|MG_Uv>gRVZ}&ehP(*) ziX7#iCdFq~kUz;1vgQ0qzU%~s!n~WK{D{xfVPrhbQKeFR;9=A&cw1vc$RwS~$$C&e zvXk|QgdPcy8wp>LBYe6PpDA5a8j>NLoG;0hot&?k%8&Rw9Y&8YmExVhEiaE`2q))D za%CsyyAk~}7IH#$vSd8fp+$<%z_qP9Cs{(aoIlBzoxo676w(wTK39j4@sxjw6d#N6 zWGjCfYr@I-)A+OHNRKX3oL(mBCUlkMk-oAM7z*H*M*CpXd zmXIyyPx56aFcg-7G^L0y&|zde%?sYg%4CG%I^sL@>EmT#GM;3T&g5i0C?DC$dgLQb zI^@Pm`N&whCOxvH_`GN6K{9RWLHWo|)}s_@oKdzS9Y)5JOd~MDRa6%wOURb%f#l0h zU??nNu$z*Bc(V>8<0=0fDLxO^w%USZ3E6V~Bwuy{Lt$x1jv-X$b^KczeV0$c3I+AI#{UsTMll5>Og7QOVkq$#R;aK|v zBV0u~kSrm)Ts=r>Nru4CbuM(yK)hLpp*Z1K`%Ce8xVAMPkSrlv&Y$GVPGBf3l*)es z<=0_kJS#si!bRZPR{kVQ$d>ab`LYuj3Ns^32I9>+jEraHm*VqqZ7YA0C1lI_lYH3; z425l^@}ETcbr>1X$`6ci5xBOMKgklZ<@`y$>;#6wimCjFH|sDmo|RvU&%?E?{7IIO zE$2`2WhXEcW_$(ZKZWw^FfyK%9~j{xaBVApk|kuz`ICIv2@HiLAWa71%{q*XXXTgT z^Kfk|f089+%lVUh*$E7V&&m&sa1pq+l|RW6vgQ0qzU%~s z!qSi?1My}ZM#i)9OYwQQwv|8060+s|Nxtj^hQe~G{AW>q9Y)5p@&hAW1g>r6PqKt; zIe(HbJAt9FVk$r4%{q*XXXTgT^Kfk|f089+%lVUh*$E7V1)5R*?@@joM#i)910!4n zu5IN{vV?3of08ddfuXP{q{%?MS%;DFto%}Z9+3?6L9(d~k%c%5VD9;9VSR|6_t~8wN>AwzwAWb6qboJh38$AjgowUC7id$90JY=TtNjmkw)N3 zZQuw)GO7I{Aj|50LB9i^0dJPWtpI)@&Y?&rx!&~WP~v<^kK3p_U!t-LC(EPyu;obi z5-E;!mK~MdR{x@Ulbu}ug>i056v`h0Uy)<&FU1$&I$h#Lx*W(7PA<bF`n*YoaB{vRS9Wr~rAU)-(M8GEVF)kdLPokN-oO>xzzNw@KOw*fmx=30 zi5KCNr*N{Kq=zj>dZbHndYPn~&{dX4`pQmVC@dRkiV&Zt!^n6lPpK4dzJ&XF@Oo#4 zEaBw*BWz#^M|wm_aeA4go6uF3NBYW6U??ndl$(+ZnHiE?8B5nRXC0E_GcTh(!AFAH za?X$`@{slLt^m*4Uy7?pc3}nel^~^+^&uV7r8vF5RCdanoUA9+hwMaIC@ceMiXbyj zk}G5Bn(C`miVwWvqEs}85uRk)(u4AmovcRz(j-7`Bz#4V^hlTDbDp6G$+V>h;F=GF|I3`qbME8v{jFkkL+YUa*!tPSIiUedMD!wfHMOVVFM@9QQm1% zd=aiQC0^htPvPYHB0X$5(xX6%)5|2?gs!qY(pPo@Lt);D7*EBpyWsUs#u>-BDVf)C zf94su9LP%tCe{W{$fx$qmg2pC!*~WC@yC-oP#V%v=pvVk^tR=w{!68}ie!_nw)zR_ zFFVRxjJLwk=&#T>0$%S3N6$l&6F74PIF2gAW!S(GhGf#~G7d@cMc0t`@90yY-tfh^ zw!lBjWkYvc<1@rYTFRH^gGf0J*Z)bL#i(C$`h9-3ER!MlKgu&#ip!U-2_fXswcHQ% z^2E5Jwvci9aTS945N#&oBB*|CIO;1=Qd|PA^<$8d3AuFrG`VKvFPx0alkyPpL`l~I zDURAgcGTyn&B)2}sK3gNqaTABH5&?t?^3w%TDA?VWmjpjd`V5htcChq`605E|MXfTpp4uJ2~HoB%FUC-mJsO zc&gVNDLx<96|EJNj%3;@KjkAkS&t&5@xFob>o78&WQG7ETqdp~C0>MQLzZxIJtWw` z5{~ppm*Vs?NjIUZERXb+oxo67$XKjbh|kkuWIUCpREqch6Z;Ezy(3vdwwyo7mz}^+ zSOU_RAuGa$JduX*X;QpCZ;~OLoG;0hot&@tIGh6^K39j4@zkG6qrv=U#SiKW@QnEFLrL*P4d9!}q z)Sowtb4oo(_^>kQR}t#yX#TXu5&6(dc~ZR}G}7kVeRhcVer zDF!CH0-Q)IaQQZHgdv%1uY){=JA~^r_$c@gDO|)0D$WJ;^`Ji&5ca+vr?>a1?83?Y zm+HfoBi-|)IMP{mRCXHc{hCi{NtTc;_aBlkJAt7v+I!GGBUgu!@fBSMx!NhN zVUAI8_bMso02d|5&q47EcUByu?JOcpq@_H`hu(+oA`tZI@6PNuJ3?PU-R~IK80-Z~ zZiU7Zp4@FvCeznh@s06Te8asI-z?93cZ-`jDBSghI;r)P;JCVqe|R0mv$>1GsMtjX zIytd-IvV_(6~8!l{I16h`noE9Dc+VKH+#jcol}%!D1Nt(@)T2fYC9{nQ{9vrajr^L zl*=R9C11obCGby_%el0Cx&DEET@YXLfR`iiAumTND3y`o$$4Dk<&f*rI}mvr9Tj7^ zr?pI!FNF&y@=e#}`y%AgZ=f=@e0FI0#ysNrQari#TE0FW2E}1GFLMOs_jt^4BS6W` z)OdrtgW`@laF2Gj$hw+ISAWE1Ia{2}j-jmG5k{%0-_m?QG~_R?J3Vtq`mNIRjKsBY ze`sM;Jwr4-DUM_SDX)DRKl~qFhEbq&MR}6@2$b~N4ob3) zYT*wwUM^n-m9M6wQrS>lanEUD%F37ze&TiB7Lm9X?yMF@ zW$c7&;YgMvc#=~^qxGeDnwt-TPeWNK?Ru?DjgW%UnDC#<(of?HK}omYG`_#Vj_JDu zl-zQSCmqSX4oc-%21rFGs}-_vpMZcDKu%t?nUx9DFx8=I86RV5OZg$Gs z?siILkQaZb?LQSlG+$@h6OtU#pyzKWgVA7G~> zYUy1ZFxJ}Pcja3CUskhIj=?WNJW+joR&_h&19*xjY6x^y0^>ZCK+Ic#D0^TuFOQF_ zgW?K(Fc-73Q4QM}?G$(TEn42SaNPy|gvR?+c2FvZJ1LdJysT+<*0NK6gBNKY;ySE$ zSsH`Ci{gK}66yeL7H5w-K>3O=KHVKLH@LI80dqiYs=^Cg5Po}9J8qa#JKU_)HpD8G zOMHsF3Ow@NqIfxTsT`qhO3m=$N=?Ljmv|Pr7r5qgO(aYcH>Fx!AEjDMlu|9cw^Gf} zP2s&vt1rkgur(LIiN$*08>X$fRUH+#6sP=376-F^lwBy58A~a~RQbM1x{pq?QzpX; z-76~Nm%w~0;er~tDnSMx#iPWn$fZEbE0nM6X^?9ObWj2fofRL8cc>uo5AX zZx+(Ac5t?~gQ1p-Qp*smNYX>8t_^q-N)Y7xT71mjB;OzN1a$JWc$nRz+(HeG=u2UC zp*~&?kcD=Y+O*X-cFHyQ=o{L6MExb&xxg{s!D4T=3l;OmwnKJG&S5*{mNu3R9*!7S zu8K#POTLrE(QHfh!z0M|s3g0xvr-vzNoAC;ay08H*1okIxbyI?C7K?7=+ALw{aWbp z_A$&U-`Od?Lf;@~B`6i^C9py0uR&q{`2ySJxScW{USNZ2(Y_6PHrnH)@IGYiGpugP z_jiwzc1ksPk=`fJna_pLU(ACdul2zF1Rtj9We9M__{JE=*bG3O2ZU9&7^=7`Rbo7q zDo9@?+PB2Jfa_rJc2vAmofL2A?;Ylz?_({y6C2Yak8gjmQyLaY^~w5&3)&QY1Z$GO zr2umk{m$1m6^Kfp(ederqbA*8qRu$h_MG7K2x}O;uc!w$CwXE{!n~AHHYZVEe)F-N((fNT zrH|Iv2I6{%#QU&0(4E<6GzW@uJpd*OJL52s2OBe<=o=pB8yGt&{zdYbxd80v277Bh zU*dX~#QR`>8f2)eV8$r&ED#n!S>JBzV6XIWu~!<3xzjq9%g^-(fobMyuWYsIWv>La z^S8+3 zxeM(DX~$rlyAA@^$V-xGqi?N8yqmYZwV(2}y!<>!?UxM9a(FQpskq(;*we0MD>Prj z-3*Ew#yw|8KFJ{|>`zrofJ|$j79tCng z`o6Kfva_kZ@!}=a3zaz7>GJ6%cK;K-hdj z-m z;%>_EydIbyG`@nD+bi|qMf#xnv=0wJo>i2 zD=Pu1zUVhTO2A3)vif0d=B~J=@HWF1QV9xiQL4rT;XF1_scP`$wtN(qmyUP?vo~GX z+Q6^bxrjL^z(H}&;&v3(H_MyJcPl3!BG}o`vnbUCd2+TW%Nu9R)Zc>Yzy?h9$6Vm2 z_}_9Xs~>9rt-Sr|+=I{Mo|wx$Fqh+eItz0-&Y&wNI4PdD%G=hg|B%gn^2u;RbGtLj; zzDmul*1cp@P#vsU33Q%U8Mc$J;&sx^LhZxqgJh;cW*lUays|UAD84`SQG#QwCAUxrC119a}d&Lg~Ozgg})A}ECJEmTvg-YReVP#utbc7A~I?7x+t zAnCyCI9%4| zR_*-D$$D-{<7lnPLHP@Qkv2aC)x_B`H(4>_STi2PL>;nJiuxC_DB7 ztn73ykczbmd#?c0M?ebpc_cHg3dW1S5_FR7^68#Z6gxvm#XJ>PHc#=f;8T7NuoeBC z_67SfHXyqiWLJaiYAFb(ahd9cy$JST7+2Ok81^IO&a_i-rtML-Uhs3f0XVnoW%Jz5 zj0J*YUIr%0CdOjL%m8MhO-v59=gh`!C*&y9qSm2Ovr;Sq(h4*7W^yA9t z$G%FnlWYyp#)4|<& z*1YN%cR1H&`~9E>ZXJWd0~G)E-Y4BlT#Kxys#tOuXIT>71 zwJ5NlN8E?ephB2!J*=cuho`xcs6Ku)!p3RwMA<#;=o%%#MO6#LNu1bIe)PDK z()RC4$^+;^GzEMDXw{p}kdC}@Z`cFlTi7n=5cem1SHu(5=Y8AYs62olg?OSay1ipn zJ4dB4JjD|=IN2*s?dWa+`Z?J_x5~AQb?>{^!BP1G{&l1yO8n?b;BRSqvNN4>=b%;_ zn(8Uj(NQ_)g#2(_1nR=hWXjr3lrPNLQCSPm)*(=CYgR^o^hICvQG&LXw>9UuI4Uu& zm=kVuJ=lH77+N2^VdIzGb>M41)|0K}*M37iH>F;9b)_Emu~kdhx|+}K8=z0x+<#&2 z<7=4qyaUFu3!NumFB6c$?_7wotigSUJopIcM${*;k`g%FkIP4W3*0}5t69ZSnW2@z zhxS7lzrh&4!O^VmTLg9paOv<{1eV%2y6nD$8MomEzTzv_-kNBDZsnJDYCu*pQ3*COnm z7Ejbr+ZFfNJe1mD<;E2DQ7%f&wbe@aY*X3dYxaqv`#&zsCiX)cVehcDyiH8~tY2+M zWf1Ixp2*(}YH-0>ZCIsHwg-hCVz0yZ132Hz!u?g+x9mqB!(17F`7>ZE_ANDBl^Xl2 zV9(``J(r(SYv77B%U|H9rF?N9q-j;{xN zUEu2gZ?x{^N}xY0cWNE%18ZR)Xv7*+L-C{jTh~LWo7z&T8`naq8~&nF7x!_?c8D17 zAce z+PyaJtp+RB`-GGa+oyRmyPmC=*ehG@q7>~s2+u(TrW#=<*Tf#82JTS?D?a&UeX!XK zN97>=1Tk)&fp3%Us1(8rJX@P!JNcc|?r}1mJQa_vj?fS~YBoM!NAWyF44#KTAIA6= zdv;6tb3~kZ;2hC~>JW38IExWuV&O7J|VE}>E+9@@DgGHJkIT56*-AW_eq@Ld)7E@?%FO z0e+ci7k0LQcTM9wLexc*O^!+w{O=mZ;B7~?O6b4Q@&0DW&eiEib7~6Ci~dC!_iaJm zpOsJlZ_-Wq9QJlz`E<6*KQ-S`Sr7lT@+a(#8J5mFR(!`(mML8eLcfS zdt0`O5#J?#nmqs0j!I{EA+Mr-IN*$<@-DpShfkAv;VkT&?Q%!%+<;WvYr;KTx=-#_2fGLK4Z?%~>H@p}#)w30EDJY48>0{UPGEJSDyeao3&_|NXCy_{~zq z@{@`kmDk{{`B$drIi9?CO6_yyH|&#sFT--%g`Q>M_auGjIg=EtMP%Lk%)f>?^tz)m zM$|v;JJ?wXo}~z*yQXF1cgdfQ%653`*kE&I`Lmt=C0MiItvXY_(auHs=UXb>bX5Ao zTl4kC8Bo@fwgHvx#aoU_joX-mgpL)gA*X=(2VUq`c7FKe^MOA8IIqP#MbGznSv<{R zOkKL?sN8@r5_wtc17}CN`uOC&qvBawmLH!}p1dEs512ZCN%I8L|4G~_U|K&Y!?F7m zuz7u+qQlrnm{Z`bWoFM0;w%@oak=LQX>9ZI@@K}RxwgsQj>=GYF*gP^b%A}oAN#I- z*mvzJcm7^PXM27)&&BzgAM9XpKa$#s&p*=h8@l^;S1|`{a&}TWius?N?L9HS6^OP7 zc5zZR!dvkb*mORwPRbDYVL~pO$M7r*<{*E}LGnD-!re*f>LFp--W~gEvafXav#3lz zdpap&yquI7n(Uw&7*ko&IkEN}To+*Z{Eg>Tai5)@57N&k+k%~x!|>}gS^VAw?s11X zK7pN93wtSe>+^H0u53RaLu<=vU`Nz;Qub@IU&ZxYiGP}%M(NK0n^dPP{bXD(mU!!P zu~?tP{Z4)PUajY(OojiqIv)ZywtiWjBXK=N;-97SVPMS-%F>U+_3ILkV&VM3PH{54 z%j|t>Px3*{aLyf9O{p1E74}RJ>>0@(!2VL~V|_gB6wfeMHdj&|l{R%!f}eM?K0Dh2 z*RQ}^pSRUL2T5t}ApSA@6|G(TLYoogOgeL^+}<-wkF$!1F& zvi=}hNs?%*RjXD_ts2s{wp&}RZSL-}2uWC3?3*HlAq-&>l3@~3$y5?WlaP!iAr*e_ z^E~Hnck8b5dtR^i{XFM+&j0`CJm;L7L?MvnKwfs4u*;@}6&k(c)8x4g#2zU2<#!o(q?5gF*W+84&?v5MxHryg zAj+Y-E~zKn7u?)HM1fDA6Yg<=!%aR9wd0)ec24dWj2I7#izYFo7jruN_-z!*jkzqW* z*pqh4qTTX;XRj%uP51Rdq}j-O8i+#JD9u8zqw_`B&fA!W$R{oC5<&g$tffb5%-Vcy zfndJg{sv&%@xKOQ0+`HEcadxUjk$&&B7M5r+gjGUvwHbYSX};M~ z>R^bG=A|DFED&KEZ^sXJk+w6p&fH1 zZK)qySFimj!XNg#_zt{l&$~9&?@Hu5dmlu5;=7G-Wjpn#eD18PXWk9_n~zuP>RB^& z4)Y|;@m2Y+*q3z`(Jb0_@+*&hop0yO}>*uy#%vPcw}FeHDT1d z9r>=)u{rDEs>^98^F_>Yv5vz2*6s<(ZYb*~uW#)cb#|RTtQ8a_n!o_^nw0jMzYVx` zSrc*DI$c~;%$lkdrs$SWyPn7V0P8v$9Wf*9H3<348|AT>sVv+8dlW7r#+Z;9UczYYFxctm~y!cJQsVUhEd3sC!{9FN)Q zz?mDQgVsJsv`5{F?-cg9#S<#CgEJRPd^KQwOF*@>Z@;ovO1>Yo&0`$}=Q}mf&OKFK z*WdIXd*rh}FOP9o8hf0kVaMN`+Z`Nnb!76ge!Aj^%EcDn2M+wL>7Zm+q_%hYpT@^-5F)@y$g_O1V+uC7_PlI_fa z=1}isGe11@l=)$-7Jn}f5=U1!dvE(Z!@kQ0gT&rP9QB2$qvZGbD?`PF`6orsyuU?w z+CS{ab?IT+KU&>y4YDpSX^MYk{vxfNH7nG++iR~`Ns?({mp#5m?dP8L)lEqE1{=7y z^GxmMa!;IQ?_s1akLNov?LO=9<@adj>nWGh>h@sKA80S6tkVMbOYCpsT6^YYz2pu0 zrS0QgN+sXCVa{q7DE6yIynWSgS zU!47_*CXZii&ATH%{6=NTCvwoex=alH;;b3_%;$QYGO_H$#8$Xv#&U8tz+*z?Co%` zV{c!iyslMhfBkVv|5Efv-t6d~gp`-l&inQ^5WjtEzJ;{CFsNGx@A>%eJkjLbhFW*w z>@f?&XrS=USMGE<86?UEIPM%m%Il)b9JRB@g*APBYnQc9_Ca-_Kh=@+ZA%=={nauK zOO%~&aVV>%>6WMLUSii`g%$k*oPQ5W-r>vaEUR^Cnlix~ZIf`KD+qM_`LRe^D ztv*k#&uY(dqhq*j2Mas?y?8=zu*j0p-S8J7bYlo3>Jz=!#Mfy?pUTFHHp|VYr^Kaw< z-#HBB%I+c9oqvgA_j;tf&h780L%YyN=i70|_?G0u79wQ3GaoGdCSG&WKOXZ7nRArs zU51p`Xk}k$YnQ#3PUbuID%$ZJq0CLkT+zjjxfaS?nzAR5f0Hm*(#O%iA1SZleU(4M z_|H?mU$$rL#d!=B4a#fcuu!=-=U>)5@G)EZ^C(hYi@~qMjAhE~ zLzvyv+cE3D$T9mJQrhL5feO)#FVe*a=)fpH`-V2m1M2QIrKT3sy>3&B}8;tp^LWpd`rzU=~r3KK9n`Y7k!kT z)K#s#wdY=|`*=<0;}d>gU*5^<)JycueQT~l<^EpswXdDYR`GBT@zAE76Yj5(@@m32 zKReCrcwqgGr%pWB;c3ZOi*>=Y>8u6 zJW^h-Dz$yy!g%Lgh6wbpQgy{4)z1Cxt2^wu6}hgJ^1Z!gZpGOL%N|(jqt<<^pC>u% zj0ppM4moGzwExapc_)uIk^NOWk0&XAeuF>d^(%7s&rbZu{$f883z5?2%a!_3q#bwd zSkJ$pb(OtZ#n~0bE@|}I-zw^?{gms^LmP_F+Wj79{g~YUzVS-Y)q4f&GzPIwV}Nj0 zz&Pzn3648$x13*UCPK)QvMd!UzZ)kUzqe5GT;zcJ9X~EY%IgQD3`4gEgrMmX%^5_? zF!-l?8TJiY<~)BGDX%q3?XRy2ecq*xzH+3zzEf)dGc>~9aPq)d<*%tqW+GGn=a^rQ zl-FlS>AxS9x-<4ke_pKYkM-H_mrvuA{e!S?ccEk7rONzRq#eEhZOVLQZa(IUy^g-0 zk@D)4tIV~O`^M#WpxS$<uB zabnl=HD?_)Ti;NWE_UAifRxv9rFP0oO?w=PUTMd_xF4v4QKH7+b3B_^Wse>ZavBm z3zQ$0B4t^40?E)$Y(OR)cI>+yDX#~R(!Z}%IpyX+ zH|%!D?7c{7*69zZ^D#WCKVYA!z}`;6;lIB#G%SezhO_pEK3lompKaH@%AKEaCuD?U zZ!eYqV^#jIudJ8(%ui3Im@x1kAN_(wSYN+BQ+N~R26VY zqlc9`<;D10wSUM>WlsFHc-M)~p-6d`pwx*-I}g}xbgeyN_L_IQd@^U5}D?4 z%Dry5Bki~ZS-=KUd7pf_M&sGmYg_kL1p|1ofhvL_w$@|ug3dKV#Oz49PZ))j9c*Qt79H&WIc zUnAwaN~F|#94XD3%KawFKQ(&@ocR>rzIA8rfI7l&9AKZbWY2;5)^pnHwX47T){G0C zZxx#SwnhH5&wKGWr{UCBcT^D8Rp&Z!(j**@a&aXN*fd{?Diq~GstwG3*+Z_M?j+B@2iBqP+ zk@D(^l;LsuZtS05!?#$zUvyyIejCQle80+$<}AxX?7k8GQtw#oEn4lE>+phOPX$uG zbH-rKej4VO>@irG@>de(cB(P;*ykK`!=G2?0)(dubCL6%_tzukbt_Wdtx)QfNZZ|R zA@muW(r1)=2G~D4zGgk4%yVJyG!zR}e|Z~HUW>XpW|tx5wO^^7I*|F5_}cLshaItH zj+q5Wc@-&jsGY8IuQFqPPt8giyN$wJiOVtf3sPRK8!CU>a~_R_+($0;mY`RLXEkvZ zH{OZw8<6t4Xo915{KvN#%CtP+)HfGZq0GLG*_DQ4|5(#;FAZtOlU?RRs?9VjbKEP( zjJzt4dyhNrTzbNOB+`-6mY0;e3@PpMA9qAzPg~YAHCdomv(T@S;gQdMm$XBczxXju z`76H0Ip6sRZp!gSB>1krlu-GsGSqP^sk!rJ5mLG>&B*Itq_j62{qh=&l8=7e=R?-nk1;$t;ZUfY%0*&n06(ROZdRNt8*&@1h~9s8>mIA+ed z-7zx;Dc{vKlZ2UUrS}1(ygpXywwE;S)`N2c&SlMl+}AGW3!0uwji>go+VvdfWpR^s zKa0D|E^+R^M#}4n{>t5s@_UT4kG0l3Gv=k)H!*7}vwfA>45hB`n^2W9`!Qyx%yiQC zJ*2!!XF2LX->1Sh@PBqQocCdAj{f(N(jRtR;nauKr$Ng67>618{#)FVvW3oB`vaY@ zO}X55QfxrVcN>w?*4~3u*!f;_9%pTKYbZvc zU%ImZdk)Ta?Af2`*wZu1FaFhcJOA-}B<4G0IC^GcR$lX!9ks^^HRlx7J;OR1JN)Y- zTip$NiKkk#;i@i{?|qkaQHP50wde3WOhUJCO#{(TiGuSvO%Isqv!w^BBpeCo2}PP!?_AyTHs2lMNw<(N=D8^kjiQeQi_*gQ3EzvP*WTYr6r@NeBT z7^w8gxIw#peThCNW}LDkANt+aH|D!Y2;W8IUQp-k zb@|SBN&iX~POLpY*#|pi{A8;#_6Aa3d$OJUBHzpFN~C<_KhBT9ei^Q5yepmTgmEuY zUSks+wZHx(rQeJGiX7*CBd?=B6e;a;&RA(dn?k$7Hy;19Qk?d$rjK5TebK7VJsT;n zBBidYw@kUc7`NBWcf$4!QeMHgIcmFY=KGNSke^k*Iqx@3a`L0^xs)>9D|o&x;na5` z%;}5C@JPLFVC6B#E~)liQzD(ao|8|tL)st7^Fa3Z3}FAJakz`UxB>*{a@bKepLM9gcBuU>X@Ada1Bbz9e;n@vU2#dZ?U(gb`NUIowh5r`SRH-RANc|N zA)l87crIP>`EPeU{`0-Bs^@)DfOK9lN!naoIZZCc^~Ks3y{83JhgR7`-{(D ze|bIjM+ESH`JJcQA9UU6{U5>mKv!X%{3Fx1+5NS3O8=*w!T!Sf><^GHGESaq|E4q8 zUsaF&Ox=PLp{mwxn>@3MNr z=X<~V4DYMzd0!l$eC09s<9|tirzM>l9;wIYej)GuuPQ%vrk8ikYWms!`sDql>5kdm zN*+}5xROm~IPb%i9H``2C6koQRPsh87b{t$|z$yG|OQ*x7%yOgX{(lyI*r-PCaN=7Rgr(~*< z9wqaYd{oI2CCilDreuYZl}i4jWb+Ki-Cjx#S8|e)8A{%$?6O6u8;yDgRM zuH*nEM=6=Aq({kHlw7Q2k&-VeS*qk_CHE^?rQ}H^L#}t+Z>MB;B_oxLQ*xS;*-9=@ zvPj7iCEr$ZtCC+U`HPamqr$6XS0(!@Ib6vEB{P&PP_jtL5+%!&ELU>BlD{ZsspO+dmMFPd$pcFMqhu3VkIVW|$^J^lC^=P0TN6LOh+&y2S*h;0 ztn^H;+atD!Xt%$5tua11J;yyPFU6hhP0z|?m!~=2n-P~1pEW!^!yV&JPQ_GPeT3UP zCMz{J!!4hVO`h$J;v4m;PnlKeRP!_@IWslG&9hkfEY6da5|x_japy3n(pejpmu^3j z%6`^lPrBE(Tg;MrCwNmG!$NG)P!G-Zc-)!Z_%sh58kx%85N&uy&IGr2QgTMFTU;Ym zXmeCcY!g|tXXAWqdL|wysPiOB{G^Y}O!uZIXQbcg9*W!PDajcV+$k~&qB2t_WT$5i z&C1R6itWT#hTB_LkGR~3btlg`<*_(Id=t-gtR%hc@H+mNU#f;?WaYS35QAihW0P~d z!#tiW`t7aF@$Q`5*>0ciwPGm2_ExK}mZ2T)al6HQlPK^rx%rg1Vnv129hH%hl_JDQ zZFqWS>R5N4S0-bWxXe}$Pxs{54~FHDs{QO|w*SQFTKXr8fpzthwoPr{XU&i?80|@) z<0f@?NPk49=ggA6oRFQIf?F40Hp3mCPPnor%+2w-XUlsb&i8vBn}sDlZDP6%ogF7+ zJ#?0t6EfWHY|&o~kwR2TSL}dzy`J=Gxn6e;{?Cx6PI;PY+m$&d-IJ9$o18Q$*^{0; zO~%1Szc`Cd_mBs&Jae(<8fil1JOAhJ2hvYGTpLI~&;PZ3nVXRjm+VbbCFe`|%#N)1 zx!L5;5B=jV@%c@yP!k~gM2a@mH+!MYS|nmcB=eqM~L{<_KQsV z>KMa^?t0>8vdEHeYR4t|b(!MB{X)dE+v@sN+FR|{$--6Fue|@<&u^2(_tI~&QWz?$ zD<=|Ib7DfBvvWclr~c9N+UKanbJPZlWeD6nkKWJQj6l+ z`f>X`V>~s93>x`JMCWE_kbk|t68XWY=^^IZ^-^`ljmnXR?JWG5d?W9!$;xz(%$%O( znVsy^r4603L8f-{dYCmiJ=HxlE!h*FH6}O1n?7W&*DdmVv21IKAtZjKz^RArH(Sh_ za^v?{+%C=Ah8$NuGvobg!(CE^2B&U3LcK@*L~St3of?;wO>O0wJ0Uhbhk5N^{of7G z$jwP}UKANu<+?p{qiG@3li&Px#-Y*Anm1KkOTTz9NcAjAPkCm)6?;?;sL|^@pJC_7 zIh0c&?oeijNhK+_*_?1gx;G^)KFe1>zHLrOpOKlI;bab~Z<%GpUNhb^7k`~v89(Ht zSIR7>iWeu$N$DPME;Wy=Q&-EkliZ#hnu1|@lf~20FOE}jp7bo*in-#L&xER1n>p!h z*MTZeW_fDmgd3#}C;8-aF-EF=*?0Q%bQ+_%W0G@b3Gt85Zr*xjW*3jt_#nz(>tVk( z%uXrUTC-zyJS|poj(dW8c5-%FmWTL%QN>~PBjVBJD_M3%%=VQnS$oSIqe8Y*-rMoA zT>7|9JVg1II$5fm8hTisC@{w5db4xA(e7!vGbT_yXU^b#x__x8p=5FQrDA(&zthKX z+C@tBiW)a%#=viz$T8SBga(ngN;j%YQGAxKXz?GTGOlemo$6KO+2uLTj`>V^A2l?N zIz#FkH*Ac&4>3mOP(spE?b;`KhFg3r^+i)BQ29`v@y$xxH~6Fa$tSh-5W+`m>)}af z*`JEd%9@p%Jv=wl?qS%ag*_+o&BV+bXp)Js9XiRE?L_Y-V)X~?~z!d6XA&LIAaYjWlUZ*t145xL2pWQrVyELEm#huMQEbvo&)O5Jf8cXl00 z6DVfN@L&h!Fk5>|J8}ySA=DGVEh>XHRo`#!dHsWmkDQ;>}ZRo-8hQddy1qWbv-Q z9&%l>ba_~2>bU7L2tr&X-B9(7%xA2~lI_ea=k2%V#7x;FII8`q(&#&9xXG7lT)-PS zd=Rfld+U9zQ;O{JIm7LVqoXe?@a{5~tIXhJcD@YBXG4>-y}2GYLGaQc72C{sw`X>G zCRtATldu1N@i)}#$#7ENBSK_o>=w^%Zwc=VyJi_y)4_Aff6ip_jZE7>FIXdBXU;gc z$8NGSQ}7FYeu87WcWsILd4$Gl&{mQk6jZiG~}h6 zyCf-QjJI$J--MnH=6~inXR{e|%MimH=_hqQ7P|I~va$Qxz ze$8G#6thed@>^*!-(cfFes>H*?jRC{<45uhAGQ+OlhAJn>m^_%Y=za>y%!d;5MnLFj-ZZ!O71&guH|snUcdop zDc>Pi%V(JJO7P1nSj)Qu&_UV(J@at~_m)9%By*-9*Ph9>YHjW%JlI_cCwblrJ?n_G z5*b&}2D2Hrb5GpJbtr9EA1J@+`Uo1#n!}6v_QW%JFZBqkXZ!$#=-&v^zI7uTh*D(Sb()Aj zhc@sc!p2@qxmU0Q-y$>kU~-ga%O2E3!@HK)QAW6nkUJwtn_rkN#;rl?&!o3d2t>|CI^HSC#?j+83-U`SA(1E;G z0w*P@#Nk{`QKo=6|Dcevc(8n~?{5qtA_>ZXz$T?|1;~fsdZ&P$ccd zZYlGSdDvM6gKi_gVKx=Ba($#+pL8%uv)6@0;8sh*5{{G%Lf`xg@E`t7BcDf-p4qtF z<{?ci#9m1xcE@37EbdFh*P5u}YV^J4Dhf2CI-%c0l5CI+!KBOe(7G-;wGX8@J3Z*eQ{2cb`Jj_V*O0S^tE36Y2xp%QdfZt(;to zcZ_nmk-Q`c|BE$otkW+>M*MDxSg71e-rQ!1=k zL}L!hxsTyL){X`>5NjvtB0>J&T4$Z|MH+H`Xg=pO4&ZFYDX1l3oRL$3od-CdB<3?i zEQ2&i_`(nckbfC_#YR!z4s0X_p(hqLLd%wzNA83UkOA``AC|#dkan8rJBmy|u7;Jc z6?Q`}p09#Z?nTE2BJ$xzqN)So#Gn0ea~XL@rd#wQjl@y%;3hZ!`4)yBM>h})VRcvR zgEYc81wZE@58gsqx|K7W+qgsw=87W?QBL?)p+8~_aX;G-^ElhQif04HHW1!;T~toM ze>XM~m4&Q<{vZDhf!svhlh1v^edM)eF3}RQ8xwxaZ2Hm=WyDPo>2_?dA*%KmLi8n0 zpt6rc1+}I}s0)@H6a&1ni2jg2Za__QJbeA{zB7&Nj}bT!^1JPl_{( zgC^>tC;!hr1%3HYfM1Ut=DoxfBuXBo%Vo%I&W0aEp2;^w9u#pVS2+~iNVw(_rz?rShl$r>()X|_ z;=!v^cA$c@_SQlEv!+-FD@skV2~5r{6F2c+r?8hi7=${FGmBUMPM+lq)_LC;Vs(Wf z29f`~?FnB;@&oA+@h9gWqyOMC^3Zbr@AiKFhZxp9po>DzV`%xXF2W&#xQZY>g1#Z$ zD##c6$nReR>Sp{mbiYlyDEo-K_c8Ie1AC6SMABcZRYx6nC3*&v??>ojVH9N|8uuf0 zkrzWb7()CGBR>ao#s!Goq{(- zpU5Y?+e?~w`_T44hc3Dpa2UOC0IGh)9SHiKczuj`SxbGuIr>#4)Rp|F@<#sachNoc}3(%n)1250MWVV*YCK;4%F67vY5i+%H7V<9~>&;J~+r7_gtRLU}(> zV2H}exVMC|ja+tud`z#q?VlNw8GUu45EIGM{fZv<35IWL7O-` zlrzQ;R8V&#E5C7xqA8>mWL!%;U7?FXkCHA4*w1}J3)~-SipcBmPZ(i&&Jb(=)kW&} zF0m5xE07i6k&kh^N+T?{5jMg)Xq6#S32Vf1+I}d6g|H5GLQmqqh_jDNE+Nhb;Lbqe z8uyCHOIsV_Py8B2o3sK-;UHlwmsaF+WIrf`Y{=u;6bND;O9B7ExSIPysDOYJ%|}(irvUf$ONe5eIZnK zFvUrv*$K&go6eZ!{#Y39azCGU;jp$V{_BDrJnIQ-xetO2@^cZSZ6_|uiHlDRv1yAT zOzO2|yD7U!UmLKHc-qLbaGtG2wnQF99)MM_6IN^^e*2OBmr|ZCBi~+5S!&IGv$pKb zYR_3fqsawc5q<<1_72sACZpB^0`Jy1GOPA#l&Kpdz>|DZ5_^bG@*iGE8f=UPq zr>>eqJ(tTf^c8a-@;-IYM)J}JA*T6qASIhm#(| zOp%I=?q-U#5u`cy1u^6q?w5@u?YUnGg*`~yQP{(?ywRj7_bbPkBA@$ZW6{TbHvWi& zX5-Muvw2sM2VekH@T}zoQbai2O7ySZOD3HP~QI~hB<--t}@MZUZm z^V}b}#uR(GZ!^UdN4f8bJkT5eUWfm=Ux_U0L;jeGecYEO;s@?SlCgvPUeow5Lhc74 z=l8=bG6B|ce$Y{5&~(DZeFb4y2j%!V4A#xSP5BPFsXu;5!z}mZ>7)twJ7;2s``xp6 z&iz4T;bpixn>@{ZcqZ<0pPxm!^a7N)K5X2^HWOwRP`@)+CThX#a*;dsKXziA3>deurYa*U+Dy*yNT6SIj5aI&bMm4=K5j(WfCA_TEvZL0^1lZr#BgTud|1~QbM%3a@hrOu z^$vCvd_rCi^TvOO2XPMLln%HF`LGvu zccI?wN*RU(2%FYGoW$LENI_p(F_ZV$Y5oHbXAE!U}1bwAdwBJur4yQK|VKeBT;6?~x8~`i0uk1+t z@gL;}r&3ljscTXojXX!&9JiWuT|`|@x<)6FAJRF~d=~9N15spLn)_1hiJeYem5iHkl)h;G-GpT^>GUh{e~hsH zMVNo54MXNZ^dIDfH!RT%1gz%l%azEU^b?PDHpG0=XyLi&Cw|sK8mtT_F1r!G^tX#H zZzQ6HJS&0l^DLisyu)hpFa4=i*k1xYPv8cuK1sa%O?vTe?+Vg{`f)4mV*%}B9_?cU z>U`?UQtHb#gJ?H1sEc91MdX`r$%C}(YdKqWEA8?Ch|HmHM%wgijk(Wh+aJciFB&55 zL+aB~%F`E=`%Sbz2Pj|MuRctj!Tl=wg$Y%hnbpJ+Yq>AK1i$sipKy}<`InM!2jC`h zHSFa-&eQr4cW{jRgv$)!g+f>ju~EE-g-`@52amugE4a@@ivUS zF_gH%jSi^ep^bdcIAHG(+~HjbdQ;K265>$rMy3uY-r*?sI|+L%B&4JN5Hj9F@~mPb zV^Z!*J|J(s&p0}hF$v^lQFdT26dKgY4XMAO!bKg|nEI;;5_QjD(tu~1KC;9rSO$@j z&DixCcD%~}TE9;Ga32&({o9mwE2^Pb*_}3*I;-+!%JCZ7w^wNE){;-4_*KSZ>quvq zPdpr;tS4PX9K_Pc8%zEfP1zdHxNZ#n*f{!FBguD=KMMC?Pz-f}jGsJRtbk*4sKdI^ z4}$~5Ps6>KNj$R~dCm9`zD?PS=eg9w(AVCXu(HnER4>_!W9Bq0XACi=rJa zk%TPd{Yh9cpMC^qqOV3)yi31u1NnD7ebG0`v!(bMO5UO``Zng@#m~^|PWpl{2-;wgvv@B;cny*bZ@Lm~%V%)YnFgT#Ts z>=|dwzV|EgV;}k=FmDn0YBB!(g)%^YeZY_)5kHi%Nd@J4ALV*3@zga$#PtXf8N-4^ z(x@Qey_@>7F?Ay6SSFnxA`(o-D&LUa^kud}!gq{WkZX}~^y$mC5Z0}PV@!~U9?N)f z9Daub-;;(A{{wCKLBjnp_3}3C_>?%?P8?Jczl?JZE^&!@KVu)1#&O2yFS^KPe6zBO z`r`=cag_K!MjQJVb^Hn9`XqWm`azD7(a4m(pt{QFX*FLhBqeT1Z@)LZlg$|0=DH(;|$AyTk6FHaY zTKfC6yBY1V-ylC;$GK71S<;dC?1cX|@;rs|j9&}i=NWBe8P8UvQXY9$jNX|0i5uC5 zen4IMA>|$Yg7B4XLb{1_)O%?s=Ov?_Mp=OH-$=LV=$U~Xzf&LmK^jtb9t<-?QaI@d zyPqLXBn63{)7g_hGf0%pCLi@CZ7w1$dy&o;kiIAI8*NizPe^f`tbA_h9JbFbiE+)U$HI{t$SXhWSHgbbTWI{_=?T>dQD z2dIFp8Q43UaDf-KnT7ojqcdiM0onKgDopBU~61RjHr z;cw{iTCj+NIdDI`20P$5bbLKn42G$2FO(0yI77zYdCRoDSXq4gWV;!?N@Zi2_* zb7;68d*FI_4)#IQH-p9HkOR-aXYemvUdl6A4d1{8Z($Br!?zInHhLfx7Qy@QH(dBm zu(%o)!t3xooLh!ID1xt{%e%p10^A0xVF#RmOEv_H40sWKhI8Hv79$`N3gKDU2tPxk zjhw>KFd zAC5rKCj12bApstOJ<$H6U@-$$z()818g3?iU@GLpW@xk}Sd4`g@HQNTMq7i$m2e&0 z0q?>0(EMZ45AKH7;VAUkMtEQ|`~~el2^QDD!>|Y1mXjZ#06u~SpAvs?GrS8&pvU%L zF$D@>4g3gQcHn<_681s(&R~%Yk3j`=_zZWT5IzFeF7h^UWCs;`;!0SfKhNC?1pxGC^v9FybXt;!`@&q2qr@gJPsegA!z(nuowu} z!kthI```~~_jRyHgeTxN*bP+>x-VD^fN`)Gw!(gBU4eff8r<+Ad{uV#OOjrS%U_V#~f<+W0Ll)cu_reqK8f=8mp#pw_Kj0*E z_%2wS4_Cklm;fm-2kwPcuokw!KKKioeNSG80Wb=#gKWr$r(h#|4M#x#0sYV!E`otD z0w%#Um;(jyD7*|Gz#jM)Tn9-DXbS^j6ifvVEQI^vId~P`g{`m)zJsIi4}|8;ygR(0sSEcCPNx{;8s`yE8rPe18>2HP!3NX4!8%NfEQpLybqti zm+&q80)K()Fl7@uK{vP%`oT~b4HF>|W`P%Og?zXV9)eX+0;RAScEJJo8IFNbMVv!B z=nj413K$Nf;VQTmk|7;#fCX?btbj*g6+92Gz?-lUw!jY90|(#`90BcD@-#GucF-02 zz~wLsCc<@)4tX#i?uHdm46nlb@F`S4C7b}`2=+ot=mg!MHw=Ji7y}8A0@-jg+y(c; zo0T2V@AOWU9Cgj0FSOWLMV^9ohpcLMNEwBT= zg74rk90UDN{108=a+nIU!2>r#J`}>kunJy+_3%FIfUn^Y90T(heuhra3oe5gm;gyI z8|J|xSOHH$36#QS*aZim3jTrMzX(5sLtnTOVj%&h!}V|rEQ0&tF?bGMfw$p9*bZMq zB^(3Sar_8j&x(M1scjyaO!YG&o z(;yRWggap=JObkK2Eb5=gR3DGWIS; z2G+wy_!xFW1ssASa1vZPVSrB13;M$l7z5Y9G{}HCumB2RIXnu_LJ5?@CMbt5;Q;&s zzk@Iuu@0E?^`IS`4}D=E41pLJ2UkN1WWh~v2Nb|V@C2-eHLxB&f^zr*_CY250j5b< zpe=+!cjyiMU=R$2(GU-bkPf+U8{7*I!85QH-h*wh2M)tO5MuHFD$oP^!c{O6Zif3| zHLQmXuob?5{qPg~3I9Nli@1QU&>IFq3|s|MU

MRw#f6p%~V{+prmS!#+3&Rqz++ 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 sJj4!(*Dg7lS!`!S5s?1gHEhT%kFW;e8 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

    e_@tuwah(y6KH-I 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

    H-$VJ!mES|2vc5FZue)78KNZUF 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


    J2Z2b8cr0DclV&CHryl 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 C)2@L4 literal 0 HcmV?d00001 diff --git a/externe_kniznice/64bit_dll/zlib1.dll b/externe_kniznice/64bit_dll/zlib1.dll new file mode 100644 index 0000000000000000000000000000000000000000..bc7d15559d9bff6cefd17f44a03ef692723f6400 GIT binary patch literal 88888 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

    %dT8#&n9#M4$?9@Y?VN*Gm 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. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/externe_kniznice/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs b/externe_kniznice/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs new file mode 100644 index 0000000..b110dae --- /dev/null +++ b/externe_kniznice/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs @@ -0,0 +1,202 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Runtime.InteropServices; +using System.Text; + + +namespace DotZLib +{ + #region ChecksumGeneratorBase + ///

    + /// Implements the common functionality needed for all s + /// + /// + public abstract class ChecksumGeneratorBase : ChecksumGenerator + { + /// + /// The value of the current checksum + /// + protected uint _current; + + /// + /// Initializes a new instance of the checksum generator base - the current checksum is + /// set to zero + /// + public ChecksumGeneratorBase() + { + _current = 0; + } + + /// + /// Initializes a new instance of the checksum generator basewith a specified value + /// + /// The value to set the current checksum to + public ChecksumGeneratorBase(uint initialValue) + { + _current = initialValue; + } + + /// + /// Resets the current checksum to zero + /// + public void Reset() { _current = 0; } + + /// + /// Gets the current checksum value + /// + public uint Value { get { return _current; } } + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + /// All the other Update methods are implmeneted in terms of this one. + /// This is therefore the only method a derived class has to implement + public abstract void Update(byte[] data, int offset, int count); + + /// + /// Updates the current checksum with an array of bytes. + /// + /// The data to update the checksum with + public void Update(byte[] data) + { + Update(data, 0, data.Length); + } + + /// + /// Updates the current checksum with the data from a string + /// + /// The string to update the checksum with + /// The characters in the string are converted by the UTF-8 encoding + public void Update(string data) + { + Update(Encoding.UTF8.GetBytes(data)); + } + + /// + /// Updates the current checksum with the data from a string, using a specific encoding + /// + /// The string to update the checksum with + /// The encoding to use + public void Update(string data, Encoding encoding) + { + Update(encoding.GetBytes(data)); + } + + } + #endregion + + #region CRC32 + /// + /// Implements a CRC32 checksum generator + /// + public sealed class CRC32Checksum : ChecksumGeneratorBase + { + #region DLL imports + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern uint crc32(uint crc, int data, uint length); + + #endregion + + /// + /// Initializes a new instance of the CRC32 checksum generator + /// + public CRC32Checksum() : base() {} + + /// + /// Initializes a new instance of the CRC32 checksum generator with a specified value + /// + /// The value to set the current checksum to + public CRC32Checksum(uint initialValue) : base(initialValue) {} + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + public override void Update(byte[] data, int offset, int count) + { + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + GCHandle hData = GCHandle.Alloc(data, GCHandleType.Pinned); + try + { + _current = crc32(_current, hData.AddrOfPinnedObject().ToInt32()+offset, (uint)count); + } + finally + { + hData.Free(); + } + } + + } + #endregion + + #region Adler + /// + /// Implements a checksum generator that computes the Adler checksum on data + /// + public sealed class AdlerChecksum : ChecksumGeneratorBase + { + #region DLL imports + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern uint adler32(uint adler, int data, uint length); + + #endregion + + /// + /// Initializes a new instance of the Adler checksum generator + /// + public AdlerChecksum() : base() {} + + /// + /// Initializes a new instance of the Adler checksum generator with a specified value + /// + /// The value to set the current checksum to + public AdlerChecksum(uint initialValue) : base(initialValue) {} + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + public override void Update(byte[] data, int offset, int count) + { + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + GCHandle hData = GCHandle.Alloc(data, GCHandleType.Pinned); + try + { + _current = adler32(_current, hData.AddrOfPinnedObject().ToInt32()+offset, (uint)count); + } + finally + { + hData.Free(); + } + } + + } + #endregion + +} \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs b/externe_kniznice/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs new file mode 100644 index 0000000..9c8d601 --- /dev/null +++ b/externe_kniznice/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs @@ -0,0 +1,83 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Diagnostics; + +namespace DotZLib +{ + + /// + /// This class implements a circular buffer + /// + internal class CircularBuffer + { + #region Private data + private int _capacity; + private int _head; + private int _tail; + private int _size; + private byte[] _buffer; + #endregion + + public CircularBuffer(int capacity) + { + Debug.Assert( capacity > 0 ); + _buffer = new byte[capacity]; + _capacity = capacity; + _head = 0; + _tail = 0; + _size = 0; + } + + public int Size { get { return _size; } } + + public int Put(byte[] source, int offset, int count) + { + Debug.Assert( count > 0 ); + int trueCount = Math.Min(count, _capacity - Size); + for (int i = 0; i < trueCount; ++i) + _buffer[(_tail+i) % _capacity] = source[offset+i]; + _tail += trueCount; + _tail %= _capacity; + _size += trueCount; + return trueCount; + } + + public bool Put(byte b) + { + if (Size == _capacity) // no room + return false; + _buffer[_tail++] = b; + _tail %= _capacity; + ++_size; + return true; + } + + public int Get(byte[] destination, int offset, int count) + { + int trueCount = Math.Min(count,Size); + for (int i = 0; i < trueCount; ++i) + destination[offset + i] = _buffer[(_head+i) % _capacity]; + _head += trueCount; + _head %= _capacity; + _size -= trueCount; + return trueCount; + } + + public int Get() + { + if (Size == 0) + return -1; + + int result = (int)_buffer[_head++ % _capacity]; + --_size; + return result; + } + + } +} diff --git a/externe_kniznice/zlib/contrib/dotzlib/DotZLib/CodecBase.cs b/externe_kniznice/zlib/contrib/dotzlib/DotZLib/CodecBase.cs new file mode 100644 index 0000000..b0eb78a --- /dev/null +++ b/externe_kniznice/zlib/contrib/dotzlib/DotZLib/CodecBase.cs @@ -0,0 +1,198 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + /// + /// Implements the common functionality needed for all s + /// + public abstract class CodecBase : Codec, IDisposable + { + + #region Data members + + /// + /// Instance of the internal zlib buffer structure that is + /// passed to all functions in the zlib dll + /// + internal ZStream _ztream = new ZStream(); + + /// + /// True if the object instance has been disposed, false otherwise + /// + protected bool _isDisposed = false; + + /// + /// The size of the internal buffers + /// + protected const int kBufferSize = 16384; + + private byte[] _outBuffer = new byte[kBufferSize]; + private byte[] _inBuffer = new byte[kBufferSize]; + + private GCHandle _hInput; + private GCHandle _hOutput; + + private uint _checksum = 0; + + #endregion + + /// + /// Initializes a new instance of the CodeBase class. + /// + public CodecBase() + { + try + { + _hInput = GCHandle.Alloc(_inBuffer, GCHandleType.Pinned); + _hOutput = GCHandle.Alloc(_outBuffer, GCHandleType.Pinned); + } + catch (Exception) + { + CleanUp(false); + throw; + } + } + + + #region Codec Members + + /// + /// Occurs when more processed data are available. + /// + public event DataAvailableHandler DataAvailable; + + /// + /// Fires the event + /// + protected void OnDataAvailable() + { + if (_ztream.total_out > 0) + { + if (DataAvailable != null) + DataAvailable( _outBuffer, 0, (int)_ztream.total_out); + resetOutput(); + } + } + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// Adding data may, or may not, raise the DataAvailable event + public void Add(byte[] data) + { + Add(data,0,data.Length); + } + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + /// This must be implemented by a derived class + public abstract void Add(byte[] data, int offset, int count); + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + /// This must be implemented by a derived class + public abstract void Finish(); + + /// + /// Gets the checksum of the data that has been added so far + /// + public uint Checksum { get { return _checksum; } } + + #endregion + + #region Destructor & IDisposable stuff + + /// + /// Destroys this instance + /// + ~CodecBase() + { + CleanUp(false); + } + + /// + /// Releases any unmanaged resources and calls the method of the derived class + /// + public void Dispose() + { + CleanUp(true); + } + + /// + /// Performs any codec specific cleanup + /// + /// This must be implemented by a derived class + protected abstract void CleanUp(); + + // performs the release of the handles and calls the dereived CleanUp() + private void CleanUp(bool isDisposing) + { + if (!_isDisposed) + { + CleanUp(); + if (_hInput.IsAllocated) + _hInput.Free(); + if (_hOutput.IsAllocated) + _hOutput.Free(); + + _isDisposed = true; + } + } + + + #endregion + + #region Helper methods + + /// + /// Copies a number of bytes to the internal codec buffer - ready for proccesing + /// + /// The byte array that contains the data to copy + /// The index of the first byte to copy + /// The number of bytes to copy from data + protected void copyInput(byte[] data, int startIndex, int count) + { + Array.Copy(data, startIndex, _inBuffer,0, count); + _ztream.next_in = _hInput.AddrOfPinnedObject(); + _ztream.total_in = 0; + _ztream.avail_in = (uint)count; + + } + + /// + /// Resets the internal output buffers to a known state - ready for processing + /// + protected void resetOutput() + { + _ztream.total_out = 0; + _ztream.avail_out = kBufferSize; + _ztream.next_out = _hOutput.AddrOfPinnedObject(); + } + + /// + /// Updates the running checksum property + /// + /// The new checksum value + protected void setChecksum(uint newSum) + { + _checksum = newSum; + } + #endregion + + } +} diff --git a/externe_kniznice/zlib/contrib/dotzlib/DotZLib/Deflater.cs b/externe_kniznice/zlib/contrib/dotzlib/DotZLib/Deflater.cs new file mode 100644 index 0000000..9039f41 --- /dev/null +++ b/externe_kniznice/zlib/contrib/dotzlib/DotZLib/Deflater.cs @@ -0,0 +1,106 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + + /// + /// Implements a data compressor, using the deflate algorithm in the ZLib dll + /// + public sealed class Deflater : CodecBase + { + #region Dll imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)] + private static extern int deflateInit_(ref ZStream sz, int level, string vs, int size); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int deflate(ref ZStream sz, int flush); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int deflateReset(ref ZStream sz); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int deflateEnd(ref ZStream sz); + #endregion + + /// + /// Constructs an new instance of the Deflater + /// + /// The compression level to use for this Deflater + public Deflater(CompressLevel level) : base() + { + int retval = deflateInit_(ref _ztream, (int)level, Info.Version, Marshal.SizeOf(_ztream)); + if (retval != 0) + throw new ZLibException(retval, "Could not initialize deflater"); + + resetOutput(); + } + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + public override void Add(byte[] data, int offset, int count) + { + if (data == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + + int total = count; + int inputIndex = offset; + int err = 0; + + while (err >= 0 && inputIndex < total) + { + copyInput(data, inputIndex, Math.Min(total - inputIndex, kBufferSize)); + while (err >= 0 && _ztream.avail_in > 0) + { + err = deflate(ref _ztream, (int)FlushTypes.None); + if (err == 0) + while (_ztream.avail_out == 0) + { + OnDataAvailable(); + err = deflate(ref _ztream, (int)FlushTypes.None); + } + inputIndex += (int)_ztream.total_in; + } + } + setChecksum( _ztream.adler ); + } + + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + public override void Finish() + { + int err; + do + { + err = deflate(ref _ztream, (int)FlushTypes.Finish); + OnDataAvailable(); + } + while (err == 0); + setChecksum( _ztream.adler ); + deflateReset(ref _ztream); + resetOutput(); + } + + /// + /// Closes the internal zlib deflate stream + /// + protected override void CleanUp() { deflateEnd(ref _ztream); } + + } +} diff --git a/externe_kniznice/zlib/contrib/dotzlib/DotZLib/DotZLib.cs b/externe_kniznice/zlib/contrib/dotzlib/DotZLib/DotZLib.cs new file mode 100644 index 0000000..90c7c3b --- /dev/null +++ b/externe_kniznice/zlib/contrib/dotzlib/DotZLib/DotZLib.cs @@ -0,0 +1,288 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; + + +namespace DotZLib +{ + + #region Internal types + + /// + /// Defines constants for the various flush types used with zlib + /// + internal enum FlushTypes + { + None, Partial, Sync, Full, Finish, Block + } + + #region ZStream structure + // internal mapping of the zlib zstream structure for marshalling + [StructLayoutAttribute(LayoutKind.Sequential, Pack=4, Size=0, CharSet=CharSet.Ansi)] + internal struct ZStream + { + public IntPtr next_in; + public uint avail_in; + public uint total_in; + + public IntPtr next_out; + public uint avail_out; + public uint total_out; + + [MarshalAs(UnmanagedType.LPStr)] + string msg; + uint state; + + uint zalloc; + uint zfree; + uint opaque; + + int data_type; + public uint adler; + uint reserved; + } + + #endregion + + #endregion + + #region Public enums + /// + /// Defines constants for the available compression levels in zlib + /// + public enum CompressLevel : int + { + /// + /// The default compression level with a reasonable compromise between compression and speed + /// + Default = -1, + /// + /// No compression at all. The data are passed straight through. + /// + None = 0, + /// + /// The maximum compression rate available. + /// + Best = 9, + /// + /// The fastest available compression level. + /// + Fastest = 1 + } + #endregion + + #region Exception classes + /// + /// The exception that is thrown when an error occurs on the zlib dll + /// + public class ZLibException : ApplicationException + { + /// + /// Initializes a new instance of the class with a specified + /// error message and error code + /// + /// The zlib error code that caused the exception + /// A message that (hopefully) describes the error + public ZLibException(int errorCode, string msg) : base(String.Format("ZLib error {0} {1}", errorCode, msg)) + { + } + + /// + /// Initializes a new instance of the class with a specified + /// error code + /// + /// The zlib error code that caused the exception + public ZLibException(int errorCode) : base(String.Format("ZLib error {0}", errorCode)) + { + } + } + #endregion + + #region Interfaces + + /// + /// Declares methods and properties that enables a running checksum to be calculated + /// + public interface ChecksumGenerator + { + /// + /// Gets the current value of the checksum + /// + uint Value { get; } + + /// + /// Clears the current checksum to 0 + /// + void Reset(); + + /// + /// Updates the current checksum with an array of bytes + /// + /// The data to update the checksum with + void Update(byte[] data); + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + void Update(byte[] data, int offset, int count); + + /// + /// Updates the current checksum with the data from a string + /// + /// The string to update the checksum with + /// The characters in the string are converted by the UTF-8 encoding + void Update(string data); + + /// + /// Updates the current checksum with the data from a string, using a specific encoding + /// + /// The string to update the checksum with + /// The encoding to use + void Update(string data, Encoding encoding); + } + + + /// + /// Represents the method that will be called from a codec when new data + /// are available. + /// + /// The byte array containing the processed data + /// The index of the first processed byte in data + /// The number of processed bytes available + /// On return from this method, the data may be overwritten, so grab it while you can. + /// You cannot assume that startIndex will be zero. + /// + public delegate void DataAvailableHandler(byte[] data, int startIndex, int count); + + /// + /// Declares methods and events for implementing compressors/decompressors + /// + public interface Codec + { + /// + /// Occurs when more processed data are available. + /// + event DataAvailableHandler DataAvailable; + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// Adding data may, or may not, raise the DataAvailable event + void Add(byte[] data); + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + void Add(byte[] data, int offset, int count); + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + void Finish(); + + /// + /// Gets the checksum of the data that has been added so far + /// + uint Checksum { get; } + + + } + + #endregion + + #region Classes + /// + /// Encapsulates general information about the ZLib library + /// + public class Info + { + #region DLL imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern uint zlibCompileFlags(); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern string zlibVersion(); + #endregion + + #region Private stuff + private uint _flags; + + // helper function that unpacks a bitsize mask + private static int bitSize(uint bits) + { + switch (bits) + { + case 0: return 16; + case 1: return 32; + case 2: return 64; + } + return -1; + } + #endregion + + /// + /// Constructs an instance of the Info class. + /// + public Info() + { + _flags = zlibCompileFlags(); + } + + /// + /// True if the library is compiled with debug info + /// + public bool HasDebugInfo { get { return 0 != (_flags & 0x100); } } + + /// + /// True if the library is compiled with assembly optimizations + /// + public bool UsesAssemblyCode { get { return 0 != (_flags & 0x200); } } + + /// + /// Gets the size of the unsigned int that was compiled into Zlib + /// + public int SizeOfUInt { get { return bitSize(_flags & 3); } } + + /// + /// Gets the size of the unsigned long that was compiled into Zlib + /// + public int SizeOfULong { get { return bitSize((_flags >> 2) & 3); } } + + /// + /// Gets the size of the pointers that were compiled into Zlib + /// + public int SizeOfPointer { get { return bitSize((_flags >> 4) & 3); } } + + /// + /// Gets the size of the z_off_t type that was compiled into Zlib + /// + public int SizeOfOffset { get { return bitSize((_flags >> 6) & 3); } } + + /// + /// Gets the version of ZLib as a string, e.g. "1.2.1" + /// + public static string Version { get { return zlibVersion(); } } + } + + #endregion + +} diff --git a/externe_kniznice/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj b/externe_kniznice/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj new file mode 100644 index 0000000..dea7fb1 --- /dev/null +++ b/externe_kniznice/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/externe_kniznice/zlib/contrib/dotzlib/DotZLib/GZipStream.cs b/externe_kniznice/zlib/contrib/dotzlib/DotZLib/GZipStream.cs new file mode 100644 index 0000000..f0eada1 --- /dev/null +++ b/externe_kniznice/zlib/contrib/dotzlib/DotZLib/GZipStream.cs @@ -0,0 +1,301 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.IO; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + /// + /// Implements a compressed , in GZip (.gz) format. + /// + public class GZipStream : Stream, IDisposable + { + #region Dll Imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)] + private static extern IntPtr gzopen(string name, string mode); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzclose(IntPtr gzFile); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzwrite(IntPtr gzFile, int data, int length); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzread(IntPtr gzFile, int data, int length); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzgetc(IntPtr gzFile); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzputc(IntPtr gzFile, int c); + + #endregion + + #region Private data + private IntPtr _gzFile; + private bool _isDisposed = false; + private bool _isWriting; + #endregion + + #region Constructors + /// + /// Creates a new file as a writeable GZipStream + /// + /// The name of the compressed file to create + /// The compression level to use when adding data + /// If an error occurred in the internal zlib function + public GZipStream(string fileName, CompressLevel level) + { + _isWriting = true; + _gzFile = gzopen(fileName, String.Format("wb{0}", (int)level)); + if (_gzFile == IntPtr.Zero) + throw new ZLibException(-1, "Could not open " + fileName); + } + + /// + /// Opens an existing file as a readable GZipStream + /// + /// The name of the file to open + /// If an error occurred in the internal zlib function + public GZipStream(string fileName) + { + _isWriting = false; + _gzFile = gzopen(fileName, "rb"); + if (_gzFile == IntPtr.Zero) + throw new ZLibException(-1, "Could not open " + fileName); + + } + #endregion + + #region Access properties + /// + /// Returns true of this stream can be read from, false otherwise + /// + public override bool CanRead + { + get + { + return !_isWriting; + } + } + + + /// + /// Returns false. + /// + public override bool CanSeek + { + get + { + return false; + } + } + + /// + /// Returns true if this tsream is writeable, false otherwise + /// + public override bool CanWrite + { + get + { + return _isWriting; + } + } + #endregion + + #region Destructor & IDispose stuff + + /// + /// Destroys this instance + /// + ~GZipStream() + { + cleanUp(false); + } + + /// + /// Closes the external file handle + /// + public void Dispose() + { + cleanUp(true); + } + + // Does the actual closing of the file handle. + private void cleanUp(bool isDisposing) + { + if (!_isDisposed) + { + gzclose(_gzFile); + _isDisposed = true; + } + } + #endregion + + #region Basic reading and writing + /// + /// Attempts to read a number of bytes from the stream. + /// + /// The destination data buffer + /// The index of the first destination byte in buffer + /// The number of bytes requested + /// The number of bytes read + /// If buffer is null + /// If count or offset are negative + /// If offset + count is > buffer.Length + /// If this stream is not readable. + /// If this stream has been disposed. + public override int Read(byte[] buffer, int offset, int count) + { + if (!CanRead) throw new NotSupportedException(); + if (buffer == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > buffer.Length) throw new ArgumentException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + + GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned); + int result; + try + { + result = gzread(_gzFile, h.AddrOfPinnedObject().ToInt32() + offset, count); + if (result < 0) + throw new IOException(); + } + finally + { + h.Free(); + } + return result; + } + + /// + /// Attempts to read a single byte from the stream. + /// + /// The byte that was read, or -1 in case of error or End-Of-File + public override int ReadByte() + { + if (!CanRead) throw new NotSupportedException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + return gzgetc(_gzFile); + } + + /// + /// Writes a number of bytes to the stream + /// + /// + /// + /// + /// If buffer is null + /// If count or offset are negative + /// If offset + count is > buffer.Length + /// If this stream is not writeable. + /// If this stream has been disposed. + public override void Write(byte[] buffer, int offset, int count) + { + if (!CanWrite) throw new NotSupportedException(); + if (buffer == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > buffer.Length) throw new ArgumentException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + + GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned); + try + { + int result = gzwrite(_gzFile, h.AddrOfPinnedObject().ToInt32() + offset, count); + if (result < 0) + throw new IOException(); + } + finally + { + h.Free(); + } + } + + /// + /// Writes a single byte to the stream + /// + /// The byte to add to the stream. + /// If this stream is not writeable. + /// If this stream has been disposed. + public override void WriteByte(byte value) + { + if (!CanWrite) throw new NotSupportedException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + + int result = gzputc(_gzFile, (int)value); + if (result < 0) + throw new IOException(); + } + #endregion + + #region Position & length stuff + /// + /// Not supported. + /// + /// + /// Always thrown + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + /// + /// Not suppported. + /// + /// + /// + /// + /// Always thrown + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(); + } + + /// + /// Flushes the GZipStream. + /// + /// In this implementation, this method does nothing. This is because excessive + /// flushing may degrade the achievable compression rates. + public override void Flush() + { + // left empty on purpose + } + + /// + /// Gets/sets the current position in the GZipStream. Not suppported. + /// + /// In this implementation this property is not supported + /// Always thrown + public override long Position + { + get + { + throw new NotSupportedException(); + } + set + { + throw new NotSupportedException(); + } + } + + /// + /// Gets the size of the stream. Not suppported. + /// + /// In this implementation this property is not supported + /// Always thrown + public override long Length + { + get + { + throw new NotSupportedException(); + } + } + #endregion + } +} diff --git a/externe_kniznice/zlib/contrib/dotzlib/DotZLib/Inflater.cs b/externe_kniznice/zlib/contrib/dotzlib/DotZLib/Inflater.cs new file mode 100644 index 0000000..d295f26 --- /dev/null +++ b/externe_kniznice/zlib/contrib/dotzlib/DotZLib/Inflater.cs @@ -0,0 +1,105 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + + /// + /// Implements a data decompressor, using the inflate algorithm in the ZLib dll + /// + public class Inflater : CodecBase + { + #region Dll imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)] + private static extern int inflateInit_(ref ZStream sz, string vs, int size); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int inflate(ref ZStream sz, int flush); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int inflateReset(ref ZStream sz); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int inflateEnd(ref ZStream sz); + #endregion + + /// + /// Constructs an new instance of the Inflater + /// + public Inflater() : base() + { + int retval = inflateInit_(ref _ztream, Info.Version, Marshal.SizeOf(_ztream)); + if (retval != 0) + throw new ZLibException(retval, "Could not initialize inflater"); + + resetOutput(); + } + + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + public override void Add(byte[] data, int offset, int count) + { + if (data == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + + int total = count; + int inputIndex = offset; + int err = 0; + + while (err >= 0 && inputIndex < total) + { + copyInput(data, inputIndex, Math.Min(total - inputIndex, kBufferSize)); + err = inflate(ref _ztream, (int)FlushTypes.None); + if (err == 0) + while (_ztream.avail_out == 0) + { + OnDataAvailable(); + err = inflate(ref _ztream, (int)FlushTypes.None); + } + + inputIndex += (int)_ztream.total_in; + } + setChecksum( _ztream.adler ); + } + + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + public override void Finish() + { + int err; + do + { + err = inflate(ref _ztream, (int)FlushTypes.Finish); + OnDataAvailable(); + } + while (err == 0); + setChecksum( _ztream.adler ); + inflateReset(ref _ztream); + resetOutput(); + } + + /// + /// Closes the internal zlib inflate stream + /// + protected override void CleanUp() { inflateEnd(ref _ztream); } + + + } +} diff --git a/externe_kniznice/zlib/contrib/dotzlib/DotZLib/UnitTests.cs b/externe_kniznice/zlib/contrib/dotzlib/DotZLib/UnitTests.cs new file mode 100644 index 0000000..6d8aebb --- /dev/null +++ b/externe_kniznice/zlib/contrib/dotzlib/DotZLib/UnitTests.cs @@ -0,0 +1,274 @@ +// +// © Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Collections; +using System.IO; + +// uncomment the define below to include unit tests +//#define nunit +#if nunit +using NUnit.Framework; + +// Unit tests for the DotZLib class library +// ---------------------------------------- +// +// Use this with NUnit 2 from http://www.nunit.org +// + +namespace DotZLibTests +{ + using DotZLib; + + // helper methods + internal class Utils + { + public static bool byteArrEqual( byte[] lhs, byte[] rhs ) + { + if (lhs.Length != rhs.Length) + return false; + for (int i = lhs.Length-1; i >= 0; --i) + if (lhs[i] != rhs[i]) + return false; + return true; + } + + } + + + [TestFixture] + public class CircBufferTests + { + #region Circular buffer tests + [Test] + public void SinglePutGet() + { + CircularBuffer buf = new CircularBuffer(10); + Assert.AreEqual( 0, buf.Size ); + Assert.AreEqual( -1, buf.Get() ); + + Assert.IsTrue(buf.Put( 1 )); + Assert.AreEqual( 1, buf.Size ); + Assert.AreEqual( 1, buf.Get() ); + Assert.AreEqual( 0, buf.Size ); + Assert.AreEqual( -1, buf.Get() ); + } + + [Test] + public void BlockPutGet() + { + CircularBuffer buf = new CircularBuffer(10); + byte[] arr = {1,2,3,4,5,6,7,8,9,10}; + Assert.AreEqual( 10, buf.Put(arr,0,10) ); + Assert.AreEqual( 10, buf.Size ); + Assert.IsFalse( buf.Put(11) ); + Assert.AreEqual( 1, buf.Get() ); + Assert.IsTrue( buf.Put(11) ); + + byte[] arr2 = (byte[])arr.Clone(); + Assert.AreEqual( 9, buf.Get(arr2,1,9) ); + Assert.IsTrue( Utils.byteArrEqual(arr,arr2) ); + } + + #endregion + } + + [TestFixture] + public class ChecksumTests + { + #region CRC32 Tests + [Test] + public void CRC32_Null() + { + CRC32Checksum crc32 = new CRC32Checksum(); + Assert.AreEqual( 0, crc32.Value ); + + crc32 = new CRC32Checksum(1); + Assert.AreEqual( 1, crc32.Value ); + + crc32 = new CRC32Checksum(556); + Assert.AreEqual( 556, crc32.Value ); + } + + [Test] + public void CRC32_Data() + { + CRC32Checksum crc32 = new CRC32Checksum(); + byte[] data = { 1,2,3,4,5,6,7 }; + crc32.Update(data); + Assert.AreEqual( 0x70e46888, crc32.Value ); + + crc32 = new CRC32Checksum(); + crc32.Update("penguin"); + Assert.AreEqual( 0x0e5c1a120, crc32.Value ); + + crc32 = new CRC32Checksum(1); + crc32.Update("penguin"); + Assert.AreEqual(0x43b6aa94, crc32.Value); + + } + #endregion + + #region Adler tests + + [Test] + public void Adler_Null() + { + AdlerChecksum adler = new AdlerChecksum(); + Assert.AreEqual(0, adler.Value); + + adler = new AdlerChecksum(1); + Assert.AreEqual( 1, adler.Value ); + + adler = new AdlerChecksum(556); + Assert.AreEqual( 556, adler.Value ); + } + + [Test] + public void Adler_Data() + { + AdlerChecksum adler = new AdlerChecksum(1); + byte[] data = { 1,2,3,4,5,6,7 }; + adler.Update(data); + Assert.AreEqual( 0x5b001d, adler.Value ); + + adler = new AdlerChecksum(); + adler.Update("penguin"); + Assert.AreEqual(0x0bcf02f6, adler.Value ); + + adler = new AdlerChecksum(1); + adler.Update("penguin"); + Assert.AreEqual(0x0bd602f7, adler.Value); + + } + #endregion + } + + [TestFixture] + public class InfoTests + { + #region Info tests + [Test] + public void Info_Version() + { + Info info = new Info(); + Assert.AreEqual("1.2.11", Info.Version); + Assert.AreEqual(32, info.SizeOfUInt); + Assert.AreEqual(32, info.SizeOfULong); + Assert.AreEqual(32, info.SizeOfPointer); + Assert.AreEqual(32, info.SizeOfOffset); + } + #endregion + } + + [TestFixture] + public class DeflateInflateTests + { + #region Deflate tests + [Test] + public void Deflate_Init() + { + using (Deflater def = new Deflater(CompressLevel.Default)) + { + } + } + + private ArrayList compressedData = new ArrayList(); + private uint adler1; + + private ArrayList uncompressedData = new ArrayList(); + private uint adler2; + + public void CDataAvail(byte[] data, int startIndex, int count) + { + for (int i = 0; i < count; ++i) + compressedData.Add(data[i+startIndex]); + } + + [Test] + public void Deflate_Compress() + { + compressedData.Clear(); + + byte[] testData = new byte[35000]; + for (int i = 0; i < testData.Length; ++i) + testData[i] = 5; + + using (Deflater def = new Deflater((CompressLevel)5)) + { + def.DataAvailable += new DataAvailableHandler(CDataAvail); + def.Add(testData); + def.Finish(); + adler1 = def.Checksum; + } + } + #endregion + + #region Inflate tests + [Test] + public void Inflate_Init() + { + using (Inflater inf = new Inflater()) + { + } + } + + private void DDataAvail(byte[] data, int startIndex, int count) + { + for (int i = 0; i < count; ++i) + uncompressedData.Add(data[i+startIndex]); + } + + [Test] + public void Inflate_Expand() + { + uncompressedData.Clear(); + + using (Inflater inf = new Inflater()) + { + inf.DataAvailable += new DataAvailableHandler(DDataAvail); + inf.Add((byte[])compressedData.ToArray(typeof(byte))); + inf.Finish(); + adler2 = inf.Checksum; + } + Assert.AreEqual( adler1, adler2 ); + } + #endregion + } + + [TestFixture] + public class GZipStreamTests + { + #region GZipStream test + [Test] + public void GZipStream_WriteRead() + { + using (GZipStream gzOut = new GZipStream("gzstream.gz", CompressLevel.Best)) + { + BinaryWriter writer = new BinaryWriter(gzOut); + writer.Write("hi there"); + writer.Write(Math.PI); + writer.Write(42); + } + + using (GZipStream gzIn = new GZipStream("gzstream.gz")) + { + BinaryReader reader = new BinaryReader(gzIn); + string s = reader.ReadString(); + Assert.AreEqual("hi there",s); + double d = reader.ReadDouble(); + Assert.AreEqual(Math.PI, d); + int i = reader.ReadInt32(); + Assert.AreEqual(42,i); + } + + } + #endregion + } +} + +#endif diff --git a/externe_kniznice/zlib/contrib/dotzlib/LICENSE_1_0.txt b/externe_kniznice/zlib/contrib/dotzlib/LICENSE_1_0.txt new file mode 100644 index 0000000..127a5bc --- /dev/null +++ b/externe_kniznice/zlib/contrib/dotzlib/LICENSE_1_0.txt @@ -0,0 +1,23 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/dotzlib/readme.txt b/externe_kniznice/zlib/contrib/dotzlib/readme.txt new file mode 100644 index 0000000..4d8c2dd --- /dev/null +++ b/externe_kniznice/zlib/contrib/dotzlib/readme.txt @@ -0,0 +1,58 @@ +This directory contains a .Net wrapper class library for the ZLib1.dll + +The wrapper includes support for inflating/deflating memory buffers, +.Net streaming wrappers for the gz streams part of zlib, and wrappers +for the checksum parts of zlib. See DotZLib/UnitTests.cs for examples. + +Directory structure: +-------------------- + +LICENSE_1_0.txt - License file. +readme.txt - This file. +DotZLib.chm - Class library documentation +DotZLib.build - NAnt build file +DotZLib.sln - Microsoft Visual Studio 2003 solution file + +DotZLib\*.cs - Source files for the class library + +Unit tests: +----------- +The file DotZLib/UnitTests.cs contains unit tests for use with NUnit 2.1 or higher. +To include unit tests in the build, define nunit before building. + + +Build instructions: +------------------- + +1. Using Visual Studio.Net 2003: + Open DotZLib.sln in VS.Net and build from there. Output file (DotZLib.dll) + will be found ./DotZLib/bin/release or ./DotZLib/bin/debug, depending on + you are building the release or debug version of the library. Check + DotZLib/UnitTests.cs for instructions on how to include unit tests in the + build. + +2. Using NAnt: + Open a command prompt with access to the build environment and run nant + in the same directory as the DotZLib.build file. + You can define 2 properties on the nant command-line to control the build: + debug={true|false} to toggle between release/debug builds (default=true). + nunit={true|false} to include or esclude unit tests (default=true). + Also the target clean will remove binaries. + Output file (DotZLib.dll) will be found in either ./DotZLib/bin/release + or ./DotZLib/bin/debug, depending on whether you are building the release + or debug version of the library. + + Examples: + nant -D:debug=false -D:nunit=false + will build a release mode version of the library without unit tests. + nant + will build a debug version of the library with unit tests + nant clean + will remove all previously built files. + + +--------------------------------- +Copyright (c) Henrik Ravn 2004 + +Use, modification and distribution are subject to the Boost Software License, Version 1.0. +(See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) diff --git a/externe_kniznice/zlib/contrib/gcc_gvmat64/gvmat64.S b/externe_kniznice/zlib/contrib/gcc_gvmat64/gvmat64.S new file mode 100644 index 0000000..23309fa --- /dev/null +++ b/externe_kniznice/zlib/contrib/gcc_gvmat64/gvmat64.S @@ -0,0 +1,574 @@ +/* +;uInt longest_match_x64( +; deflate_state *s, +; IPos cur_match); // current match + +; gvmat64.S -- Asm portion of the optimized longest_match for 32 bits x86_64 +; (AMD64 on Athlon 64, Opteron, Phenom +; and Intel EM64T on Pentium 4 with EM64T, Pentium D, Core 2 Duo, Core I5/I7) +; this file is translation from gvmat64.asm to GCC 4.x (for Linux, Mac XCode) +; Copyright (C) 1995-2010 Jean-loup Gailly, Brian Raiter and Gilles Vollant. +; +; File written by Gilles Vollant, by converting to assembly the longest_match +; from Jean-loup Gailly in deflate.c of zLib and infoZip zip. +; and by taking inspiration on asm686 with masm, optimised assembly code +; from Brian Raiter, written 1998 +; +; This software is provided 'as-is', without any express or implied +; warranty. In no event will the authors be held liable for any damages +; arising from the use of this software. +; +; Permission is granted to anyone to use this software for any purpose, +; including commercial applications, and to alter it and redistribute it +; freely, subject to the following restrictions: +; +; 1. The origin of this software must not be misrepresented; you must not +; claim that you wrote the original software. If you use this software +; in a product, an acknowledgment in the product documentation would be +; appreciated but is not required. +; 2. Altered source versions must be plainly marked as such, and must not be +; misrepresented as being the original software +; 3. This notice may not be removed or altered from any source distribution. +; +; http://www.zlib.net +; http://www.winimage.com/zLibDll +; http://www.muppetlabs.com/~breadbox/software/assembly.html +; +; to compile this file for zLib, I use option: +; gcc -c -arch x86_64 gvmat64.S + + +;uInt longest_match(s, cur_match) +; deflate_state *s; +; IPos cur_match; // current match / +; +; with XCode for Mac, I had strange error with some jump on intel syntax +; this is why BEFORE_JMP and AFTER_JMP are used + */ + + +#define BEFORE_JMP .att_syntax +#define AFTER_JMP .intel_syntax noprefix + +#ifndef NO_UNDERLINE +# define match_init _match_init +# define longest_match _longest_match +#endif + +.intel_syntax noprefix + +.globl match_init, longest_match +.text +longest_match: + + + +#define LocalVarsSize 96 +/* +; register used : rax,rbx,rcx,rdx,rsi,rdi,r8,r9,r10,r11,r12 +; free register : r14,r15 +; register can be saved : rsp +*/ + +#define chainlenwmask (rsp + 8 - LocalVarsSize) +#define nicematch (rsp + 16 - LocalVarsSize) + +#define save_rdi (rsp + 24 - LocalVarsSize) +#define save_rsi (rsp + 32 - LocalVarsSize) +#define save_rbx (rsp + 40 - LocalVarsSize) +#define save_rbp (rsp + 48 - LocalVarsSize) +#define save_r12 (rsp + 56 - LocalVarsSize) +#define save_r13 (rsp + 64 - LocalVarsSize) +#define save_r14 (rsp + 72 - LocalVarsSize) +#define save_r15 (rsp + 80 - LocalVarsSize) + + +/* +; all the +4 offsets are due to the addition of pending_buf_size (in zlib +; in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, remove the +4). +; Note : these value are good with a 8 bytes boundary pack structure +*/ + +#define MAX_MATCH 258 +#define MIN_MATCH 3 +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) + +/* +;;; Offsets for fields in the deflate_state structure. These numbers +;;; are calculated from the definition of deflate_state, with the +;;; assumption that the compiler will dword-align the fields. (Thus, +;;; changing the definition of deflate_state could easily cause this +;;; program to crash horribly, without so much as a warning at +;;; compile time. Sigh.) + +; all the +zlib1222add offsets are due to the addition of fields +; in zlib in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). +; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). +; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). +*/ + + + +/* you can check the structure offset by running + +#include +#include +#include "deflate.h" + +void print_depl() +{ +deflate_state ds; +deflate_state *s=&ds; +printf("size pointer=%u\n",(int)sizeof(void*)); + +printf("#define dsWSize %u\n",(int)(((char*)&(s->w_size))-((char*)s))); +printf("#define dsWMask %u\n",(int)(((char*)&(s->w_mask))-((char*)s))); +printf("#define dsWindow %u\n",(int)(((char*)&(s->window))-((char*)s))); +printf("#define dsPrev %u\n",(int)(((char*)&(s->prev))-((char*)s))); +printf("#define dsMatchLen %u\n",(int)(((char*)&(s->match_length))-((char*)s))); +printf("#define dsPrevMatch %u\n",(int)(((char*)&(s->prev_match))-((char*)s))); +printf("#define dsStrStart %u\n",(int)(((char*)&(s->strstart))-((char*)s))); +printf("#define dsMatchStart %u\n",(int)(((char*)&(s->match_start))-((char*)s))); +printf("#define dsLookahead %u\n",(int)(((char*)&(s->lookahead))-((char*)s))); +printf("#define dsPrevLen %u\n",(int)(((char*)&(s->prev_length))-((char*)s))); +printf("#define dsMaxChainLen %u\n",(int)(((char*)&(s->max_chain_length))-((char*)s))); +printf("#define dsGoodMatch %u\n",(int)(((char*)&(s->good_match))-((char*)s))); +printf("#define dsNiceMatch %u\n",(int)(((char*)&(s->nice_match))-((char*)s))); +} +*/ + +#define dsWSize 68 +#define dsWMask 76 +#define dsWindow 80 +#define dsPrev 96 +#define dsMatchLen 144 +#define dsPrevMatch 148 +#define dsStrStart 156 +#define dsMatchStart 160 +#define dsLookahead 164 +#define dsPrevLen 168 +#define dsMaxChainLen 172 +#define dsGoodMatch 188 +#define dsNiceMatch 192 + +#define window_size [ rcx + dsWSize] +#define WMask [ rcx + dsWMask] +#define window_ad [ rcx + dsWindow] +#define prev_ad [ rcx + dsPrev] +#define strstart [ rcx + dsStrStart] +#define match_start [ rcx + dsMatchStart] +#define Lookahead [ rcx + dsLookahead] //; 0ffffffffh on infozip +#define prev_length [ rcx + dsPrevLen] +#define max_chain_length [ rcx + dsMaxChainLen] +#define good_match [ rcx + dsGoodMatch] +#define nice_match [ rcx + dsNiceMatch] + +/* +; windows: +; parameter 1 in rcx(deflate state s), param 2 in rdx (cur match) + +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and +; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp +; +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r9, r10, and r11, which are scratch. + +; +; gcc on macosx-linux: +; see http://www.x86-64.org/documentation/abi-0.99.pdf +; param 1 in rdi, param 2 in rsi +; rbx, rsp, rbp, r12 to r15 must be preserved + +;;; Save registers that the compiler may be using, and adjust esp to +;;; make room for our stack frame. + + +;;; Retrieve the function arguments. r8d will hold cur_match +;;; throughout the entire function. edx will hold the pointer to the +;;; deflate_state structure during the function's setup (before +;;; entering the main loop. + +; ms: parameter 1 in rcx (deflate_state* s), param 2 in edx -> r8 (cur match) +; mac: param 1 in rdi, param 2 rsi +; this clear high 32 bits of r8, which can be garbage in both r8 and rdx +*/ + mov [save_rbx],rbx + mov [save_rbp],rbp + + + mov rcx,rdi + + mov r8d,esi + + + mov [save_r12],r12 + mov [save_r13],r13 + mov [save_r14],r14 + mov [save_r15],r15 + + +//;;; uInt wmask = s->w_mask; +//;;; unsigned chain_length = s->max_chain_length; +//;;; if (s->prev_length >= s->good_match) { +//;;; chain_length >>= 2; +//;;; } + + + mov edi, prev_length + mov esi, good_match + mov eax, WMask + mov ebx, max_chain_length + cmp edi, esi + jl LastMatchGood + shr ebx, 2 +LastMatchGood: + +//;;; chainlen is decremented once beforehand so that the function can +//;;; use the sign flag instead of the zero flag for the exit test. +//;;; It is then shifted into the high word, to make room for the wmask +//;;; value, which it will always accompany. + + dec ebx + shl ebx, 16 + or ebx, eax + +//;;; on zlib only +//;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + + + mov eax, nice_match + mov [chainlenwmask], ebx + mov r10d, Lookahead + cmp r10d, eax + cmovnl r10d, eax + mov [nicematch],r10d + + + +//;;; register Bytef *scan = s->window + s->strstart; + mov r10, window_ad + mov ebp, strstart + lea r13, [r10 + rbp] + +//;;; Determine how many bytes the scan ptr is off from being +//;;; dword-aligned. + + mov r9,r13 + neg r13 + and r13,3 + +//;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? +//;;; s->strstart - (IPos)MAX_DIST(s) : NIL; + + + mov eax, window_size + sub eax, MIN_LOOKAHEAD + + + xor edi,edi + sub ebp, eax + + mov r11d, prev_length + + cmovng ebp,edi + +//;;; int best_len = s->prev_length; + + +//;;; Store the sum of s->window + best_len in esi locally, and in esi. + + lea rsi,[r10+r11] + +//;;; register ush scan_start = *(ushf*)scan; +//;;; register ush scan_end = *(ushf*)(scan+best_len-1); +//;;; Posf *prev = s->prev; + + movzx r12d,word ptr [r9] + movzx ebx, word ptr [r9 + r11 - 1] + + mov rdi, prev_ad + +//;;; Jump into the main loop. + + mov edx, [chainlenwmask] + + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + + + +LookupLoop1: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + + + + sub edx, 0x00010000 + BEFORE_JMP + js LeaveNow + AFTER_JMP + +LoopEntry1: + cmp bx,word ptr [rsi + r8 - 1] + BEFORE_JMP + jz LookupLoopIsZero + AFTER_JMP + +LookupLoop2: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + BEFORE_JMP + jbe LeaveNow + AFTER_JMP + sub edx, 0x00010000 + BEFORE_JMP + js LeaveNow + AFTER_JMP + +LoopEntry2: + cmp bx,word ptr [rsi + r8 - 1] + BEFORE_JMP + jz LookupLoopIsZero + AFTER_JMP + +LookupLoop4: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + BEFORE_JMP + jbe LeaveNow + AFTER_JMP + sub edx, 0x00010000 + BEFORE_JMP + js LeaveNow + AFTER_JMP + +LoopEntry4: + + cmp bx,word ptr [rsi + r8 - 1] + BEFORE_JMP + jnz LookupLoop1 + jmp LookupLoopIsZero + AFTER_JMP +/* +;;; do { +;;; match = s->window + cur_match; +;;; if (*(ushf*)(match+best_len-1) != scan_end || +;;; *(ushf*)match != scan_start) continue; +;;; [...] +;;; } while ((cur_match = prev[cur_match & wmask]) > limit +;;; && --chain_length != 0); +;;; +;;; Here is the inner loop of the function. The function will spend the +;;; majority of its time in this loop, and majority of that time will +;;; be spent in the first ten instructions. +;;; +;;; Within this loop: +;;; ebx = scanend +;;; r8d = curmatch +;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) +;;; esi = windowbestlen - i.e., (window + bestlen) +;;; edi = prev +;;; ebp = limit +*/ +.balign 16 +LookupLoop: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + BEFORE_JMP + jbe LeaveNow + AFTER_JMP + sub edx, 0x00010000 + BEFORE_JMP + js LeaveNow + AFTER_JMP + +LoopEntry: + + cmp bx,word ptr [rsi + r8 - 1] + BEFORE_JMP + jnz LookupLoop1 + AFTER_JMP +LookupLoopIsZero: + cmp r12w, word ptr [r10 + r8] + BEFORE_JMP + jnz LookupLoop1 + AFTER_JMP + + +//;;; Store the current value of chainlen. + mov [chainlenwmask], edx +/* +;;; Point edi to the string under scrutiny, and esi to the string we +;;; are hoping to match it up with. In actuality, esi and edi are +;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is +;;; initialized to -(MAX_MATCH_8 - scanalign). +*/ + lea rsi,[r8+r10] + mov rdx, 0xfffffffffffffef8 //; -(MAX_MATCH_8) + lea rsi, [rsi + r13 + 0x0108] //;MAX_MATCH_8] + lea rdi, [r9 + r13 + 0x0108] //;MAX_MATCH_8] + + prefetcht1 [rsi+rdx] + prefetcht1 [rdi+rdx] + +/* +;;; Test the strings for equality, 8 bytes at a time. At the end, +;;; adjust rdx so that it is offset to the exact byte that mismatched. +;;; +;;; We already know at this point that the first three bytes of the +;;; strings match each other, and they can be safely passed over before +;;; starting the compare loop. So what this code does is skip over 0-3 +;;; bytes, as much as necessary in order to dword-align the edi +;;; pointer. (rsi will still be misaligned three times out of four.) +;;; +;;; It should be confessed that this loop usually does not represent +;;; much of the total running time. Replacing it with a more +;;; straightforward "rep cmpsb" would not drastically degrade +;;; performance. +*/ + +LoopCmps: + mov rax, [rsi + rdx] + xor rax, [rdi + rdx] + jnz LeaveLoopCmps + + mov rax, [rsi + rdx + 8] + xor rax, [rdi + rdx + 8] + jnz LeaveLoopCmps8 + + + mov rax, [rsi + rdx + 8+8] + xor rax, [rdi + rdx + 8+8] + jnz LeaveLoopCmps16 + + add rdx,8+8+8 + + BEFORE_JMP + jnz LoopCmps + jmp LenMaximum + AFTER_JMP + +LeaveLoopCmps16: add rdx,8 +LeaveLoopCmps8: add rdx,8 +LeaveLoopCmps: + + test eax, 0x0000FFFF + jnz LenLower + + test eax,0xffffffff + + jnz LenLower32 + + add rdx,4 + shr rax,32 + or ax,ax + BEFORE_JMP + jnz LenLower + AFTER_JMP + +LenLower32: + shr eax,16 + add rdx,2 + +LenLower: + sub al, 1 + adc rdx, 0 +//;;; Calculate the length of the match. If it is longer than MAX_MATCH, +//;;; then automatically accept it as the best possible match and leave. + + lea rax, [rdi + rdx] + sub rax, r9 + cmp eax, MAX_MATCH + BEFORE_JMP + jge LenMaximum + AFTER_JMP +/* +;;; If the length of the match is not longer than the best match we +;;; have so far, then forget it and return to the lookup loop. +;/////////////////////////////////// +*/ + cmp eax, r11d + jg LongerMatch + + lea rsi,[r10+r11] + + mov rdi, prev_ad + mov edx, [chainlenwmask] + BEFORE_JMP + jmp LookupLoop + AFTER_JMP +/* +;;; s->match_start = cur_match; +;;; best_len = len; +;;; if (len >= nice_match) break; +;;; scan_end = *(ushf*)(scan+best_len-1); +*/ +LongerMatch: + mov r11d, eax + mov match_start, r8d + cmp eax, [nicematch] + BEFORE_JMP + jge LeaveNow + AFTER_JMP + + lea rsi,[r10+rax] + + movzx ebx, word ptr [r9 + rax - 1] + mov rdi, prev_ad + mov edx, [chainlenwmask] + BEFORE_JMP + jmp LookupLoop + AFTER_JMP + +//;;; Accept the current string, with the maximum possible length. + +LenMaximum: + mov r11d,MAX_MATCH + mov match_start, r8d + +//;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len; +//;;; return s->lookahead; + +LeaveNow: + mov eax, Lookahead + cmp r11d, eax + cmovng eax, r11d + + + +//;;; Restore the stack and return from whence we came. + + +// mov rsi,[save_rsi] +// mov rdi,[save_rdi] + mov rbx,[save_rbx] + mov rbp,[save_rbp] + mov r12,[save_r12] + mov r13,[save_r13] + mov r14,[save_r14] + mov r15,[save_r15] + + + ret 0 +//; please don't remove this string ! +//; Your can freely use gvmat64 in any free or commercial app +//; but it is far better don't remove the string in the binary! + // db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998, converted to amd 64 by Gilles Vollant 2005",0dh,0ah,0 + + +match_init: + ret 0 + + diff --git a/externe_kniznice/zlib/contrib/infback9/README b/externe_kniznice/zlib/contrib/infback9/README new file mode 100644 index 0000000..e75ed13 --- /dev/null +++ b/externe_kniznice/zlib/contrib/infback9/README @@ -0,0 +1 @@ +See infback9.h for what this is and how to use it. diff --git a/externe_kniznice/zlib/contrib/infback9/infback9.c b/externe_kniznice/zlib/contrib/infback9/infback9.c new file mode 100644 index 0000000..05fb3e3 --- /dev/null +++ b/externe_kniznice/zlib/contrib/infback9/infback9.c @@ -0,0 +1,615 @@ +/* infback9.c -- inflate deflate64 data using a call-back interface + * Copyright (C) 1995-2008 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "infback9.h" +#include "inftree9.h" +#include "inflate9.h" + +#define WSIZE 65536UL + +/* + strm provides memory allocation functions in zalloc and zfree, or + Z_NULL to use the library memory allocation functions. + + window is a user-supplied window and output buffer that is 64K bytes. + */ +int ZEXPORT inflateBack9Init_(strm, window, version, stream_size) +z_stream FAR *strm; +unsigned char FAR *window; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL || window == Z_NULL) + return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *)ZALLOC(strm, 1, + sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (voidpf)state; + state->window = window; + return Z_OK; +} + +/* + Build and output length and distance decoding tables for fixed code + decoding. + */ +#ifdef MAKEFIXED +#include + +void makefixed9(void) +{ + unsigned sym, bits, low, size; + code *next, *lenfix, *distfix; + struct inflate_state state; + code fixed[544]; + + /* literal/length table */ + sym = 0; + while (sym < 144) state.lens[sym++] = 8; + while (sym < 256) state.lens[sym++] = 9; + while (sym < 280) state.lens[sym++] = 7; + while (sym < 288) state.lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table9(LENS, state.lens, 288, &(next), &(bits), state.work); + + /* distance table */ + sym = 0; + while (sym < 32) state.lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table9(DISTS, state.lens, 32, &(next), &(bits), state.work); + + /* write tables */ + puts(" /* inffix9.h -- table for decoding deflate64 fixed codes"); + puts(" * Generated automatically by makefixed9()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", lenfix[low].op, lenfix[low].bits, + lenfix[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 5) == 0) printf("\n "); + printf("{%u,%u,%d}", distfix[low].op, distfix[low].bits, + distfix[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* Macros for inflateBack(): */ + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Assure that some input is available. If input is requested, but denied, + then return a Z_BUF_ERROR from inflateBack(). */ +#define PULL() \ + do { \ + if (have == 0) { \ + have = in(in_desc, &next); \ + if (have == 0) { \ + next = Z_NULL; \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflateBack() + with an error if there is no input available. */ +#define PULLBYTE() \ + do { \ + PULL(); \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflateBack() with + an error. */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n <= 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Assure that some output space is available, by writing out the window + if it's full. If the write fails, return from inflateBack() with a + Z_BUF_ERROR. */ +#define ROOM() \ + do { \ + if (left == 0) { \ + put = window; \ + left = WSIZE; \ + wrap = 1; \ + if (out(out_desc, put, (unsigned)left)) { \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* + strm provides the memory allocation functions and window buffer on input, + and provides information on the unused input on return. For Z_DATA_ERROR + returns, strm will also provide an error message. + + in() and out() are the call-back input and output functions. When + inflateBack() needs more input, it calls in(). When inflateBack() has + filled the window with output, or when it completes with data in the + window, it calls out() to write out the data. The application must not + change the provided input until in() is called again or inflateBack() + returns. The application must not change the window/output buffer until + inflateBack() returns. + + in() and out() are called with a descriptor parameter provided in the + inflateBack() call. This parameter can be a structure that provides the + information required to do the read or write, as well as accumulated + information on the input and output such as totals and check values. + + in() should return zero on failure. out() should return non-zero on + failure. If either in() or out() fails, than inflateBack() returns a + Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it + was in() or out() that caused in the error. Otherwise, inflateBack() + returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format + error, or Z_MEM_ERROR if it could not allocate memory for the state. + inflateBack() can also return Z_STREAM_ERROR if the input parameters + are not correct, i.e. strm is Z_NULL or the state was not initialized. + */ +int ZEXPORT inflateBack9(strm, in, in_desc, out, out_desc) +z_stream FAR *strm; +in_func in; +void FAR *in_desc; +out_func out; +void FAR *out_desc; +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have; /* available input */ + unsigned long left; /* available output */ + inflate_mode mode; /* current inflate mode */ + int lastblock; /* true if processing last block */ + int wrap; /* true if the window has wrapped */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned extra; /* extra bits needed */ + unsigned long length; /* literal or length of data to copy */ + unsigned long offset; /* distance back to copy string from */ + unsigned long copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; +#include "inffix9.h" + + /* Check that the strm exists and that the state was initialized */ + if (strm == Z_NULL || strm->state == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* Reset the state */ + strm->msg = Z_NULL; + mode = TYPE; + lastblock = 0; + wrap = 0; + window = state->window; + next = strm->next_in; + have = next != Z_NULL ? strm->avail_in : 0; + hold = 0; + bits = 0; + put = window; + left = WSIZE; + lencode = Z_NULL; + distcode = Z_NULL; + + /* Inflate until end of block marked as last */ + for (;;) + switch (mode) { + case TYPE: + /* determine and dispatch block type */ + if (lastblock) { + BYTEBITS(); + mode = DONE; + break; + } + NEEDBITS(3); + lastblock = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + lastblock ? " (last)" : "")); + mode = STORED; + break; + case 1: /* fixed block */ + lencode = lenfix; + lenbits = 9; + distcode = distfix; + distbits = 5; + Tracev((stderr, "inflate: fixed codes block%s\n", + lastblock ? " (last)" : "")); + mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + lastblock ? " (last)" : "")); + mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + mode = BAD; + } + DROPBITS(2); + break; + + case STORED: + /* get and verify stored block length */ + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + mode = BAD; + break; + } + length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %lu\n", + length)); + INITBITS(); + + /* copy stored block from input to output */ + while (length != 0) { + copy = length; + PULL(); + ROOM(); + if (copy > have) copy = have; + if (copy > left) copy = left; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + length -= copy; + } + Tracev((stderr, "inflate: stored end\n")); + mode = TYPE; + break; + + case TABLE: + /* get dynamic table entries descriptor */ + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); + if (state->nlen > 286) { + strm->msg = (char *)"too many length symbols"; + mode = BAD; + break; + } + Tracev((stderr, "inflate: table sizes ok\n")); + + /* get code length code lengths (not a typo) */ + state->have = 0; + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + lencode = (code const FAR *)(state->next); + lenbits = 7; + ret = inflate_table9(CODES, state->lens, 19, &(state->next), + &(lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + + /* get length and distance code code lengths */ + state->have = 0; + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = lencode[BITS(lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + NEEDBITS(here.bits); + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + mode = BAD; + break; + } + len = (unsigned)(state->lens[state->have - 1]); + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftree9.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + lencode = (code const FAR *)(state->next); + lenbits = 9; + ret = inflate_table9(LENS, state->lens, state->nlen, + &(state->next), &(lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + mode = BAD; + break; + } + distcode = (code const FAR *)(state->next); + distbits = 6; + ret = inflate_table9(DISTS, state->lens + state->nlen, + state->ndist, &(state->next), &(distbits), + state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + mode = LEN; + + case LEN: + /* get a literal, length, or end-of-block code */ + for (;;) { + here = lencode[BITS(lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + length = (unsigned)here.val; + + /* process literal */ + if (here.op == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + ROOM(); + *put++ = (unsigned char)(length); + left--; + mode = LEN; + break; + } + + /* process end of block */ + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + mode = TYPE; + break; + } + + /* invalid code */ + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + mode = BAD; + break; + } + + /* length code -- get extra bits, if any */ + extra = (unsigned)(here.op) & 31; + if (extra != 0) { + NEEDBITS(extra); + length += BITS(extra); + DROPBITS(extra); + } + Tracevv((stderr, "inflate: length %lu\n", length)); + + /* get distance code */ + for (;;) { + here = distcode[BITS(distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + mode = BAD; + break; + } + offset = (unsigned)here.val; + + /* get distance extra bits, if any */ + extra = (unsigned)(here.op) & 15; + if (extra != 0) { + NEEDBITS(extra); + offset += BITS(extra); + DROPBITS(extra); + } + if (offset > WSIZE - (wrap ? 0: left)) { + strm->msg = (char *)"invalid distance too far back"; + mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %lu\n", offset)); + + /* copy match from window to output */ + do { + ROOM(); + copy = WSIZE - offset; + if (copy < left) { + from = put + copy; + copy = left - copy; + } + else { + from = put - offset; + copy = left; + } + if (copy > length) copy = length; + length -= copy; + left -= copy; + do { + *put++ = *from++; + } while (--copy); + } while (length != 0); + break; + + case DONE: + /* inflate stream terminated properly -- write leftover output */ + ret = Z_STREAM_END; + if (left < WSIZE) { + if (out(out_desc, window, (unsigned)(WSIZE - left))) + ret = Z_BUF_ERROR; + } + goto inf_leave; + + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + + default: /* can't happen, but makes compilers happy */ + ret = Z_STREAM_ERROR; + goto inf_leave; + } + + /* Return unused input */ + inf_leave: + strm->next_in = next; + strm->avail_in = have; + return ret; +} + +int ZEXPORT inflateBack9End(strm) +z_stream FAR *strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} diff --git a/externe_kniznice/zlib/contrib/infback9/infback9.h b/externe_kniznice/zlib/contrib/infback9/infback9.h new file mode 100644 index 0000000..1073c0a --- /dev/null +++ b/externe_kniznice/zlib/contrib/infback9/infback9.h @@ -0,0 +1,37 @@ +/* infback9.h -- header for using inflateBack9 functions + * Copyright (C) 2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * This header file and associated patches provide a decoder for PKWare's + * undocumented deflate64 compression method (method 9). Use with infback9.c, + * inftree9.h, inftree9.c, and inffix9.h. These patches are not supported. + * This should be compiled with zlib, since it uses zutil.h and zutil.o. + * This code has not yet been tested on 16-bit architectures. See the + * comments in zlib.h for inflateBack() usage. These functions are used + * identically, except that there is no windowBits parameter, and a 64K + * window must be provided. Also if int's are 16 bits, then a zero for + * the third parameter of the "out" function actually means 65536UL. + * zlib.h must be included before this header file. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +ZEXTERN int ZEXPORT inflateBack9 OF((z_stream FAR *strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +ZEXTERN int ZEXPORT inflateBack9End OF((z_stream FAR *strm)); +ZEXTERN int ZEXPORT inflateBack9Init_ OF((z_stream FAR *strm, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define inflateBack9Init(strm, window) \ + inflateBack9Init_((strm), (window), \ + ZLIB_VERSION, sizeof(z_stream)) + +#ifdef __cplusplus +} +#endif diff --git a/externe_kniznice/zlib/contrib/infback9/inffix9.h b/externe_kniznice/zlib/contrib/infback9/inffix9.h new file mode 100644 index 0000000..ee5671d --- /dev/null +++ b/externe_kniznice/zlib/contrib/infback9/inffix9.h @@ -0,0 +1,107 @@ + /* inffix9.h -- table for decoding deflate64 fixed codes + * Generated automatically by makefixed9(). + */ + + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{132,8,115},{130,7,31},{0,8,112}, + {0,8,48},{0,9,192},{128,7,10},{0,8,96},{0,8,32},{0,9,160}, + {0,8,0},{0,8,128},{0,8,64},{0,9,224},{128,7,6},{0,8,88}, + {0,8,24},{0,9,144},{131,7,59},{0,8,120},{0,8,56},{0,9,208}, + {129,7,17},{0,8,104},{0,8,40},{0,9,176},{0,8,8},{0,8,136}, + {0,8,72},{0,9,240},{128,7,4},{0,8,84},{0,8,20},{133,8,227}, + {131,7,43},{0,8,116},{0,8,52},{0,9,200},{129,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232}, + {128,7,8},{0,8,92},{0,8,28},{0,9,152},{132,7,83},{0,8,124}, + {0,8,60},{0,9,216},{130,7,23},{0,8,108},{0,8,44},{0,9,184}, + {0,8,12},{0,8,140},{0,8,76},{0,9,248},{128,7,3},{0,8,82}, + {0,8,18},{133,8,163},{131,7,35},{0,8,114},{0,8,50},{0,9,196}, + {129,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},{0,8,130}, + {0,8,66},{0,9,228},{128,7,7},{0,8,90},{0,8,26},{0,9,148}, + {132,7,67},{0,8,122},{0,8,58},{0,9,212},{130,7,19},{0,8,106}, + {0,8,42},{0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244}, + {128,7,5},{0,8,86},{0,8,22},{65,8,0},{131,7,51},{0,8,118}, + {0,8,54},{0,9,204},{129,7,15},{0,8,102},{0,8,38},{0,9,172}, + {0,8,6},{0,8,134},{0,8,70},{0,9,236},{128,7,9},{0,8,94}, + {0,8,30},{0,9,156},{132,7,99},{0,8,126},{0,8,62},{0,9,220}, + {130,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{133,8,131}, + {130,7,31},{0,8,113},{0,8,49},{0,9,194},{128,7,10},{0,8,97}, + {0,8,33},{0,9,162},{0,8,1},{0,8,129},{0,8,65},{0,9,226}, + {128,7,6},{0,8,89},{0,8,25},{0,9,146},{131,7,59},{0,8,121}, + {0,8,57},{0,9,210},{129,7,17},{0,8,105},{0,8,41},{0,9,178}, + {0,8,9},{0,8,137},{0,8,73},{0,9,242},{128,7,4},{0,8,85}, + {0,8,21},{144,8,3},{131,7,43},{0,8,117},{0,8,53},{0,9,202}, + {129,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133}, + {0,8,69},{0,9,234},{128,7,8},{0,8,93},{0,8,29},{0,9,154}, + {132,7,83},{0,8,125},{0,8,61},{0,9,218},{130,7,23},{0,8,109}, + {0,8,45},{0,9,186},{0,8,13},{0,8,141},{0,8,77},{0,9,250}, + {128,7,3},{0,8,83},{0,8,19},{133,8,195},{131,7,35},{0,8,115}, + {0,8,51},{0,9,198},{129,7,11},{0,8,99},{0,8,35},{0,9,166}, + {0,8,3},{0,8,131},{0,8,67},{0,9,230},{128,7,7},{0,8,91}, + {0,8,27},{0,9,150},{132,7,67},{0,8,123},{0,8,59},{0,9,214}, + {130,7,19},{0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139}, + {0,8,75},{0,9,246},{128,7,5},{0,8,87},{0,8,23},{77,8,0}, + {131,7,51},{0,8,119},{0,8,55},{0,9,206},{129,7,15},{0,8,103}, + {0,8,39},{0,9,174},{0,8,7},{0,8,135},{0,8,71},{0,9,238}, + {128,7,9},{0,8,95},{0,8,31},{0,9,158},{132,7,99},{0,8,127}, + {0,8,63},{0,9,222},{130,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80}, + {0,8,16},{132,8,115},{130,7,31},{0,8,112},{0,8,48},{0,9,193}, + {128,7,10},{0,8,96},{0,8,32},{0,9,161},{0,8,0},{0,8,128}, + {0,8,64},{0,9,225},{128,7,6},{0,8,88},{0,8,24},{0,9,145}, + {131,7,59},{0,8,120},{0,8,56},{0,9,209},{129,7,17},{0,8,104}, + {0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},{0,9,241}, + {128,7,4},{0,8,84},{0,8,20},{133,8,227},{131,7,43},{0,8,116}, + {0,8,52},{0,9,201},{129,7,13},{0,8,100},{0,8,36},{0,9,169}, + {0,8,4},{0,8,132},{0,8,68},{0,9,233},{128,7,8},{0,8,92}, + {0,8,28},{0,9,153},{132,7,83},{0,8,124},{0,8,60},{0,9,217}, + {130,7,23},{0,8,108},{0,8,44},{0,9,185},{0,8,12},{0,8,140}, + {0,8,76},{0,9,249},{128,7,3},{0,8,82},{0,8,18},{133,8,163}, + {131,7,35},{0,8,114},{0,8,50},{0,9,197},{129,7,11},{0,8,98}, + {0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {128,7,7},{0,8,90},{0,8,26},{0,9,149},{132,7,67},{0,8,122}, + {0,8,58},{0,9,213},{130,7,19},{0,8,106},{0,8,42},{0,9,181}, + {0,8,10},{0,8,138},{0,8,74},{0,9,245},{128,7,5},{0,8,86}, + {0,8,22},{65,8,0},{131,7,51},{0,8,118},{0,8,54},{0,9,205}, + {129,7,15},{0,8,102},{0,8,38},{0,9,173},{0,8,6},{0,8,134}, + {0,8,70},{0,9,237},{128,7,9},{0,8,94},{0,8,30},{0,9,157}, + {132,7,99},{0,8,126},{0,8,62},{0,9,221},{130,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253}, + {96,7,0},{0,8,81},{0,8,17},{133,8,131},{130,7,31},{0,8,113}, + {0,8,49},{0,9,195},{128,7,10},{0,8,97},{0,8,33},{0,9,163}, + {0,8,1},{0,8,129},{0,8,65},{0,9,227},{128,7,6},{0,8,89}, + {0,8,25},{0,9,147},{131,7,59},{0,8,121},{0,8,57},{0,9,211}, + {129,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},{0,8,137}, + {0,8,73},{0,9,243},{128,7,4},{0,8,85},{0,8,21},{144,8,3}, + {131,7,43},{0,8,117},{0,8,53},{0,9,203},{129,7,13},{0,8,101}, + {0,8,37},{0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235}, + {128,7,8},{0,8,93},{0,8,29},{0,9,155},{132,7,83},{0,8,125}, + {0,8,61},{0,9,219},{130,7,23},{0,8,109},{0,8,45},{0,9,187}, + {0,8,13},{0,8,141},{0,8,77},{0,9,251},{128,7,3},{0,8,83}, + {0,8,19},{133,8,195},{131,7,35},{0,8,115},{0,8,51},{0,9,199}, + {129,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{128,7,7},{0,8,91},{0,8,27},{0,9,151}, + {132,7,67},{0,8,123},{0,8,59},{0,9,215},{130,7,19},{0,8,107}, + {0,8,43},{0,9,183},{0,8,11},{0,8,139},{0,8,75},{0,9,247}, + {128,7,5},{0,8,87},{0,8,23},{77,8,0},{131,7,51},{0,8,119}, + {0,8,55},{0,9,207},{129,7,15},{0,8,103},{0,8,39},{0,9,175}, + {0,8,7},{0,8,135},{0,8,71},{0,9,239},{128,7,9},{0,8,95}, + {0,8,31},{0,9,159},{132,7,99},{0,8,127},{0,8,63},{0,9,223}, + {130,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143}, + {0,8,79},{0,9,255} + }; + + static const code distfix[32] = { + {128,5,1},{135,5,257},{131,5,17},{139,5,4097},{129,5,5}, + {137,5,1025},{133,5,65},{141,5,16385},{128,5,3},{136,5,513}, + {132,5,33},{140,5,8193},{130,5,9},{138,5,2049},{134,5,129}, + {142,5,32769},{128,5,2},{135,5,385},{131,5,25},{139,5,6145}, + {129,5,7},{137,5,1537},{133,5,97},{141,5,24577},{128,5,4}, + {136,5,769},{132,5,49},{140,5,12289},{130,5,13},{138,5,3073}, + {134,5,193},{142,5,49153} + }; diff --git a/externe_kniznice/zlib/contrib/infback9/inflate9.h b/externe_kniznice/zlib/contrib/infback9/inflate9.h new file mode 100644 index 0000000..ee9a793 --- /dev/null +++ b/externe_kniznice/zlib/contrib/infback9/inflate9.h @@ -0,0 +1,47 @@ +/* inflate9.h -- internal inflate state definition + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Possible inflate modes between inflate() calls */ +typedef enum { + TYPE, /* i: waiting for type bits, including last-flag bit */ + STORED, /* i: waiting for stored size (length and complement) */ + TABLE, /* i: waiting for dynamic block table lengths */ + LEN, /* i: waiting for length/lit code */ + DONE, /* finished check, done -- remain here until reset */ + BAD /* got a data error -- remain here until reset */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to the BAD mode -- not shown for clarity) + + Read deflate blocks: + TYPE -> STORED or TABLE or LEN or DONE + STORED -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN + Read deflate codes: + LEN -> LEN or TYPE + */ + +/* state maintained between inflate() calls. Approximately 7K bytes. */ +struct inflate_state { + /* sliding window */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ +}; diff --git a/externe_kniznice/zlib/contrib/infback9/inftree9.c b/externe_kniznice/zlib/contrib/infback9/inftree9.c new file mode 100644 index 0000000..5f4a767 --- /dev/null +++ b/externe_kniznice/zlib/contrib/infback9/inftree9.c @@ -0,0 +1,324 @@ +/* inftree9.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2017 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftree9.h" + +#define MAXBITS 15 + +const char inflate9_copyright[] = + " inflate9 1.2.11 Copyright 1995-2017 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int inflate_table9(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code this; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + int end; /* use base and extra for symbol > end */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, + 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, + 131, 163, 195, 227, 3, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, + 130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132, + 133, 133, 133, 133, 144, 77, 202}; + static const unsigned short dbase[32] = { /* Distance codes 0..31 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, + 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, + 4097, 6145, 8193, 12289, 16385, 24577, 32769, 49153}; + static const unsigned short dext[32] = { /* Distance codes 0..31 extra */ + 128, 128, 128, 128, 129, 129, 130, 130, 131, 131, 132, 132, + 133, 133, 134, 134, 135, 135, 136, 136, 137, 137, 138, 138, + 139, 139, 140, 140, 141, 141, 142, 142}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) return -1; /* no codes! */ + for (min = 1; min <= MAXBITS; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftree9.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + end = 19; + break; + case LENS: + base = lbase; + base -= 257; + extra = lext; + extra -= 257; + end = 256; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type == LENS && used >= ENOUGH_LENS) || + (type == DISTS && used >= ENOUGH_DISTS)) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + this.bits = (unsigned char)(len - drop); + if ((int)(work[sym]) < end) { + this.op = (unsigned char)0; + this.val = work[sym]; + } + else if ((int)(work[sym]) > end) { + this.op = (unsigned char)(extra[work[sym]]); + this.val = base[work[sym]]; + } + else { + this.op = (unsigned char)(32 + 64); /* end of block */ + this.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + do { + fill -= incr; + next[(huff >> drop) + fill] = this; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += 1U << curr; + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if ((type == LENS && used >= ENOUGH_LENS) || + (type == DISTS && used >= ENOUGH_DISTS)) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* + Fill in rest of table for incomplete codes. This loop is similar to the + loop above in incrementing huff for table indices. It is assumed that + len is equal to curr + drop, so there is no loop needed to increment + through high index bits. When the current sub-table is filled, the loop + drops back to the root table to fill in any remaining entries there. + */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)(len - drop); + this.val = (unsigned short)0; + while (huff != 0) { + /* when done with sub-table, drop back to root table */ + if (drop != 0 && (huff & mask) != low) { + drop = 0; + len = root; + next = *table; + curr = root; + this.bits = (unsigned char)len; + } + + /* put invalid code marker in table */ + next[huff >> drop] = this; + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/externe_kniznice/zlib/contrib/infback9/inftree9.h b/externe_kniznice/zlib/contrib/infback9/inftree9.h new file mode 100644 index 0000000..5ab21f0 --- /dev/null +++ b/externe_kniznice/zlib/contrib/infback9/inftree9.h @@ -0,0 +1,61 @@ +/* inftree9.h -- header to use inftree9.c + * Copyright (C) 1995-2008 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 100eeeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of the dynamic table. The maximum number of code structures is + 1446, which is the sum of 852 for literal/length codes and 594 for distance + codes. These values were found by exhaustive searches using the program + examples/enough.c found in the zlib distribtution. The arguments to that + program are the number of symbols, the initial root table size, and the + maximum bit length of a code. "enough 286 9 15" for literal/length codes + returns returns 852, and "enough 32 6 15" for distance codes returns 594. + The initial root table size (9 or 6) is found in the fifth argument of the + inflate_table() calls in infback9.c. If the root table size is changed, + then these maximum sizes would be need to be recalculated and updated. */ +#define ENOUGH_LENS 852 +#define ENOUGH_DISTS 594 +#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) + +/* Type of code to build for inflate_table9() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +extern int inflate_table9 OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/externe_kniznice/zlib/contrib/inflate86/inffas86.c b/externe_kniznice/zlib/contrib/inflate86/inffas86.c new file mode 100644 index 0000000..7292f67 --- /dev/null +++ b/externe_kniznice/zlib/contrib/inflate86/inffas86.c @@ -0,0 +1,1157 @@ +/* inffas86.c is a hand tuned assembler version of + * + * inffast.c -- fast decoding + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Copyright (C) 2003 Chris Anderson + * Please use the copyright conditions above. + * + * Dec-29-2003 -- I added AMD64 inflate asm support. This version is also + * slightly quicker on x86 systems because, instead of using rep movsb to copy + * data, it uses rep movsw, which moves data in 2-byte chunks instead of single + * bytes. I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates + * from http://fedora.linux.duke.edu/fc1_x86_64 + * which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with + * 1GB ram. The 64-bit version is about 4% faster than the 32-bit version, + * when decompressing mozilla-source-1.3.tar.gz. + * + * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from + * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at + * the moment. I have successfully compiled and tested this code with gcc2.96, + * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S + * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX + * enabled. I will attempt to merge the MMX code into this version. Newer + * versions of this and inffast.S can be found at + * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* Mark Adler's comments from inffast.c: */ + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + struct inffast_ar { +/* 64 32 x86 x86_64 */ +/* ar offset register */ +/* 0 0 */ void *esp; /* esp save */ +/* 8 4 */ void *ebp; /* ebp save */ +/* 16 8 */ unsigned char FAR *in; /* esi rsi local strm->next_in */ +/* 24 12 */ unsigned char FAR *last; /* r9 while in < last */ +/* 32 16 */ unsigned char FAR *out; /* edi rdi local strm->next_out */ +/* 40 20 */ unsigned char FAR *beg; /* inflate()'s init next_out */ +/* 48 24 */ unsigned char FAR *end; /* r10 while out < end */ +/* 56 28 */ unsigned char FAR *window;/* size of window, wsize!=0 */ +/* 64 32 */ code const FAR *lcode; /* ebp rbp local strm->lencode */ +/* 72 36 */ code const FAR *dcode; /* r11 local strm->distcode */ +/* 80 40 */ unsigned long hold; /* edx rdx local strm->hold */ +/* 88 44 */ unsigned bits; /* ebx rbx local strm->bits */ +/* 92 48 */ unsigned wsize; /* window size */ +/* 96 52 */ unsigned write; /* window write index */ +/*100 56 */ unsigned lmask; /* r12 mask for lcode */ +/*104 60 */ unsigned dmask; /* r13 mask for dcode */ +/*108 64 */ unsigned len; /* r14 match length */ +/*112 68 */ unsigned dist; /* r15 match distance */ +/*116 72 */ unsigned status; /* set when state chng*/ + } ar; + +#if defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 ) +#define PAD_AVAIL_IN 6 +#define PAD_AVAIL_OUT 258 +#else +#define PAD_AVAIL_IN 5 +#define PAD_AVAIL_OUT 257 +#endif + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + ar.in = strm->next_in; + ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN); + ar.out = strm->next_out; + ar.beg = ar.out - (start - strm->avail_out); + ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT); + ar.wsize = state->wsize; + ar.write = state->wnext; + ar.window = state->window; + ar.hold = state->hold; + ar.bits = state->bits; + ar.lcode = state->lencode; + ar.dcode = state->distcode; + ar.lmask = (1U << state->lenbits) - 1; + ar.dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + + /* align in on 1/2 hold size boundary */ + while (((unsigned long)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) { + ar.hold += (unsigned long)*ar.in++ << ar.bits; + ar.bits += 8; + } + +#if defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 ) + __asm__ __volatile__ ( +" leaq %0, %%rax\n" +" movq %%rbp, 8(%%rax)\n" /* save regs rbp and rsp */ +" movq %%rsp, (%%rax)\n" +" movq %%rax, %%rsp\n" /* make rsp point to &ar */ +" movq 16(%%rsp), %%rsi\n" /* rsi = in */ +" movq 32(%%rsp), %%rdi\n" /* rdi = out */ +" movq 24(%%rsp), %%r9\n" /* r9 = last */ +" movq 48(%%rsp), %%r10\n" /* r10 = end */ +" movq 64(%%rsp), %%rbp\n" /* rbp = lcode */ +" movq 72(%%rsp), %%r11\n" /* r11 = dcode */ +" movq 80(%%rsp), %%rdx\n" /* rdx = hold */ +" movl 88(%%rsp), %%ebx\n" /* ebx = bits */ +" movl 100(%%rsp), %%r12d\n" /* r12d = lmask */ +" movl 104(%%rsp), %%r13d\n" /* r13d = dmask */ + /* r14d = len */ + /* r15d = dist */ +" cld\n" +" cmpq %%rdi, %%r10\n" +" je .L_one_time\n" /* if only one decode left */ +" cmpq %%rsi, %%r9\n" +" je .L_one_time\n" +" jmp .L_do_loop\n" + +".L_one_time:\n" +" movq %%r12, %%r8\n" /* r8 = lmask */ +" cmpb $32, %%bl\n" +" ja .L_get_length_code_one_time\n" + +" lodsl\n" /* eax = *(uint *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $32, %%bl\n" /* bits += 32 */ +" shlq %%cl, %%rax\n" +" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */ +" jmp .L_get_length_code_one_time\n" + +".align 32,0x90\n" +".L_while_test:\n" +" cmpq %%rdi, %%r10\n" +" jbe .L_break_loop\n" +" cmpq %%rsi, %%r9\n" +" jbe .L_break_loop\n" + +".L_do_loop:\n" +" movq %%r12, %%r8\n" /* r8 = lmask */ +" cmpb $32, %%bl\n" +" ja .L_get_length_code\n" /* if (32 < bits) */ + +" lodsl\n" /* eax = *(uint *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $32, %%bl\n" /* bits += 32 */ +" shlq %%cl, %%rax\n" +" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */ + +".L_get_length_code:\n" +" andq %%rdx, %%r8\n" /* r8 &= hold */ +" movl (%%rbp,%%r8,4), %%eax\n" /* eax = lcode[hold & lmask] */ + +" movb %%ah, %%cl\n" /* cl = this.bits */ +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrq %%cl, %%rdx\n" /* hold >>= this.bits */ + +" testb %%al, %%al\n" +" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ + +" movq %%r12, %%r8\n" /* r8 = lmask */ +" shrl $16, %%eax\n" /* output this.val char */ +" stosb\n" + +".L_get_length_code_one_time:\n" +" andq %%rdx, %%r8\n" /* r8 &= hold */ +" movl (%%rbp,%%r8,4), %%eax\n" /* eax = lcode[hold & lmask] */ + +".L_dolen:\n" +" movb %%ah, %%cl\n" /* cl = this.bits */ +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrq %%cl, %%rdx\n" /* hold >>= this.bits */ + +" testb %%al, %%al\n" +" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ + +" shrl $16, %%eax\n" /* output this.val char */ +" stosb\n" +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_length_base:\n" +" movl %%eax, %%r14d\n" /* len = this */ +" shrl $16, %%r14d\n" /* len = this.val */ +" movb %%al, %%cl\n" + +" testb $16, %%al\n" +" jz .L_test_for_second_level_length\n" /* if ((op & 16) == 0) 8% */ +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_decode_distance\n" /* if (!op) */ + +".L_add_bits_to_len:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrq %%cl, %%rdx\n" +" addl %%eax, %%r14d\n" /* len += hold & mask[op] */ + +".L_decode_distance:\n" +" movq %%r13, %%r8\n" /* r8 = dmask */ +" cmpb $32, %%bl\n" +" ja .L_get_distance_code\n" /* if (32 < bits) */ + +" lodsl\n" /* eax = *(uint *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $32, %%bl\n" /* bits += 32 */ +" shlq %%cl, %%rax\n" +" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */ + +".L_get_distance_code:\n" +" andq %%rdx, %%r8\n" /* r8 &= hold */ +" movl (%%r11,%%r8,4), %%eax\n" /* eax = dcode[hold & dmask] */ + +".L_dodist:\n" +" movl %%eax, %%r15d\n" /* dist = this */ +" shrl $16, %%r15d\n" /* dist = this.val */ +" movb %%ah, %%cl\n" +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrq %%cl, %%rdx\n" /* hold >>= this.bits */ +" movb %%al, %%cl\n" /* cl = this.op */ + +" testb $16, %%al\n" /* if ((op & 16) == 0) */ +" jz .L_test_for_second_level_dist\n" +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_check_dist_one\n" + +".L_add_bits_to_dist:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" /* (1 << op) - 1 */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrq %%cl, %%rdx\n" +" addl %%eax, %%r15d\n" /* dist += hold & ((1 << op) - 1) */ + +".L_check_window:\n" +" movq %%rsi, %%r8\n" /* save in so from can use it's reg */ +" movq %%rdi, %%rax\n" +" subq 40(%%rsp), %%rax\n" /* nbytes = out - beg */ + +" cmpl %%r15d, %%eax\n" +" jb .L_clip_window\n" /* if (dist > nbytes) 4.2% */ + +" movl %%r14d, %%ecx\n" /* ecx = len */ +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = out - dist */ + +" sarl %%ecx\n" +" jnc .L_copy_two\n" /* if len % 2 == 0 */ + +" rep movsw\n" +" movb (%%rsi), %%al\n" +" movb %%al, (%%rdi)\n" +" incq %%rdi\n" + +" movq %%r8, %%rsi\n" /* move in back to %rsi, toss from */ +" jmp .L_while_test\n" + +".L_copy_two:\n" +" rep movsw\n" +" movq %%r8, %%rsi\n" /* move in back to %rsi, toss from */ +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_check_dist_one:\n" +" cmpl $1, %%r15d\n" /* if dist 1, is a memset */ +" jne .L_check_window\n" +" cmpq %%rdi, 40(%%rsp)\n" /* if out == beg, outside window */ +" je .L_check_window\n" + +" movl %%r14d, %%ecx\n" /* ecx = len */ +" movb -1(%%rdi), %%al\n" +" movb %%al, %%ah\n" + +" sarl %%ecx\n" +" jnc .L_set_two\n" +" movb %%al, (%%rdi)\n" +" incq %%rdi\n" + +".L_set_two:\n" +" rep stosw\n" +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_second_level_length:\n" +" testb $64, %%al\n" +" jnz .L_test_for_end_of_block\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl %%r14d, %%eax\n" /* eax += len */ +" movl (%%rbp,%%rax,4), %%eax\n" /* eax = lcode[val+(hold&mask[op])]*/ +" jmp .L_dolen\n" + +".align 32,0x90\n" +".L_test_for_second_level_dist:\n" +" testb $64, %%al\n" +" jnz .L_invalid_distance_code\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl %%r15d, %%eax\n" /* eax += dist */ +" movl (%%r11,%%rax,4), %%eax\n" /* eax = dcode[val+(hold&mask[op])]*/ +" jmp .L_dodist\n" + +".align 32,0x90\n" +".L_clip_window:\n" +" movl %%eax, %%ecx\n" /* ecx = nbytes */ +" movl 92(%%rsp), %%eax\n" /* eax = wsize, prepare for dist cmp */ +" negl %%ecx\n" /* nbytes = -nbytes */ + +" cmpl %%r15d, %%eax\n" +" jb .L_invalid_distance_too_far\n" /* if (dist > wsize) */ + +" addl %%r15d, %%ecx\n" /* nbytes = dist - nbytes */ +" cmpl $0, 96(%%rsp)\n" +" jne .L_wrap_around_window\n" /* if (write != 0) */ + +" movq 56(%%rsp), %%rsi\n" /* from = window */ +" subl %%ecx, %%eax\n" /* eax -= nbytes */ +" addq %%rax, %%rsi\n" /* from += wsize - nbytes */ + +" movl %%r14d, %%eax\n" /* eax = len */ +" cmpl %%ecx, %%r14d\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* eax -= nbytes */ +" rep movsb\n" +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = &out[ -dist ] */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_wrap_around_window:\n" +" movl 96(%%rsp), %%eax\n" /* eax = write */ +" cmpl %%eax, %%ecx\n" +" jbe .L_contiguous_in_window\n" /* if (write >= nbytes) */ + +" movl 92(%%rsp), %%esi\n" /* from = wsize */ +" addq 56(%%rsp), %%rsi\n" /* from += window */ +" addq %%rax, %%rsi\n" /* from += write */ +" subq %%rcx, %%rsi\n" /* from -= nbytes */ +" subl %%eax, %%ecx\n" /* nbytes -= write */ + +" movl %%r14d, %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movq 56(%%rsp), %%rsi\n" /* from = window */ +" movl 96(%%rsp), %%ecx\n" /* nbytes = write */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = out - dist */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_contiguous_in_window:\n" +" movq 56(%%rsp), %%rsi\n" /* rsi = window */ +" addq %%rax, %%rsi\n" +" subq %%rcx, %%rsi\n" /* from += write - nbytes */ + +" movl %%r14d, %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = out - dist */ +" jmp .L_do_copy\n" /* if (nbytes >= len) */ + +".align 32,0x90\n" +".L_do_copy:\n" +" movl %%eax, %%ecx\n" /* ecx = len */ +" rep movsb\n" + +" movq %%r8, %%rsi\n" /* move in back to %esi, toss from */ +" jmp .L_while_test\n" + +".L_test_for_end_of_block:\n" +" testb $32, %%al\n" +" jz .L_invalid_literal_length_code\n" +" movl $1, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_literal_length_code:\n" +" movl $2, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_code:\n" +" movl $3, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_too_far:\n" +" movl $4, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_break_loop:\n" +" movl $0, 116(%%rsp)\n" + +".L_break_loop_with_status:\n" +/* put in, out, bits, and hold back into ar and pop esp */ +" movq %%rsi, 16(%%rsp)\n" /* in */ +" movq %%rdi, 32(%%rsp)\n" /* out */ +" movl %%ebx, 88(%%rsp)\n" /* bits */ +" movq %%rdx, 80(%%rsp)\n" /* hold */ +" movq (%%rsp), %%rax\n" /* restore rbp and rsp */ +" movq 8(%%rsp), %%rbp\n" +" movq %%rax, %%rsp\n" + : + : "m" (ar) + : "memory", "%rax", "%rbx", "%rcx", "%rdx", "%rsi", "%rdi", + "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" + ); +#elif ( defined( __GNUC__ ) || defined( __ICC ) ) && defined( __i386 ) + __asm__ __volatile__ ( +" leal %0, %%eax\n" +" movl %%esp, (%%eax)\n" /* save esp, ebp */ +" movl %%ebp, 4(%%eax)\n" +" movl %%eax, %%esp\n" +" movl 8(%%esp), %%esi\n" /* esi = in */ +" movl 16(%%esp), %%edi\n" /* edi = out */ +" movl 40(%%esp), %%edx\n" /* edx = hold */ +" movl 44(%%esp), %%ebx\n" /* ebx = bits */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ + +" cld\n" +" jmp .L_do_loop\n" + +".align 32,0x90\n" +".L_while_test:\n" +" cmpl %%edi, 24(%%esp)\n" /* out < end */ +" jbe .L_break_loop\n" +" cmpl %%esi, 12(%%esp)\n" /* in < last */ +" jbe .L_break_loop\n" + +".L_do_loop:\n" +" cmpb $15, %%bl\n" +" ja .L_get_length_code\n" /* if (15 < bits) */ + +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ + +".L_get_length_code:\n" +" movl 56(%%esp), %%eax\n" /* eax = lmask */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" movl (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[hold & lmask] */ + +".L_dolen:\n" +" movb %%ah, %%cl\n" /* cl = this.bits */ +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrl %%cl, %%edx\n" /* hold >>= this.bits */ + +" testb %%al, %%al\n" +" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ + +" shrl $16, %%eax\n" /* output this.val char */ +" stosb\n" +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_length_base:\n" +" movl %%eax, %%ecx\n" /* len = this */ +" shrl $16, %%ecx\n" /* len = this.val */ +" movl %%ecx, 64(%%esp)\n" /* save len */ +" movb %%al, %%cl\n" + +" testb $16, %%al\n" +" jz .L_test_for_second_level_length\n" /* if ((op & 16) == 0) 8% */ +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_decode_distance\n" /* if (!op) */ +" cmpb %%cl, %%bl\n" +" jae .L_add_bits_to_len\n" /* if (op <= bits) */ + +" movb %%cl, %%ch\n" /* stash op in ch, freeing cl */ +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ +" movb %%ch, %%cl\n" /* move op back to ecx */ + +".L_add_bits_to_len:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrl %%cl, %%edx\n" +" addl %%eax, 64(%%esp)\n" /* len += hold & mask[op] */ + +".L_decode_distance:\n" +" cmpb $15, %%bl\n" +" ja .L_get_distance_code\n" /* if (15 < bits) */ + +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ + +".L_get_distance_code:\n" +" movl 60(%%esp), %%eax\n" /* eax = dmask */ +" movl 36(%%esp), %%ecx\n" /* ecx = dcode */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" movl (%%ecx,%%eax,4), %%eax\n"/* eax = dcode[hold & dmask] */ + +".L_dodist:\n" +" movl %%eax, %%ebp\n" /* dist = this */ +" shrl $16, %%ebp\n" /* dist = this.val */ +" movb %%ah, %%cl\n" +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrl %%cl, %%edx\n" /* hold >>= this.bits */ +" movb %%al, %%cl\n" /* cl = this.op */ + +" testb $16, %%al\n" /* if ((op & 16) == 0) */ +" jz .L_test_for_second_level_dist\n" +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_check_dist_one\n" +" cmpb %%cl, %%bl\n" +" jae .L_add_bits_to_dist\n" /* if (op <= bits) 97.6% */ + +" movb %%cl, %%ch\n" /* stash op in ch, freeing cl */ +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ +" movb %%ch, %%cl\n" /* move op back to ecx */ + +".L_add_bits_to_dist:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" /* (1 << op) - 1 */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrl %%cl, %%edx\n" +" addl %%eax, %%ebp\n" /* dist += hold & ((1 << op) - 1) */ + +".L_check_window:\n" +" movl %%esi, 8(%%esp)\n" /* save in so from can use it's reg */ +" movl %%edi, %%eax\n" +" subl 20(%%esp), %%eax\n" /* nbytes = out - beg */ + +" cmpl %%ebp, %%eax\n" +" jb .L_clip_window\n" /* if (dist > nbytes) 4.2% */ + +" movl 64(%%esp), %%ecx\n" /* ecx = len */ +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ + +" sarl %%ecx\n" +" jnc .L_copy_two\n" /* if len % 2 == 0 */ + +" rep movsw\n" +" movb (%%esi), %%al\n" +" movb %%al, (%%edi)\n" +" incl %%edi\n" + +" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".L_copy_two:\n" +" rep movsw\n" +" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_check_dist_one:\n" +" cmpl $1, %%ebp\n" /* if dist 1, is a memset */ +" jne .L_check_window\n" +" cmpl %%edi, 20(%%esp)\n" +" je .L_check_window\n" /* out == beg, if outside window */ + +" movl 64(%%esp), %%ecx\n" /* ecx = len */ +" movb -1(%%edi), %%al\n" +" movb %%al, %%ah\n" + +" sarl %%ecx\n" +" jnc .L_set_two\n" +" movb %%al, (%%edi)\n" +" incl %%edi\n" + +".L_set_two:\n" +" rep stosw\n" +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_second_level_length:\n" +" testb $64, %%al\n" +" jnz .L_test_for_end_of_block\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl 64(%%esp), %%eax\n" /* eax += len */ +" movl (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[val+(hold&mask[op])]*/ +" jmp .L_dolen\n" + +".align 32,0x90\n" +".L_test_for_second_level_dist:\n" +" testb $64, %%al\n" +" jnz .L_invalid_distance_code\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl %%ebp, %%eax\n" /* eax += dist */ +" movl 36(%%esp), %%ecx\n" /* ecx = dcode */ +" movl (%%ecx,%%eax,4), %%eax\n" /* eax = dcode[val+(hold&mask[op])]*/ +" jmp .L_dodist\n" + +".align 32,0x90\n" +".L_clip_window:\n" +" movl %%eax, %%ecx\n" +" movl 48(%%esp), %%eax\n" /* eax = wsize */ +" negl %%ecx\n" /* nbytes = -nbytes */ +" movl 28(%%esp), %%esi\n" /* from = window */ + +" cmpl %%ebp, %%eax\n" +" jb .L_invalid_distance_too_far\n" /* if (dist > wsize) */ + +" addl %%ebp, %%ecx\n" /* nbytes = dist - nbytes */ +" cmpl $0, 52(%%esp)\n" +" jne .L_wrap_around_window\n" /* if (write != 0) */ + +" subl %%ecx, %%eax\n" +" addl %%eax, %%esi\n" /* from += wsize - nbytes */ + +" movl 64(%%esp), %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_wrap_around_window:\n" +" movl 52(%%esp), %%eax\n" /* eax = write */ +" cmpl %%eax, %%ecx\n" +" jbe .L_contiguous_in_window\n" /* if (write >= nbytes) */ + +" addl 48(%%esp), %%esi\n" /* from += wsize */ +" addl %%eax, %%esi\n" /* from += write */ +" subl %%ecx, %%esi\n" /* from -= nbytes */ +" subl %%eax, %%ecx\n" /* nbytes -= write */ + +" movl 64(%%esp), %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl 28(%%esp), %%esi\n" /* from = window */ +" movl 52(%%esp), %%ecx\n" /* nbytes = write */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_contiguous_in_window:\n" +" addl %%eax, %%esi\n" +" subl %%ecx, %%esi\n" /* from += write - nbytes */ + +" movl 64(%%esp), %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ +" jmp .L_do_copy\n" /* if (nbytes >= len) */ + +".align 32,0x90\n" +".L_do_copy:\n" +" movl %%eax, %%ecx\n" +" rep movsb\n" + +" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".L_test_for_end_of_block:\n" +" testb $32, %%al\n" +" jz .L_invalid_literal_length_code\n" +" movl $1, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_literal_length_code:\n" +" movl $2, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_code:\n" +" movl $3, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_too_far:\n" +" movl 8(%%esp), %%esi\n" +" movl $4, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_break_loop:\n" +" movl $0, 72(%%esp)\n" + +".L_break_loop_with_status:\n" +/* put in, out, bits, and hold back into ar and pop esp */ +" movl %%esi, 8(%%esp)\n" /* save in */ +" movl %%edi, 16(%%esp)\n" /* save out */ +" movl %%ebx, 44(%%esp)\n" /* save bits */ +" movl %%edx, 40(%%esp)\n" /* save hold */ +" movl 4(%%esp), %%ebp\n" /* restore esp, ebp */ +" movl (%%esp), %%esp\n" + : + : "m" (ar) + : "memory", "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi" + ); +#elif defined( _MSC_VER ) && ! defined( _M_AMD64 ) + __asm { + lea eax, ar + mov [eax], esp /* save esp, ebp */ + mov [eax+4], ebp + mov esp, eax + mov esi, [esp+8] /* esi = in */ + mov edi, [esp+16] /* edi = out */ + mov edx, [esp+40] /* edx = hold */ + mov ebx, [esp+44] /* ebx = bits */ + mov ebp, [esp+32] /* ebp = lcode */ + + cld + jmp L_do_loop + +ALIGN 4 +L_while_test: + cmp [esp+24], edi + jbe L_break_loop + cmp [esp+12], esi + jbe L_break_loop + +L_do_loop: + cmp bl, 15 + ja L_get_length_code /* if (15 < bits) */ + + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + +L_get_length_code: + mov eax, [esp+56] /* eax = lmask */ + and eax, edx /* eax &= hold */ + mov eax, [ebp+eax*4] /* eax = lcode[hold & lmask] */ + +L_dolen: + mov cl, ah /* cl = this.bits */ + sub bl, ah /* bits -= this.bits */ + shr edx, cl /* hold >>= this.bits */ + + test al, al + jnz L_test_for_length_base /* if (op != 0) 45.7% */ + + shr eax, 16 /* output this.val char */ + stosb + jmp L_while_test + +ALIGN 4 +L_test_for_length_base: + mov ecx, eax /* len = this */ + shr ecx, 16 /* len = this.val */ + mov [esp+64], ecx /* save len */ + mov cl, al + + test al, 16 + jz L_test_for_second_level_length /* if ((op & 16) == 0) 8% */ + and cl, 15 /* op &= 15 */ + jz L_decode_distance /* if (!op) */ + cmp bl, cl + jae L_add_bits_to_len /* if (op <= bits) */ + + mov ch, cl /* stash op in ch, freeing cl */ + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + mov cl, ch /* move op back to ecx */ + +L_add_bits_to_len: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx /* eax &= hold */ + shr edx, cl + add [esp+64], eax /* len += hold & mask[op] */ + +L_decode_distance: + cmp bl, 15 + ja L_get_distance_code /* if (15 < bits) */ + + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + +L_get_distance_code: + mov eax, [esp+60] /* eax = dmask */ + mov ecx, [esp+36] /* ecx = dcode */ + and eax, edx /* eax &= hold */ + mov eax, [ecx+eax*4]/* eax = dcode[hold & dmask] */ + +L_dodist: + mov ebp, eax /* dist = this */ + shr ebp, 16 /* dist = this.val */ + mov cl, ah + sub bl, ah /* bits -= this.bits */ + shr edx, cl /* hold >>= this.bits */ + mov cl, al /* cl = this.op */ + + test al, 16 /* if ((op & 16) == 0) */ + jz L_test_for_second_level_dist + and cl, 15 /* op &= 15 */ + jz L_check_dist_one + cmp bl, cl + jae L_add_bits_to_dist /* if (op <= bits) 97.6% */ + + mov ch, cl /* stash op in ch, freeing cl */ + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + mov cl, ch /* move op back to ecx */ + +L_add_bits_to_dist: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax /* (1 << op) - 1 */ + and eax, edx /* eax &= hold */ + shr edx, cl + add ebp, eax /* dist += hold & ((1 << op) - 1) */ + +L_check_window: + mov [esp+8], esi /* save in so from can use it's reg */ + mov eax, edi + sub eax, [esp+20] /* nbytes = out - beg */ + + cmp eax, ebp + jb L_clip_window /* if (dist > nbytes) 4.2% */ + + mov ecx, [esp+64] /* ecx = len */ + mov esi, edi + sub esi, ebp /* from = out - dist */ + + sar ecx, 1 + jnc L_copy_two + + rep movsw + mov al, [esi] + mov [edi], al + inc edi + + mov esi, [esp+8] /* move in back to %esi, toss from */ + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +L_copy_two: + rep movsw + mov esi, [esp+8] /* move in back to %esi, toss from */ + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +ALIGN 4 +L_check_dist_one: + cmp ebp, 1 /* if dist 1, is a memset */ + jne L_check_window + cmp [esp+20], edi + je L_check_window /* out == beg, if outside window */ + + mov ecx, [esp+64] /* ecx = len */ + mov al, [edi-1] + mov ah, al + + sar ecx, 1 + jnc L_set_two + mov [edi], al /* memset out with from[-1] */ + inc edi + +L_set_two: + rep stosw + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +ALIGN 4 +L_test_for_second_level_length: + test al, 64 + jnz L_test_for_end_of_block /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx /* eax &= hold */ + add eax, [esp+64] /* eax += len */ + mov eax, [ebp+eax*4] /* eax = lcode[val+(hold&mask[op])]*/ + jmp L_dolen + +ALIGN 4 +L_test_for_second_level_dist: + test al, 64 + jnz L_invalid_distance_code /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx /* eax &= hold */ + add eax, ebp /* eax += dist */ + mov ecx, [esp+36] /* ecx = dcode */ + mov eax, [ecx+eax*4] /* eax = dcode[val+(hold&mask[op])]*/ + jmp L_dodist + +ALIGN 4 +L_clip_window: + mov ecx, eax + mov eax, [esp+48] /* eax = wsize */ + neg ecx /* nbytes = -nbytes */ + mov esi, [esp+28] /* from = window */ + + cmp eax, ebp + jb L_invalid_distance_too_far /* if (dist > wsize) */ + + add ecx, ebp /* nbytes = dist - nbytes */ + cmp dword ptr [esp+52], 0 + jne L_wrap_around_window /* if (write != 0) */ + + sub eax, ecx + add esi, eax /* from += wsize - nbytes */ + + mov eax, [esp+64] /* eax = len */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, edi + sub esi, ebp /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_wrap_around_window: + mov eax, [esp+52] /* eax = write */ + cmp ecx, eax + jbe L_contiguous_in_window /* if (write >= nbytes) */ + + add esi, [esp+48] /* from += wsize */ + add esi, eax /* from += write */ + sub esi, ecx /* from -= nbytes */ + sub ecx, eax /* nbytes -= write */ + + mov eax, [esp+64] /* eax = len */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, [esp+28] /* from = window */ + mov ecx, [esp+52] /* nbytes = write */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, edi + sub esi, ebp /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_contiguous_in_window: + add esi, eax + sub esi, ecx /* from += write - nbytes */ + + mov eax, [esp+64] /* eax = len */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, edi + sub esi, ebp /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_do_copy: + mov ecx, eax + rep movsb + + mov esi, [esp+8] /* move in back to %esi, toss from */ + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +L_test_for_end_of_block: + test al, 32 + jz L_invalid_literal_length_code + mov dword ptr [esp+72], 1 + jmp L_break_loop_with_status + +L_invalid_literal_length_code: + mov dword ptr [esp+72], 2 + jmp L_break_loop_with_status + +L_invalid_distance_code: + mov dword ptr [esp+72], 3 + jmp L_break_loop_with_status + +L_invalid_distance_too_far: + mov esi, [esp+4] + mov dword ptr [esp+72], 4 + jmp L_break_loop_with_status + +L_break_loop: + mov dword ptr [esp+72], 0 + +L_break_loop_with_status: +/* put in, out, bits, and hold back into ar and pop esp */ + mov [esp+8], esi /* save in */ + mov [esp+16], edi /* save out */ + mov [esp+44], ebx /* save bits */ + mov [esp+40], edx /* save hold */ + mov ebp, [esp+4] /* restore esp, ebp */ + mov esp, [esp] + } +#else +#error "x86 architecture not defined" +#endif + + if (ar.status > 1) { + if (ar.status == 2) + strm->msg = "invalid literal/length code"; + else if (ar.status == 3) + strm->msg = "invalid distance code"; + else + strm->msg = "invalid distance too far back"; + state->mode = BAD; + } + else if ( ar.status == 1 ) { + state->mode = TYPE; + } + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + ar.len = ar.bits >> 3; + ar.in -= ar.len; + ar.bits -= ar.len << 3; + ar.hold &= (1U << ar.bits) - 1; + + /* update state and return */ + strm->next_in = ar.in; + strm->next_out = ar.out; + strm->avail_in = (unsigned)(ar.in < ar.last ? + PAD_AVAIL_IN + (ar.last - ar.in) : + PAD_AVAIL_IN - (ar.in - ar.last)); + strm->avail_out = (unsigned)(ar.out < ar.end ? + PAD_AVAIL_OUT + (ar.end - ar.out) : + PAD_AVAIL_OUT - (ar.out - ar.end)); + state->hold = ar.hold; + state->bits = ar.bits; + return; +} + diff --git a/externe_kniznice/zlib/contrib/inflate86/inffast.S b/externe_kniznice/zlib/contrib/inflate86/inffast.S new file mode 100644 index 0000000..2245a29 --- /dev/null +++ b/externe_kniznice/zlib/contrib/inflate86/inffast.S @@ -0,0 +1,1368 @@ +/* + * inffast.S is a hand tuned assembler version of: + * + * inffast.c -- fast decoding + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Copyright (C) 2003 Chris Anderson + * Please use the copyright conditions above. + * + * This version (Jan-23-2003) of inflate_fast was coded and tested under + * GNU/Linux on a pentium 3, using the gcc-3.2 compiler distribution. On that + * machine, I found that gzip style archives decompressed about 20% faster than + * the gcc-3.2 -O3 -fomit-frame-pointer compiled version. Your results will + * depend on how large of a buffer is used for z_stream.next_in & next_out + * (8K-32K worked best for my 256K cpu cache) and how much overhead there is in + * stream processing I/O and crc32/addler32. In my case, this routine used + * 70% of the cpu time and crc32 used 20%. + * + * I am confident that this version will work in the general case, but I have + * not tested a wide variety of datasets or a wide variety of platforms. + * + * Jan-24-2003 -- Added -DUSE_MMX define for slightly faster inflating. + * It should be a runtime flag instead of compile time flag... + * + * Jan-26-2003 -- Added runtime check for MMX support with cpuid instruction. + * With -DUSE_MMX, only MMX code is compiled. With -DNO_MMX, only non-MMX code + * is compiled. Without either option, runtime detection is enabled. Runtime + * detection should work on all modern cpus and the recomended algorithm (flip + * ID bit on eflags and then use the cpuid instruction) is used in many + * multimedia applications. Tested under win2k with gcc-2.95 and gas-2.12 + * distributed with cygwin3. Compiling with gcc-2.95 -c inffast.S -o + * inffast.obj generates a COFF object which can then be linked with MSVC++ + * compiled code. Tested under FreeBSD 4.7 with gcc-2.95. + * + * Jan-28-2003 -- Tested Athlon XP... MMX mode is slower than no MMX (and + * slower than compiler generated code). Adjusted cpuid check to use the MMX + * code only for Pentiums < P4 until I have more data on the P4. Speed + * improvment is only about 15% on the Athlon when compared with code generated + * with MSVC++. Not sure yet, but I think the P4 will also be slower using the + * MMX mode because many of it's x86 ALU instructions execute in .5 cycles and + * have less latency than MMX ops. Added code to buffer the last 11 bytes of + * the input stream since the MMX code grabs bits in chunks of 32, which + * differs from the inffast.c algorithm. I don't think there would have been + * read overruns where a page boundary was crossed (a segfault), but there + * could have been overruns when next_in ends on unaligned memory (unintialized + * memory read). + * + * Mar-13-2003 -- P4 MMX is slightly slower than P4 NO_MMX. I created a C + * version of the non-MMX code so that it doesn't depend on zstrm and zstate + * structure offsets which are hard coded in this file. This was last tested + * with zlib-1.2.0 which is currently in beta testing, newer versions of this + * and inffas86.c can be found at http://www.eetbeetee.com/zlib/ and + * http://www.charm.net/~christop/zlib/ + */ + + +/* + * if you have underscore linking problems (_inflate_fast undefined), try + * using -DGAS_COFF + */ +#if ! defined( GAS_COFF ) && ! defined( GAS_ELF ) + +#if defined( WIN32 ) || defined( __CYGWIN__ ) +#define GAS_COFF /* windows object format */ +#else +#define GAS_ELF +#endif + +#endif /* ! GAS_COFF && ! GAS_ELF */ + + +#if defined( GAS_COFF ) + +/* coff externals have underscores */ +#define inflate_fast _inflate_fast +#define inflate_fast_use_mmx _inflate_fast_use_mmx + +#endif /* GAS_COFF */ + + +.file "inffast.S" + +.globl inflate_fast + +.text +.align 4,0 +.L_invalid_literal_length_code_msg: +.string "invalid literal/length code" + +.align 4,0 +.L_invalid_distance_code_msg: +.string "invalid distance code" + +.align 4,0 +.L_invalid_distance_too_far_msg: +.string "invalid distance too far back" + +#if ! defined( NO_MMX ) +.align 4,0 +.L_mask: /* mask[N] = ( 1 << N ) - 1 */ +.long 0 +.long 1 +.long 3 +.long 7 +.long 15 +.long 31 +.long 63 +.long 127 +.long 255 +.long 511 +.long 1023 +.long 2047 +.long 4095 +.long 8191 +.long 16383 +.long 32767 +.long 65535 +.long 131071 +.long 262143 +.long 524287 +.long 1048575 +.long 2097151 +.long 4194303 +.long 8388607 +.long 16777215 +.long 33554431 +.long 67108863 +.long 134217727 +.long 268435455 +.long 536870911 +.long 1073741823 +.long 2147483647 +.long 4294967295 +#endif /* NO_MMX */ + +.text + +/* + * struct z_stream offsets, in zlib.h + */ +#define next_in_strm 0 /* strm->next_in */ +#define avail_in_strm 4 /* strm->avail_in */ +#define next_out_strm 12 /* strm->next_out */ +#define avail_out_strm 16 /* strm->avail_out */ +#define msg_strm 24 /* strm->msg */ +#define state_strm 28 /* strm->state */ + +/* + * struct inflate_state offsets, in inflate.h + */ +#define mode_state 0 /* state->mode */ +#define wsize_state 32 /* state->wsize */ +#define write_state 40 /* state->write */ +#define window_state 44 /* state->window */ +#define hold_state 48 /* state->hold */ +#define bits_state 52 /* state->bits */ +#define lencode_state 68 /* state->lencode */ +#define distcode_state 72 /* state->distcode */ +#define lenbits_state 76 /* state->lenbits */ +#define distbits_state 80 /* state->distbits */ + +/* + * inflate_fast's activation record + */ +#define local_var_size 64 /* how much local space for vars */ +#define strm_sp 88 /* first arg: z_stream * (local_var_size + 24) */ +#define start_sp 92 /* second arg: unsigned int (local_var_size + 28) */ + +/* + * offsets for local vars on stack + */ +#define out 60 /* unsigned char* */ +#define window 56 /* unsigned char* */ +#define wsize 52 /* unsigned int */ +#define write 48 /* unsigned int */ +#define in 44 /* unsigned char* */ +#define beg 40 /* unsigned char* */ +#define buf 28 /* char[ 12 ] */ +#define len 24 /* unsigned int */ +#define last 20 /* unsigned char* */ +#define end 16 /* unsigned char* */ +#define dcode 12 /* code* */ +#define lcode 8 /* code* */ +#define dmask 4 /* unsigned int */ +#define lmask 0 /* unsigned int */ + +/* + * typedef enum inflate_mode consts, in inflate.h + */ +#define INFLATE_MODE_TYPE 11 /* state->mode flags enum-ed in inflate.h */ +#define INFLATE_MODE_BAD 26 + + +#if ! defined( USE_MMX ) && ! defined( NO_MMX ) + +#define RUN_TIME_MMX + +#define CHECK_MMX 1 +#define DO_USE_MMX 2 +#define DONT_USE_MMX 3 + +.globl inflate_fast_use_mmx + +.data + +.align 4,0 +inflate_fast_use_mmx: /* integer flag for run time control 1=check,2=mmx,3=no */ +.long CHECK_MMX + +#if defined( GAS_ELF ) +/* elf info */ +.type inflate_fast_use_mmx,@object +.size inflate_fast_use_mmx,4 +#endif + +#endif /* RUN_TIME_MMX */ + +#if defined( GAS_COFF ) +/* coff info: scl 2 = extern, type 32 = function */ +.def inflate_fast; .scl 2; .type 32; .endef +#endif + +.text + +.align 32,0x90 +inflate_fast: + pushl %edi + pushl %esi + pushl %ebp + pushl %ebx + pushf /* save eflags (strm_sp, state_sp assumes this is 32 bits) */ + subl $local_var_size, %esp + cld + +#define strm_r %esi +#define state_r %edi + + movl strm_sp(%esp), strm_r + movl state_strm(strm_r), state_r + + /* in = strm->next_in; + * out = strm->next_out; + * last = in + strm->avail_in - 11; + * beg = out - (start - strm->avail_out); + * end = out + (strm->avail_out - 257); + */ + movl avail_in_strm(strm_r), %edx + movl next_in_strm(strm_r), %eax + + addl %eax, %edx /* avail_in += next_in */ + subl $11, %edx /* avail_in -= 11 */ + + movl %eax, in(%esp) + movl %edx, last(%esp) + + movl start_sp(%esp), %ebp + movl avail_out_strm(strm_r), %ecx + movl next_out_strm(strm_r), %ebx + + subl %ecx, %ebp /* start -= avail_out */ + negl %ebp /* start = -start */ + addl %ebx, %ebp /* start += next_out */ + + subl $257, %ecx /* avail_out -= 257 */ + addl %ebx, %ecx /* avail_out += out */ + + movl %ebx, out(%esp) + movl %ebp, beg(%esp) + movl %ecx, end(%esp) + + /* wsize = state->wsize; + * write = state->write; + * window = state->window; + * hold = state->hold; + * bits = state->bits; + * lcode = state->lencode; + * dcode = state->distcode; + * lmask = ( 1 << state->lenbits ) - 1; + * dmask = ( 1 << state->distbits ) - 1; + */ + + movl lencode_state(state_r), %eax + movl distcode_state(state_r), %ecx + + movl %eax, lcode(%esp) + movl %ecx, dcode(%esp) + + movl $1, %eax + movl lenbits_state(state_r), %ecx + shll %cl, %eax + decl %eax + movl %eax, lmask(%esp) + + movl $1, %eax + movl distbits_state(state_r), %ecx + shll %cl, %eax + decl %eax + movl %eax, dmask(%esp) + + movl wsize_state(state_r), %eax + movl write_state(state_r), %ecx + movl window_state(state_r), %edx + + movl %eax, wsize(%esp) + movl %ecx, write(%esp) + movl %edx, window(%esp) + + movl hold_state(state_r), %ebp + movl bits_state(state_r), %ebx + +#undef strm_r +#undef state_r + +#define in_r %esi +#define from_r %esi +#define out_r %edi + + movl in(%esp), in_r + movl last(%esp), %ecx + cmpl in_r, %ecx + ja .L_align_long /* if in < last */ + + addl $11, %ecx /* ecx = &in[ avail_in ] */ + subl in_r, %ecx /* ecx = avail_in */ + movl $12, %eax + subl %ecx, %eax /* eax = 12 - avail_in */ + leal buf(%esp), %edi + rep movsb /* memcpy( buf, in, avail_in ) */ + movl %eax, %ecx + xorl %eax, %eax + rep stosb /* memset( &buf[ avail_in ], 0, 12 - avail_in ) */ + leal buf(%esp), in_r /* in = buf */ + movl in_r, last(%esp) /* last = in, do just one iteration */ + jmp .L_is_aligned + + /* align in_r on long boundary */ +.L_align_long: + testl $3, in_r + jz .L_is_aligned + xorl %eax, %eax + movb (in_r), %al + incl in_r + movl %ebx, %ecx + addl $8, %ebx + shll %cl, %eax + orl %eax, %ebp + jmp .L_align_long + +.L_is_aligned: + movl out(%esp), out_r + +#if defined( NO_MMX ) + jmp .L_do_loop +#endif + +#if defined( USE_MMX ) + jmp .L_init_mmx +#endif + +/*** Runtime MMX check ***/ + +#if defined( RUN_TIME_MMX ) +.L_check_mmx: + cmpl $DO_USE_MMX, inflate_fast_use_mmx + je .L_init_mmx + ja .L_do_loop /* > 2 */ + + pushl %eax + pushl %ebx + pushl %ecx + pushl %edx + pushf + movl (%esp), %eax /* copy eflags to eax */ + xorl $0x200000, (%esp) /* try toggling ID bit of eflags (bit 21) + * to see if cpu supports cpuid... + * ID bit method not supported by NexGen but + * bios may load a cpuid instruction and + * cpuid may be disabled on Cyrix 5-6x86 */ + popf + pushf + popl %edx /* copy new eflags to edx */ + xorl %eax, %edx /* test if ID bit is flipped */ + jz .L_dont_use_mmx /* not flipped if zero */ + xorl %eax, %eax + cpuid + cmpl $0x756e6547, %ebx /* check for GenuineIntel in ebx,ecx,edx */ + jne .L_dont_use_mmx + cmpl $0x6c65746e, %ecx + jne .L_dont_use_mmx + cmpl $0x49656e69, %edx + jne .L_dont_use_mmx + movl $1, %eax + cpuid /* get cpu features */ + shrl $8, %eax + andl $15, %eax + cmpl $6, %eax /* check for Pentium family, is 0xf for P4 */ + jne .L_dont_use_mmx + testl $0x800000, %edx /* test if MMX feature is set (bit 23) */ + jnz .L_use_mmx + jmp .L_dont_use_mmx +.L_use_mmx: + movl $DO_USE_MMX, inflate_fast_use_mmx + jmp .L_check_mmx_pop +.L_dont_use_mmx: + movl $DONT_USE_MMX, inflate_fast_use_mmx +.L_check_mmx_pop: + popl %edx + popl %ecx + popl %ebx + popl %eax + jmp .L_check_mmx +#endif + + +/*** Non-MMX code ***/ + +#if defined ( NO_MMX ) || defined( RUN_TIME_MMX ) + +#define hold_r %ebp +#define bits_r %bl +#define bitslong_r %ebx + +.align 32,0x90 +.L_while_test: + /* while (in < last && out < end) + */ + cmpl out_r, end(%esp) + jbe .L_break_loop /* if (out >= end) */ + + cmpl in_r, last(%esp) + jbe .L_break_loop + +.L_do_loop: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out + * + * do { + * if (bits < 15) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * this = lcode[hold & lmask] + */ + cmpb $15, bits_r + ja .L_get_length_code /* if (15 < bits) */ + + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + +.L_get_length_code: + movl lmask(%esp), %edx /* edx = lmask */ + movl lcode(%esp), %ecx /* ecx = lcode */ + andl hold_r, %edx /* edx &= hold */ + movl (%ecx,%edx,4), %eax /* eax = lcode[hold & lmask] */ + +.L_dolen: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out + * + * dolen: + * bits -= this.bits; + * hold >>= this.bits + */ + movb %ah, %cl /* cl = this.bits */ + subb %ah, bits_r /* bits -= this.bits */ + shrl %cl, hold_r /* hold >>= this.bits */ + + /* check if op is a literal + * if (op == 0) { + * PUP(out) = this.val; + * } + */ + testb %al, %al + jnz .L_test_for_length_base /* if (op != 0) 45.7% */ + + shrl $16, %eax /* output this.val char */ + stosb + jmp .L_while_test + +.L_test_for_length_base: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out, %edx = len + * + * else if (op & 16) { + * len = this.val + * op &= 15 + * if (op) { + * if (op > bits) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * len += hold & mask[op]; + * bits -= op; + * hold >>= op; + * } + */ +#define len_r %edx + movl %eax, len_r /* len = this */ + shrl $16, len_r /* len = this.val */ + movb %al, %cl + + testb $16, %al + jz .L_test_for_second_level_length /* if ((op & 16) == 0) 8% */ + andb $15, %cl /* op &= 15 */ + jz .L_save_len /* if (!op) */ + cmpb %cl, bits_r + jae .L_add_bits_to_len /* if (op <= bits) */ + + movb %cl, %ch /* stash op in ch, freeing cl */ + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + movb %ch, %cl /* move op back to ecx */ + +.L_add_bits_to_len: + movl $1, %eax + shll %cl, %eax + decl %eax + subb %cl, bits_r + andl hold_r, %eax /* eax &= hold */ + shrl %cl, hold_r + addl %eax, len_r /* len += hold & mask[op] */ + +.L_save_len: + movl len_r, len(%esp) /* save len */ +#undef len_r + +.L_decode_distance: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * + * if (bits < 15) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * this = dcode[hold & dmask]; + * dodist: + * bits -= this.bits; + * hold >>= this.bits; + * op = this.op; + */ + + cmpb $15, bits_r + ja .L_get_distance_code /* if (15 < bits) */ + + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + +.L_get_distance_code: + movl dmask(%esp), %edx /* edx = dmask */ + movl dcode(%esp), %ecx /* ecx = dcode */ + andl hold_r, %edx /* edx &= hold */ + movl (%ecx,%edx,4), %eax /* eax = dcode[hold & dmask] */ + +#define dist_r %edx +.L_dodist: + movl %eax, dist_r /* dist = this */ + shrl $16, dist_r /* dist = this.val */ + movb %ah, %cl + subb %ah, bits_r /* bits -= this.bits */ + shrl %cl, hold_r /* hold >>= this.bits */ + + /* if (op & 16) { + * dist = this.val + * op &= 15 + * if (op > bits) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * dist += hold & mask[op]; + * bits -= op; + * hold >>= op; + */ + movb %al, %cl /* cl = this.op */ + + testb $16, %al /* if ((op & 16) == 0) */ + jz .L_test_for_second_level_dist + andb $15, %cl /* op &= 15 */ + jz .L_check_dist_one + cmpb %cl, bits_r + jae .L_add_bits_to_dist /* if (op <= bits) 97.6% */ + + movb %cl, %ch /* stash op in ch, freeing cl */ + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + movb %ch, %cl /* move op back to ecx */ + +.L_add_bits_to_dist: + movl $1, %eax + shll %cl, %eax + decl %eax /* (1 << op) - 1 */ + subb %cl, bits_r + andl hold_r, %eax /* eax &= hold */ + shrl %cl, hold_r + addl %eax, dist_r /* dist += hold & ((1 << op) - 1) */ + jmp .L_check_window + +.L_check_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes + * + * nbytes = out - beg; + * if (dist <= nbytes) { + * from = out - dist; + * do { + * PUP(out) = PUP(from); + * } while (--len > 0) { + * } + */ + + movl in_r, in(%esp) /* save in so from can use it's reg */ + movl out_r, %eax + subl beg(%esp), %eax /* nbytes = out - beg */ + + cmpl dist_r, %eax + jb .L_clip_window /* if (dist > nbytes) 4.2% */ + + movl len(%esp), %ecx + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + + subl $3, %ecx + movb (from_r), %al + movb %al, (out_r) + movb 1(from_r), %al + movb 2(from_r), %dl + addl $3, from_r + movb %al, 1(out_r) + movb %dl, 2(out_r) + addl $3, out_r + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + jmp .L_while_test + +.align 16,0x90 +.L_check_dist_one: + cmpl $1, dist_r + jne .L_check_window + cmpl out_r, beg(%esp) + je .L_check_window + + decl out_r + movl len(%esp), %ecx + movb (out_r), %al + subl $3, %ecx + + movb %al, 1(out_r) + movb %al, 2(out_r) + movb %al, 3(out_r) + addl $4, out_r + rep stosb + + jmp .L_while_test + +.align 16,0x90 +.L_test_for_second_level_length: + /* else if ((op & 64) == 0) { + * this = lcode[this.val + (hold & mask[op])]; + * } + */ + testb $64, %al + jnz .L_test_for_end_of_block /* if ((op & 64) != 0) */ + + movl $1, %eax + shll %cl, %eax + decl %eax + andl hold_r, %eax /* eax &= hold */ + addl %edx, %eax /* eax += this.val */ + movl lcode(%esp), %edx /* edx = lcode */ + movl (%edx,%eax,4), %eax /* eax = lcode[val + (hold&mask[op])] */ + jmp .L_dolen + +.align 16,0x90 +.L_test_for_second_level_dist: + /* else if ((op & 64) == 0) { + * this = dcode[this.val + (hold & mask[op])]; + * } + */ + testb $64, %al + jnz .L_invalid_distance_code /* if ((op & 64) != 0) */ + + movl $1, %eax + shll %cl, %eax + decl %eax + andl hold_r, %eax /* eax &= hold */ + addl %edx, %eax /* eax += this.val */ + movl dcode(%esp), %edx /* edx = dcode */ + movl (%edx,%eax,4), %eax /* eax = dcode[val + (hold&mask[op])] */ + jmp .L_dodist + +.align 16,0x90 +.L_clip_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes + * + * else { + * if (dist > wsize) { + * invalid distance + * } + * from = window; + * nbytes = dist - nbytes; + * if (write == 0) { + * from += wsize - nbytes; + */ +#define nbytes_r %ecx + movl %eax, nbytes_r + movl wsize(%esp), %eax /* prepare for dist compare */ + negl nbytes_r /* nbytes = -nbytes */ + movl window(%esp), from_r /* from = window */ + + cmpl dist_r, %eax + jb .L_invalid_distance_too_far /* if (dist > wsize) */ + + addl dist_r, nbytes_r /* nbytes = dist - nbytes */ + cmpl $0, write(%esp) + jne .L_wrap_around_window /* if (write != 0) */ + + subl nbytes_r, %eax + addl %eax, from_r /* from += wsize - nbytes */ + + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes, %eax = len + * + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while (--nbytes); + * from = out - dist; + * } + * } + */ +#define len_r %eax + movl len(%esp), len_r + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1 + + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1 + +.L_wrap_around_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes, %eax = write, %eax = len + * + * else if (write < nbytes) { + * from += wsize + write - nbytes; + * nbytes -= write; + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while (--nbytes); + * from = window; + * nbytes = write; + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while(--nbytes); + * from = out - dist; + * } + * } + * } + */ +#define write_r %eax + movl write(%esp), write_r + cmpl write_r, nbytes_r + jbe .L_contiguous_in_window /* if (write >= nbytes) */ + + addl wsize(%esp), from_r + addl write_r, from_r + subl nbytes_r, from_r /* from += wsize + write - nbytes */ + subl write_r, nbytes_r /* nbytes -= write */ +#undef write_r + + movl len(%esp), len_r + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl window(%esp), from_r /* from = window */ + movl write(%esp), nbytes_r /* nbytes = write */ + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1 + +.L_contiguous_in_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes, %eax = write, %eax = len + * + * else { + * from += write - nbytes; + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while (--nbytes); + * from = out - dist; + * } + * } + */ +#define write_r %eax + addl write_r, from_r + subl nbytes_r, from_r /* from += write - nbytes */ +#undef write_r + + movl len(%esp), len_r + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + +.L_do_copy1: + /* regs: %esi = from, %esi = in, %ebp = hold, %bl = bits, %edi = out + * %eax = len + * + * while (len > 0) { + * PUP(out) = PUP(from); + * len--; + * } + * } + * } while (in < last && out < end); + */ +#undef nbytes_r +#define in_r %esi + movl len_r, %ecx + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + jmp .L_while_test + +#undef len_r +#undef dist_r + +#endif /* NO_MMX || RUN_TIME_MMX */ + + +/*** MMX code ***/ + +#if defined( USE_MMX ) || defined( RUN_TIME_MMX ) + +.align 32,0x90 +.L_init_mmx: + emms + +#undef bits_r +#undef bitslong_r +#define bitslong_r %ebp +#define hold_mm %mm0 + movd %ebp, hold_mm + movl %ebx, bitslong_r + +#define used_mm %mm1 +#define dmask2_mm %mm2 +#define lmask2_mm %mm3 +#define lmask_mm %mm4 +#define dmask_mm %mm5 +#define tmp_mm %mm6 + + movd lmask(%esp), lmask_mm + movq lmask_mm, lmask2_mm + movd dmask(%esp), dmask_mm + movq dmask_mm, dmask2_mm + pxor used_mm, used_mm + movl lcode(%esp), %ebx /* ebx = lcode */ + jmp .L_do_loop_mmx + +.align 32,0x90 +.L_while_test_mmx: + /* while (in < last && out < end) + */ + cmpl out_r, end(%esp) + jbe .L_break_loop /* if (out >= end) */ + + cmpl in_r, last(%esp) + jbe .L_break_loop + +.L_do_loop_mmx: + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + + cmpl $32, bitslong_r + ja .L_get_length_code_mmx /* if (32 < bits) */ + + movd bitslong_r, tmp_mm + movd (in_r), %mm7 + addl $4, in_r + psllq tmp_mm, %mm7 + addl $32, bitslong_r + por %mm7, hold_mm /* hold_mm |= *((uint *)in)++ << bits */ + +.L_get_length_code_mmx: + pand hold_mm, lmask_mm + movd lmask_mm, %eax + movq lmask2_mm, lmask_mm + movl (%ebx,%eax,4), %eax /* eax = lcode[hold & lmask] */ + +.L_dolen_mmx: + movzbl %ah, %ecx /* ecx = this.bits */ + movd %ecx, used_mm + subl %ecx, bitslong_r /* bits -= this.bits */ + + testb %al, %al + jnz .L_test_for_length_base_mmx /* if (op != 0) 45.7% */ + + shrl $16, %eax /* output this.val char */ + stosb + jmp .L_while_test_mmx + +.L_test_for_length_base_mmx: +#define len_r %edx + movl %eax, len_r /* len = this */ + shrl $16, len_r /* len = this.val */ + + testb $16, %al + jz .L_test_for_second_level_length_mmx /* if ((op & 16) == 0) 8% */ + andl $15, %eax /* op &= 15 */ + jz .L_decode_distance_mmx /* if (!op) */ + + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd %eax, used_mm + movd hold_mm, %ecx + subl %eax, bitslong_r + andl .L_mask(,%eax,4), %ecx + addl %ecx, len_r /* len += hold & mask[op] */ + +.L_decode_distance_mmx: + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + + cmpl $32, bitslong_r + ja .L_get_dist_code_mmx /* if (32 < bits) */ + + movd bitslong_r, tmp_mm + movd (in_r), %mm7 + addl $4, in_r + psllq tmp_mm, %mm7 + addl $32, bitslong_r + por %mm7, hold_mm /* hold_mm |= *((uint *)in)++ << bits */ + +.L_get_dist_code_mmx: + movl dcode(%esp), %ebx /* ebx = dcode */ + pand hold_mm, dmask_mm + movd dmask_mm, %eax + movq dmask2_mm, dmask_mm + movl (%ebx,%eax,4), %eax /* eax = dcode[hold & lmask] */ + +.L_dodist_mmx: +#define dist_r %ebx + movzbl %ah, %ecx /* ecx = this.bits */ + movl %eax, dist_r + shrl $16, dist_r /* dist = this.val */ + subl %ecx, bitslong_r /* bits -= this.bits */ + movd %ecx, used_mm + + testb $16, %al /* if ((op & 16) == 0) */ + jz .L_test_for_second_level_dist_mmx + andl $15, %eax /* op &= 15 */ + jz .L_check_dist_one_mmx + +.L_add_bits_to_dist_mmx: + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd %eax, used_mm /* save bit length of current op */ + movd hold_mm, %ecx /* get the next bits on input stream */ + subl %eax, bitslong_r /* bits -= op bits */ + andl .L_mask(,%eax,4), %ecx /* ecx = hold & mask[op] */ + addl %ecx, dist_r /* dist += hold & mask[op] */ + +.L_check_window_mmx: + movl in_r, in(%esp) /* save in so from can use it's reg */ + movl out_r, %eax + subl beg(%esp), %eax /* nbytes = out - beg */ + + cmpl dist_r, %eax + jb .L_clip_window_mmx /* if (dist > nbytes) 4.2% */ + + movl len_r, %ecx + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + + subl $3, %ecx + movb (from_r), %al + movb %al, (out_r) + movb 1(from_r), %al + movb 2(from_r), %dl + addl $3, from_r + movb %al, 1(out_r) + movb %dl, 2(out_r) + addl $3, out_r + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */ + jmp .L_while_test_mmx + +.align 16,0x90 +.L_check_dist_one_mmx: + cmpl $1, dist_r + jne .L_check_window_mmx + cmpl out_r, beg(%esp) + je .L_check_window_mmx + + decl out_r + movl len_r, %ecx + movb (out_r), %al + subl $3, %ecx + + movb %al, 1(out_r) + movb %al, 2(out_r) + movb %al, 3(out_r) + addl $4, out_r + rep stosb + + movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */ + jmp .L_while_test_mmx + +.align 16,0x90 +.L_test_for_second_level_length_mmx: + testb $64, %al + jnz .L_test_for_end_of_block /* if ((op & 64) != 0) */ + + andl $15, %eax + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd hold_mm, %ecx + andl .L_mask(,%eax,4), %ecx + addl len_r, %ecx + movl (%ebx,%ecx,4), %eax /* eax = lcode[hold & lmask] */ + jmp .L_dolen_mmx + +.align 16,0x90 +.L_test_for_second_level_dist_mmx: + testb $64, %al + jnz .L_invalid_distance_code /* if ((op & 64) != 0) */ + + andl $15, %eax + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd hold_mm, %ecx + andl .L_mask(,%eax,4), %ecx + movl dcode(%esp), %eax /* ecx = dcode */ + addl dist_r, %ecx + movl (%eax,%ecx,4), %eax /* eax = lcode[hold & lmask] */ + jmp .L_dodist_mmx + +.align 16,0x90 +.L_clip_window_mmx: +#define nbytes_r %ecx + movl %eax, nbytes_r + movl wsize(%esp), %eax /* prepare for dist compare */ + negl nbytes_r /* nbytes = -nbytes */ + movl window(%esp), from_r /* from = window */ + + cmpl dist_r, %eax + jb .L_invalid_distance_too_far /* if (dist > wsize) */ + + addl dist_r, nbytes_r /* nbytes = dist - nbytes */ + cmpl $0, write(%esp) + jne .L_wrap_around_window_mmx /* if (write != 0) */ + + subl nbytes_r, %eax + addl %eax, from_r /* from += wsize - nbytes */ + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1_mmx + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1_mmx + +.L_wrap_around_window_mmx: +#define write_r %eax + movl write(%esp), write_r + cmpl write_r, nbytes_r + jbe .L_contiguous_in_window_mmx /* if (write >= nbytes) */ + + addl wsize(%esp), from_r + addl write_r, from_r + subl nbytes_r, from_r /* from += wsize + write - nbytes */ + subl write_r, nbytes_r /* nbytes -= write */ +#undef write_r + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl window(%esp), from_r /* from = window */ + movl write(%esp), nbytes_r /* nbytes = write */ + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1_mmx + +.L_contiguous_in_window_mmx: +#define write_r %eax + addl write_r, from_r + subl nbytes_r, from_r /* from += write - nbytes */ +#undef write_r + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + +.L_do_copy1_mmx: +#undef nbytes_r +#define in_r %esi + movl len_r, %ecx + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */ + jmp .L_while_test_mmx + +#undef hold_r +#undef bitslong_r + +#endif /* USE_MMX || RUN_TIME_MMX */ + + +/*** USE_MMX, NO_MMX, and RUNTIME_MMX from here on ***/ + +.L_invalid_distance_code: + /* else { + * strm->msg = "invalid distance code"; + * state->mode = BAD; + * } + */ + movl $.L_invalid_distance_code_msg, %ecx + movl $INFLATE_MODE_BAD, %edx + jmp .L_update_stream_state + +.L_test_for_end_of_block: + /* else if (op & 32) { + * state->mode = TYPE; + * break; + * } + */ + testb $32, %al + jz .L_invalid_literal_length_code /* if ((op & 32) == 0) */ + + movl $0, %ecx + movl $INFLATE_MODE_TYPE, %edx + jmp .L_update_stream_state + +.L_invalid_literal_length_code: + /* else { + * strm->msg = "invalid literal/length code"; + * state->mode = BAD; + * } + */ + movl $.L_invalid_literal_length_code_msg, %ecx + movl $INFLATE_MODE_BAD, %edx + jmp .L_update_stream_state + +.L_invalid_distance_too_far: + /* strm->msg = "invalid distance too far back"; + * state->mode = BAD; + */ + movl in(%esp), in_r /* from_r has in's reg, put in back */ + movl $.L_invalid_distance_too_far_msg, %ecx + movl $INFLATE_MODE_BAD, %edx + jmp .L_update_stream_state + +.L_update_stream_state: + /* set strm->msg = %ecx, strm->state->mode = %edx */ + movl strm_sp(%esp), %eax + testl %ecx, %ecx /* if (msg != NULL) */ + jz .L_skip_msg + movl %ecx, msg_strm(%eax) /* strm->msg = msg */ +.L_skip_msg: + movl state_strm(%eax), %eax /* state = strm->state */ + movl %edx, mode_state(%eax) /* state->mode = edx (BAD | TYPE) */ + jmp .L_break_loop + +.align 32,0x90 +.L_break_loop: + +/* + * Regs: + * + * bits = %ebp when mmx, and in %ebx when non-mmx + * hold = %hold_mm when mmx, and in %ebp when non-mmx + * in = %esi + * out = %edi + */ + +#if defined( USE_MMX ) || defined( RUN_TIME_MMX ) + +#if defined( RUN_TIME_MMX ) + + cmpl $DO_USE_MMX, inflate_fast_use_mmx + jne .L_update_next_in + +#endif /* RUN_TIME_MMX */ + + movl %ebp, %ebx + +.L_update_next_in: + +#endif + +#define strm_r %eax +#define state_r %edx + + /* len = bits >> 3; + * in -= len; + * bits -= len << 3; + * hold &= (1U << bits) - 1; + * state->hold = hold; + * state->bits = bits; + * strm->next_in = in; + * strm->next_out = out; + */ + movl strm_sp(%esp), strm_r + movl %ebx, %ecx + movl state_strm(strm_r), state_r + shrl $3, %ecx + subl %ecx, in_r + shll $3, %ecx + subl %ecx, %ebx + movl out_r, next_out_strm(strm_r) + movl %ebx, bits_state(state_r) + movl %ebx, %ecx + + leal buf(%esp), %ebx + cmpl %ebx, last(%esp) + jne .L_buf_not_used /* if buf != last */ + + subl %ebx, in_r /* in -= buf */ + movl next_in_strm(strm_r), %ebx + movl %ebx, last(%esp) /* last = strm->next_in */ + addl %ebx, in_r /* in += strm->next_in */ + movl avail_in_strm(strm_r), %ebx + subl $11, %ebx + addl %ebx, last(%esp) /* last = &strm->next_in[ avail_in - 11 ] */ + +.L_buf_not_used: + movl in_r, next_in_strm(strm_r) + + movl $1, %ebx + shll %cl, %ebx + decl %ebx + +#if defined( USE_MMX ) || defined( RUN_TIME_MMX ) + +#if defined( RUN_TIME_MMX ) + + cmpl $DO_USE_MMX, inflate_fast_use_mmx + jne .L_update_hold + +#endif /* RUN_TIME_MMX */ + + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd hold_mm, %ebp + + emms + +.L_update_hold: + +#endif /* USE_MMX || RUN_TIME_MMX */ + + andl %ebx, %ebp + movl %ebp, hold_state(state_r) + +#define last_r %ebx + + /* strm->avail_in = in < last ? 11 + (last - in) : 11 - (in - last) */ + movl last(%esp), last_r + cmpl in_r, last_r + jbe .L_last_is_smaller /* if (in >= last) */ + + subl in_r, last_r /* last -= in */ + addl $11, last_r /* last += 11 */ + movl last_r, avail_in_strm(strm_r) + jmp .L_fixup_out +.L_last_is_smaller: + subl last_r, in_r /* in -= last */ + negl in_r /* in = -in */ + addl $11, in_r /* in += 11 */ + movl in_r, avail_in_strm(strm_r) + +#undef last_r +#define end_r %ebx + +.L_fixup_out: + /* strm->avail_out = out < end ? 257 + (end - out) : 257 - (out - end)*/ + movl end(%esp), end_r + cmpl out_r, end_r + jbe .L_end_is_smaller /* if (out >= end) */ + + subl out_r, end_r /* end -= out */ + addl $257, end_r /* end += 257 */ + movl end_r, avail_out_strm(strm_r) + jmp .L_done +.L_end_is_smaller: + subl end_r, out_r /* out -= end */ + negl out_r /* out = -out */ + addl $257, out_r /* out += 257 */ + movl out_r, avail_out_strm(strm_r) + +#undef end_r +#undef strm_r +#undef state_r + +.L_done: + addl $local_var_size, %esp + popf + popl %ebx + popl %ebp + popl %esi + popl %edi + ret + +#if defined( GAS_ELF ) +/* elf info */ +.type inflate_fast,@function +.size inflate_fast,.-inflate_fast +#endif diff --git a/externe_kniznice/zlib/contrib/iostream/test.cpp b/externe_kniznice/zlib/contrib/iostream/test.cpp new file mode 100644 index 0000000..7d265b3 --- /dev/null +++ b/externe_kniznice/zlib/contrib/iostream/test.cpp @@ -0,0 +1,24 @@ + +#include "zfstream.h" + +int main() { + + // Construct a stream object with this filebuffer. Anything sent + // to this stream will go to standard out. + gzofstream os( 1, ios::out ); + + // This text is getting compressed and sent to stdout. + // To prove this, run 'test | zcat'. + os << "Hello, Mommy" << endl; + + os << setcompressionlevel( Z_NO_COMPRESSION ); + os << "hello, hello, hi, ho!" << endl; + + setcompressionlevel( os, Z_DEFAULT_COMPRESSION ) + << "I'm compressing again" << endl; + + os.close(); + + return 0; + +} diff --git a/externe_kniznice/zlib/contrib/iostream/zfstream.cpp b/externe_kniznice/zlib/contrib/iostream/zfstream.cpp new file mode 100644 index 0000000..d0cd85f --- /dev/null +++ b/externe_kniznice/zlib/contrib/iostream/zfstream.cpp @@ -0,0 +1,329 @@ + +#include "zfstream.h" + +gzfilebuf::gzfilebuf() : + file(NULL), + mode(0), + own_file_descriptor(0) +{ } + +gzfilebuf::~gzfilebuf() { + + sync(); + if ( own_file_descriptor ) + close(); + +} + +gzfilebuf *gzfilebuf::open( const char *name, + int io_mode ) { + + if ( is_open() ) + return NULL; + + char char_mode[10]; + char *p = char_mode; + + if ( io_mode & ios::in ) { + mode = ios::in; + *p++ = 'r'; + } else if ( io_mode & ios::app ) { + mode = ios::app; + *p++ = 'a'; + } else { + mode = ios::out; + *p++ = 'w'; + } + + if ( io_mode & ios::binary ) { + mode |= ios::binary; + *p++ = 'b'; + } + + // Hard code the compression level + if ( io_mode & (ios::out|ios::app )) { + *p++ = '9'; + } + + // Put the end-of-string indicator + *p = '\0'; + + if ( (file = gzopen(name, char_mode)) == NULL ) + return NULL; + + own_file_descriptor = 1; + + return this; + +} + +gzfilebuf *gzfilebuf::attach( int file_descriptor, + int io_mode ) { + + if ( is_open() ) + return NULL; + + char char_mode[10]; + char *p = char_mode; + + if ( io_mode & ios::in ) { + mode = ios::in; + *p++ = 'r'; + } else if ( io_mode & ios::app ) { + mode = ios::app; + *p++ = 'a'; + } else { + mode = ios::out; + *p++ = 'w'; + } + + if ( io_mode & ios::binary ) { + mode |= ios::binary; + *p++ = 'b'; + } + + // Hard code the compression level + if ( io_mode & (ios::out|ios::app )) { + *p++ = '9'; + } + + // Put the end-of-string indicator + *p = '\0'; + + if ( (file = gzdopen(file_descriptor, char_mode)) == NULL ) + return NULL; + + own_file_descriptor = 0; + + return this; + +} + +gzfilebuf *gzfilebuf::close() { + + if ( is_open() ) { + + sync(); + gzclose( file ); + file = NULL; + + } + + return this; + +} + +int gzfilebuf::setcompressionlevel( int comp_level ) { + + return gzsetparams(file, comp_level, -2); + +} + +int gzfilebuf::setcompressionstrategy( int comp_strategy ) { + + return gzsetparams(file, -2, comp_strategy); + +} + + +streampos gzfilebuf::seekoff( streamoff off, ios::seek_dir dir, int which ) { + + return streampos(EOF); + +} + +int gzfilebuf::underflow() { + + // If the file hasn't been opened for reading, error. + if ( !is_open() || !(mode & ios::in) ) + return EOF; + + // if a buffer doesn't exists, allocate one. + if ( !base() ) { + + if ( (allocate()) == EOF ) + return EOF; + setp(0,0); + + } else { + + if ( in_avail() ) + return (unsigned char) *gptr(); + + if ( out_waiting() ) { + if ( flushbuf() == EOF ) + return EOF; + } + + } + + // Attempt to fill the buffer. + + int result = fillbuf(); + if ( result == EOF ) { + // disable get area + setg(0,0,0); + return EOF; + } + + return (unsigned char) *gptr(); + +} + +int gzfilebuf::overflow( int c ) { + + if ( !is_open() || !(mode & ios::out) ) + return EOF; + + if ( !base() ) { + if ( allocate() == EOF ) + return EOF; + setg(0,0,0); + } else { + if (in_avail()) { + return EOF; + } + if (out_waiting()) { + if (flushbuf() == EOF) + return EOF; + } + } + + int bl = blen(); + setp( base(), base() + bl); + + if ( c != EOF ) { + + *pptr() = c; + pbump(1); + + } + + return 0; + +} + +int gzfilebuf::sync() { + + if ( !is_open() ) + return EOF; + + if ( out_waiting() ) + return flushbuf(); + + return 0; + +} + +int gzfilebuf::flushbuf() { + + int n; + char *q; + + q = pbase(); + n = pptr() - q; + + if ( gzwrite( file, q, n) < n ) + return EOF; + + setp(0,0); + + return 0; + +} + +int gzfilebuf::fillbuf() { + + int required; + char *p; + + p = base(); + + required = blen(); + + int t = gzread( file, p, required ); + + if ( t <= 0) return EOF; + + setg( base(), base(), base()+t); + + return t; + +} + +gzfilestream_common::gzfilestream_common() : + ios( gzfilestream_common::rdbuf() ) +{ } + +gzfilestream_common::~gzfilestream_common() +{ } + +void gzfilestream_common::attach( int fd, int io_mode ) { + + if ( !buffer.attach( fd, io_mode) ) + clear( ios::failbit | ios::badbit ); + else + clear(); + +} + +void gzfilestream_common::open( const char *name, int io_mode ) { + + if ( !buffer.open( name, io_mode ) ) + clear( ios::failbit | ios::badbit ); + else + clear(); + +} + +void gzfilestream_common::close() { + + if ( !buffer.close() ) + clear( ios::failbit | ios::badbit ); + +} + +gzfilebuf *gzfilestream_common::rdbuf() +{ + return &buffer; +} + +gzifstream::gzifstream() : + ios( gzfilestream_common::rdbuf() ) +{ + clear( ios::badbit ); +} + +gzifstream::gzifstream( const char *name, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::open( name, io_mode ); +} + +gzifstream::gzifstream( int fd, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::attach( fd, io_mode ); +} + +gzifstream::~gzifstream() { } + +gzofstream::gzofstream() : + ios( gzfilestream_common::rdbuf() ) +{ + clear( ios::badbit ); +} + +gzofstream::gzofstream( const char *name, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::open( name, io_mode ); +} + +gzofstream::gzofstream( int fd, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::attach( fd, io_mode ); +} + +gzofstream::~gzofstream() { } diff --git a/externe_kniznice/zlib/contrib/iostream/zfstream.h b/externe_kniznice/zlib/contrib/iostream/zfstream.h new file mode 100644 index 0000000..ed79098 --- /dev/null +++ b/externe_kniznice/zlib/contrib/iostream/zfstream.h @@ -0,0 +1,128 @@ + +#ifndef zfstream_h +#define zfstream_h + +#include +#include "zlib.h" + +class gzfilebuf : public streambuf { + +public: + + gzfilebuf( ); + virtual ~gzfilebuf(); + + gzfilebuf *open( const char *name, int io_mode ); + gzfilebuf *attach( int file_descriptor, int io_mode ); + gzfilebuf *close(); + + int setcompressionlevel( int comp_level ); + int setcompressionstrategy( int comp_strategy ); + + inline int is_open() const { return (file !=NULL); } + + virtual streampos seekoff( streamoff, ios::seek_dir, int ); + + virtual int sync(); + +protected: + + virtual int underflow(); + virtual int overflow( int = EOF ); + +private: + + gzFile file; + short mode; + short own_file_descriptor; + + int flushbuf(); + int fillbuf(); + +}; + +class gzfilestream_common : virtual public ios { + + friend class gzifstream; + friend class gzofstream; + friend gzofstream &setcompressionlevel( gzofstream &, int ); + friend gzofstream &setcompressionstrategy( gzofstream &, int ); + +public: + virtual ~gzfilestream_common(); + + void attach( int fd, int io_mode ); + void open( const char *name, int io_mode ); + void close(); + +protected: + gzfilestream_common(); + +private: + gzfilebuf *rdbuf(); + + gzfilebuf buffer; + +}; + +class gzifstream : public gzfilestream_common, public istream { + +public: + + gzifstream(); + gzifstream( const char *name, int io_mode = ios::in ); + gzifstream( int fd, int io_mode = ios::in ); + + virtual ~gzifstream(); + +}; + +class gzofstream : public gzfilestream_common, public ostream { + +public: + + gzofstream(); + gzofstream( const char *name, int io_mode = ios::out ); + gzofstream( int fd, int io_mode = ios::out ); + + virtual ~gzofstream(); + +}; + +template class gzomanip { + friend gzofstream &operator<<(gzofstream &, const gzomanip &); +public: + gzomanip(gzofstream &(*f)(gzofstream &, T), T v) : func(f), val(v) { } +private: + gzofstream &(*func)(gzofstream &, T); + T val; +}; + +template gzofstream &operator<<(gzofstream &s, const gzomanip &m) +{ + return (*m.func)(s, m.val); +} + +inline gzofstream &setcompressionlevel( gzofstream &s, int l ) +{ + (s.rdbuf())->setcompressionlevel(l); + return s; +} + +inline gzofstream &setcompressionstrategy( gzofstream &s, int l ) +{ + (s.rdbuf())->setcompressionstrategy(l); + return s; +} + +inline gzomanip setcompressionlevel(int l) +{ + return gzomanip(&setcompressionlevel,l); +} + +inline gzomanip setcompressionstrategy(int l) +{ + return gzomanip(&setcompressionstrategy,l); +} + +#endif diff --git a/externe_kniznice/zlib/contrib/iostream2/zstream.h b/externe_kniznice/zlib/contrib/iostream2/zstream.h new file mode 100644 index 0000000..43d2332 --- /dev/null +++ b/externe_kniznice/zlib/contrib/iostream2/zstream.h @@ -0,0 +1,307 @@ +/* + * + * Copyright (c) 1997 + * Christian Michelsen Research AS + * Advanced Computing + * Fantoftvegen 38, 5036 BERGEN, Norway + * http://www.cmr.no + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Christian Michelsen Research AS makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +#ifndef ZSTREAM__H +#define ZSTREAM__H + +/* + * zstream.h - C++ interface to the 'zlib' general purpose compression library + * $Id: zstream.h 1.1 1997-06-25 12:00:56+02 tyge Exp tyge $ + */ + +#include +#include +#include +#include "zlib.h" + +#if defined(_WIN32) +# include +# include +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +class zstringlen { +public: + zstringlen(class izstream&); + zstringlen(class ozstream&, const char*); + size_t value() const { return val.word; } +private: + struct Val { unsigned char byte; size_t word; } val; +}; + +// ----------------------------- izstream ----------------------------- + +class izstream +{ + public: + izstream() : m_fp(0) {} + izstream(FILE* fp) : m_fp(0) { open(fp); } + izstream(const char* name) : m_fp(0) { open(name); } + ~izstream() { close(); } + + /* Opens a gzip (.gz) file for reading. + * open() can be used to read a file which is not in gzip format; + * in this case read() will directly read from the file without + * decompression. errno can be checked to distinguish two error + * cases (if errno is zero, the zlib error is Z_MEM_ERROR). + */ + void open(const char* name) { + if (m_fp) close(); + m_fp = ::gzopen(name, "rb"); + } + + void open(FILE* fp) { + SET_BINARY_MODE(fp); + if (m_fp) close(); + m_fp = ::gzdopen(fileno(fp), "rb"); + } + + /* Flushes all pending input if necessary, closes the compressed file + * and deallocates all the (de)compression state. The return value is + * the zlib error number (see function error() below). + */ + int close() { + int r = ::gzclose(m_fp); + m_fp = 0; return r; + } + + /* Binary read the given number of bytes from the compressed file. + */ + int read(void* buf, size_t len) { + return ::gzread(m_fp, buf, len); + } + + /* Returns the error message for the last error which occurred on the + * given compressed file. errnum is set to zlib error number. If an + * error occurred in the file system and not in the compression library, + * errnum is set to Z_ERRNO and the application may consult errno + * to get the exact error code. + */ + const char* error(int* errnum) { + return ::gzerror(m_fp, errnum); + } + + gzFile fp() { return m_fp; } + + private: + gzFile m_fp; +}; + +/* + * Binary read the given (array of) object(s) from the compressed file. + * If the input file was not in gzip format, read() copies the objects number + * of bytes into the buffer. + * returns the number of uncompressed bytes actually read + * (0 for end of file, -1 for error). + */ +template +inline int read(izstream& zs, T* x, Items items) { + return ::gzread(zs.fp(), x, items*sizeof(T)); +} + +/* + * Binary input with the '>' operator. + */ +template +inline izstream& operator>(izstream& zs, T& x) { + ::gzread(zs.fp(), &x, sizeof(T)); + return zs; +} + + +inline zstringlen::zstringlen(izstream& zs) { + zs > val.byte; + if (val.byte == 255) zs > val.word; + else val.word = val.byte; +} + +/* + * Read length of string + the string with the '>' operator. + */ +inline izstream& operator>(izstream& zs, char* x) { + zstringlen len(zs); + ::gzread(zs.fp(), x, len.value()); + x[len.value()] = '\0'; + return zs; +} + +inline char* read_string(izstream& zs) { + zstringlen len(zs); + char* x = new char[len.value()+1]; + ::gzread(zs.fp(), x, len.value()); + x[len.value()] = '\0'; + return x; +} + +// ----------------------------- ozstream ----------------------------- + +class ozstream +{ + public: + ozstream() : m_fp(0), m_os(0) { + } + ozstream(FILE* fp, int level = Z_DEFAULT_COMPRESSION) + : m_fp(0), m_os(0) { + open(fp, level); + } + ozstream(const char* name, int level = Z_DEFAULT_COMPRESSION) + : m_fp(0), m_os(0) { + open(name, level); + } + ~ozstream() { + close(); + } + + /* Opens a gzip (.gz) file for writing. + * The compression level parameter should be in 0..9 + * errno can be checked to distinguish two error cases + * (if errno is zero, the zlib error is Z_MEM_ERROR). + */ + void open(const char* name, int level = Z_DEFAULT_COMPRESSION) { + char mode[4] = "wb\0"; + if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level; + if (m_fp) close(); + m_fp = ::gzopen(name, mode); + } + + /* open from a FILE pointer. + */ + void open(FILE* fp, int level = Z_DEFAULT_COMPRESSION) { + SET_BINARY_MODE(fp); + char mode[4] = "wb\0"; + if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level; + if (m_fp) close(); + m_fp = ::gzdopen(fileno(fp), mode); + } + + /* Flushes all pending output if necessary, closes the compressed file + * and deallocates all the (de)compression state. The return value is + * the zlib error number (see function error() below). + */ + int close() { + if (m_os) { + ::gzwrite(m_fp, m_os->str(), m_os->pcount()); + delete[] m_os->str(); delete m_os; m_os = 0; + } + int r = ::gzclose(m_fp); m_fp = 0; return r; + } + + /* Binary write the given number of bytes into the compressed file. + */ + int write(const void* buf, size_t len) { + return ::gzwrite(m_fp, (voidp) buf, len); + } + + /* Flushes all pending output into the compressed file. The parameter + * _flush is as in the deflate() function. The return value is the zlib + * error number (see function gzerror below). flush() returns Z_OK if + * the flush_ parameter is Z_FINISH and all output could be flushed. + * flush() should be called only when strictly necessary because it can + * degrade compression. + */ + int flush(int _flush) { + os_flush(); + return ::gzflush(m_fp, _flush); + } + + /* Returns the error message for the last error which occurred on the + * given compressed file. errnum is set to zlib error number. If an + * error occurred in the file system and not in the compression library, + * errnum is set to Z_ERRNO and the application may consult errno + * to get the exact error code. + */ + const char* error(int* errnum) { + return ::gzerror(m_fp, errnum); + } + + gzFile fp() { return m_fp; } + + ostream& os() { + if (m_os == 0) m_os = new ostrstream; + return *m_os; + } + + void os_flush() { + if (m_os && m_os->pcount()>0) { + ostrstream* oss = new ostrstream; + oss->fill(m_os->fill()); + oss->flags(m_os->flags()); + oss->precision(m_os->precision()); + oss->width(m_os->width()); + ::gzwrite(m_fp, m_os->str(), m_os->pcount()); + delete[] m_os->str(); delete m_os; m_os = oss; + } + } + + private: + gzFile m_fp; + ostrstream* m_os; +}; + +/* + * Binary write the given (array of) object(s) into the compressed file. + * returns the number of uncompressed bytes actually written + * (0 in case of error). + */ +template +inline int write(ozstream& zs, const T* x, Items items) { + return ::gzwrite(zs.fp(), (voidp) x, items*sizeof(T)); +} + +/* + * Binary output with the '<' operator. + */ +template +inline ozstream& operator<(ozstream& zs, const T& x) { + ::gzwrite(zs.fp(), (voidp) &x, sizeof(T)); + return zs; +} + +inline zstringlen::zstringlen(ozstream& zs, const char* x) { + val.byte = 255; val.word = ::strlen(x); + if (val.word < 255) zs < (val.byte = val.word); + else zs < val; +} + +/* + * Write length of string + the string with the '<' operator. + */ +inline ozstream& operator<(ozstream& zs, const char* x) { + zstringlen len(zs, x); + ::gzwrite(zs.fp(), (voidp) x, len.value()); + return zs; +} + +#ifdef _MSC_VER +inline ozstream& operator<(ozstream& zs, char* const& x) { + return zs < (const char*) x; +} +#endif + +/* + * Ascii write with the << operator; + */ +template +inline ostream& operator<<(ozstream& zs, const T& x) { + zs.os_flush(); + return zs.os() << x; +} + +#endif diff --git a/externe_kniznice/zlib/contrib/iostream2/zstream_test.cpp b/externe_kniznice/zlib/contrib/iostream2/zstream_test.cpp new file mode 100644 index 0000000..6273f62 --- /dev/null +++ b/externe_kniznice/zlib/contrib/iostream2/zstream_test.cpp @@ -0,0 +1,25 @@ +#include "zstream.h" +#include +#include +#include + +void main() { + char h[256] = "Hello"; + char* g = "Goodbye"; + ozstream out("temp.gz"); + out < "This works well" < h < g; + out.close(); + + izstream in("temp.gz"); // read it back + char *x = read_string(in), *y = new char[256], z[256]; + in > y > z; + in.close(); + cout << x << endl << y << endl << z << endl; + + out.open("temp.gz"); // try ascii output; zcat temp.gz to see the results + out << setw(50) << setfill('#') << setprecision(20) << x << endl << y << endl << z << endl; + out << z << endl << y << endl << x << endl; + out << 1.1234567890123456789 << endl; + + delete[] x; delete[] y; +} diff --git a/externe_kniznice/zlib/contrib/iostream3/README b/externe_kniznice/zlib/contrib/iostream3/README new file mode 100644 index 0000000..f7b319a --- /dev/null +++ b/externe_kniznice/zlib/contrib/iostream3/README @@ -0,0 +1,35 @@ +These classes provide a C++ stream interface to the zlib library. It allows you +to do things like: + + gzofstream outf("blah.gz"); + outf << "These go into the gzip file " << 123 << endl; + +It does this by deriving a specialized stream buffer for gzipped files, which is +the way Stroustrup would have done it. :-> + +The gzifstream and gzofstream classes were originally written by Kevin Ruland +and made available in the zlib contrib/iostream directory. The older version still +compiles under gcc 2.xx, but not under gcc 3.xx, which sparked the development of +this version. + +The new classes are as standard-compliant as possible, closely following the +approach of the standard library's fstream classes. It compiles under gcc versions +3.2 and 3.3, but not under gcc 2.xx. This is mainly due to changes in the standard +library naming scheme. The new version of gzifstream/gzofstream/gzfilebuf differs +from the previous one in the following respects: +- added showmanyc +- added setbuf, with support for unbuffered output via setbuf(0,0) +- a few bug fixes of stream behavior +- gzipped output file opened with default compression level instead of maximum level +- setcompressionlevel()/strategy() members replaced by single setcompression() + +The code is provided "as is", with the permission to use, copy, modify, distribute +and sell it for any purpose without fee. + +Ludwig Schwardt + + +DSP Lab +Electrical & Electronic Engineering Department +University of Stellenbosch +South Africa diff --git a/externe_kniznice/zlib/contrib/iostream3/TODO b/externe_kniznice/zlib/contrib/iostream3/TODO new file mode 100644 index 0000000..7032f97 --- /dev/null +++ b/externe_kniznice/zlib/contrib/iostream3/TODO @@ -0,0 +1,17 @@ +Possible upgrades to gzfilebuf: + +- The ability to do putback (e.g. putbackfail) + +- The ability to seek (zlib supports this, but could be slow/tricky) + +- Simultaneous read/write access (does it make sense?) + +- Support for ios_base::ate open mode + +- Locale support? + +- Check public interface to see which calls give problems + (due to dependence on library internals) + +- Override operator<<(ostream&, gzfilebuf*) to allow direct copying + of stream buffer to stream ( i.e. os << is.rdbuf(); ) diff --git a/externe_kniznice/zlib/contrib/iostream3/test.cc b/externe_kniznice/zlib/contrib/iostream3/test.cc new file mode 100644 index 0000000..9423533 --- /dev/null +++ b/externe_kniznice/zlib/contrib/iostream3/test.cc @@ -0,0 +1,50 @@ +/* + * Test program for gzifstream and gzofstream + * + * by Ludwig Schwardt + * original version by Kevin Ruland + */ + +#include "zfstream.h" +#include // for cout + +int main() { + + gzofstream outf; + gzifstream inf; + char buf[80]; + + outf.open("test1.txt.gz"); + outf << "The quick brown fox sidestepped the lazy canine\n" + << 1.3 << "\nPlan " << 9 << std::endl; + outf.close(); + std::cout << "Wrote the following message to 'test1.txt.gz' (check with zcat or zless):\n" + << "The quick brown fox sidestepped the lazy canine\n" + << 1.3 << "\nPlan " << 9 << std::endl; + + std::cout << "\nReading 'test1.txt.gz' (buffered) produces:\n"; + inf.open("test1.txt.gz"); + while (inf.getline(buf,80,'\n')) { + std::cout << buf << "\t(" << inf.rdbuf()->in_avail() << " chars left in buffer)\n"; + } + inf.close(); + + outf.rdbuf()->pubsetbuf(0,0); + outf.open("test2.txt.gz"); + outf << setcompression(Z_NO_COMPRESSION) + << "The quick brown fox sidestepped the lazy canine\n" + << 1.3 << "\nPlan " << 9 << std::endl; + outf.close(); + std::cout << "\nWrote the same message to 'test2.txt.gz' in uncompressed form"; + + std::cout << "\nReading 'test2.txt.gz' (unbuffered) produces:\n"; + inf.rdbuf()->pubsetbuf(0,0); + inf.open("test2.txt.gz"); + while (inf.getline(buf,80,'\n')) { + std::cout << buf << "\t(" << inf.rdbuf()->in_avail() << " chars left in buffer)\n"; + } + inf.close(); + + return 0; + +} diff --git a/externe_kniznice/zlib/contrib/iostream3/zfstream.cc b/externe_kniznice/zlib/contrib/iostream3/zfstream.cc new file mode 100644 index 0000000..94eb933 --- /dev/null +++ b/externe_kniznice/zlib/contrib/iostream3/zfstream.cc @@ -0,0 +1,479 @@ +/* + * A C++ I/O streams interface to the zlib gz* functions + * + * by Ludwig Schwardt + * original version by Kevin Ruland + * + * This version is standard-compliant and compatible with gcc 3.x. + */ + +#include "zfstream.h" +#include // for strcpy, strcat, strlen (mode strings) +#include // for BUFSIZ + +// Internal buffer sizes (default and "unbuffered" versions) +#define BIGBUFSIZE BUFSIZ +#define SMALLBUFSIZE 1 + +/*****************************************************************************/ + +// Default constructor +gzfilebuf::gzfilebuf() +: file(NULL), io_mode(std::ios_base::openmode(0)), own_fd(false), + buffer(NULL), buffer_size(BIGBUFSIZE), own_buffer(true) +{ + // No buffers to start with + this->disable_buffer(); +} + +// Destructor +gzfilebuf::~gzfilebuf() +{ + // Sync output buffer and close only if responsible for file + // (i.e. attached streams should be left open at this stage) + this->sync(); + if (own_fd) + this->close(); + // Make sure internal buffer is deallocated + this->disable_buffer(); +} + +// Set compression level and strategy +int +gzfilebuf::setcompression(int comp_level, + int comp_strategy) +{ + return gzsetparams(file, comp_level, comp_strategy); +} + +// Open gzipped file +gzfilebuf* +gzfilebuf::open(const char *name, + std::ios_base::openmode mode) +{ + // Fail if file already open + if (this->is_open()) + return NULL; + // Don't support simultaneous read/write access (yet) + if ((mode & std::ios_base::in) && (mode & std::ios_base::out)) + return NULL; + + // Build mode string for gzopen and check it [27.8.1.3.2] + char char_mode[6] = "\0\0\0\0\0"; + if (!this->open_mode(mode, char_mode)) + return NULL; + + // Attempt to open file + if ((file = gzopen(name, char_mode)) == NULL) + return NULL; + + // On success, allocate internal buffer and set flags + this->enable_buffer(); + io_mode = mode; + own_fd = true; + return this; +} + +// Attach to gzipped file +gzfilebuf* +gzfilebuf::attach(int fd, + std::ios_base::openmode mode) +{ + // Fail if file already open + if (this->is_open()) + return NULL; + // Don't support simultaneous read/write access (yet) + if ((mode & std::ios_base::in) && (mode & std::ios_base::out)) + return NULL; + + // Build mode string for gzdopen and check it [27.8.1.3.2] + char char_mode[6] = "\0\0\0\0\0"; + if (!this->open_mode(mode, char_mode)) + return NULL; + + // Attempt to attach to file + if ((file = gzdopen(fd, char_mode)) == NULL) + return NULL; + + // On success, allocate internal buffer and set flags + this->enable_buffer(); + io_mode = mode; + own_fd = false; + return this; +} + +// Close gzipped file +gzfilebuf* +gzfilebuf::close() +{ + // Fail immediately if no file is open + if (!this->is_open()) + return NULL; + // Assume success + gzfilebuf* retval = this; + // Attempt to sync and close gzipped file + if (this->sync() == -1) + retval = NULL; + if (gzclose(file) < 0) + retval = NULL; + // File is now gone anyway (postcondition [27.8.1.3.8]) + file = NULL; + own_fd = false; + // Destroy internal buffer if it exists + this->disable_buffer(); + return retval; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +// Convert int open mode to mode string +bool +gzfilebuf::open_mode(std::ios_base::openmode mode, + char* c_mode) const +{ + bool testb = mode & std::ios_base::binary; + bool testi = mode & std::ios_base::in; + bool testo = mode & std::ios_base::out; + bool testt = mode & std::ios_base::trunc; + bool testa = mode & std::ios_base::app; + + // Check for valid flag combinations - see [27.8.1.3.2] (Table 92) + // Original zfstream hardcoded the compression level to maximum here... + // Double the time for less than 1% size improvement seems + // excessive though - keeping it at the default level + // To change back, just append "9" to the next three mode strings + if (!testi && testo && !testt && !testa) + strcpy(c_mode, "w"); + if (!testi && testo && !testt && testa) + strcpy(c_mode, "a"); + if (!testi && testo && testt && !testa) + strcpy(c_mode, "w"); + if (testi && !testo && !testt && !testa) + strcpy(c_mode, "r"); + // No read/write mode yet +// if (testi && testo && !testt && !testa) +// strcpy(c_mode, "r+"); +// if (testi && testo && testt && !testa) +// strcpy(c_mode, "w+"); + + // Mode string should be empty for invalid combination of flags + if (strlen(c_mode) == 0) + return false; + if (testb) + strcat(c_mode, "b"); + return true; +} + +// Determine number of characters in internal get buffer +std::streamsize +gzfilebuf::showmanyc() +{ + // Calls to underflow will fail if file not opened for reading + if (!this->is_open() || !(io_mode & std::ios_base::in)) + return -1; + // Make sure get area is in use + if (this->gptr() && (this->gptr() < this->egptr())) + return std::streamsize(this->egptr() - this->gptr()); + else + return 0; +} + +// Fill get area from gzipped file +gzfilebuf::int_type +gzfilebuf::underflow() +{ + // If something is left in the get area by chance, return it + // (this shouldn't normally happen, as underflow is only supposed + // to be called when gptr >= egptr, but it serves as error check) + if (this->gptr() && (this->gptr() < this->egptr())) + return traits_type::to_int_type(*(this->gptr())); + + // If the file hasn't been opened for reading, produce error + if (!this->is_open() || !(io_mode & std::ios_base::in)) + return traits_type::eof(); + + // Attempt to fill internal buffer from gzipped file + // (buffer must be guaranteed to exist...) + int bytes_read = gzread(file, buffer, buffer_size); + // Indicates error or EOF + if (bytes_read <= 0) + { + // Reset get area + this->setg(buffer, buffer, buffer); + return traits_type::eof(); + } + // Make all bytes read from file available as get area + this->setg(buffer, buffer, buffer + bytes_read); + + // Return next character in get area + return traits_type::to_int_type(*(this->gptr())); +} + +// Write put area to gzipped file +gzfilebuf::int_type +gzfilebuf::overflow(int_type c) +{ + // Determine whether put area is in use + if (this->pbase()) + { + // Double-check pointer range + if (this->pptr() > this->epptr() || this->pptr() < this->pbase()) + return traits_type::eof(); + // Add extra character to buffer if not EOF + if (!traits_type::eq_int_type(c, traits_type::eof())) + { + *(this->pptr()) = traits_type::to_char_type(c); + this->pbump(1); + } + // Number of characters to write to file + int bytes_to_write = this->pptr() - this->pbase(); + // Overflow doesn't fail if nothing is to be written + if (bytes_to_write > 0) + { + // If the file hasn't been opened for writing, produce error + if (!this->is_open() || !(io_mode & std::ios_base::out)) + return traits_type::eof(); + // If gzipped file won't accept all bytes written to it, fail + if (gzwrite(file, this->pbase(), bytes_to_write) != bytes_to_write) + return traits_type::eof(); + // Reset next pointer to point to pbase on success + this->pbump(-bytes_to_write); + } + } + // Write extra character to file if not EOF + else if (!traits_type::eq_int_type(c, traits_type::eof())) + { + // If the file hasn't been opened for writing, produce error + if (!this->is_open() || !(io_mode & std::ios_base::out)) + return traits_type::eof(); + // Impromptu char buffer (allows "unbuffered" output) + char_type last_char = traits_type::to_char_type(c); + // If gzipped file won't accept this character, fail + if (gzwrite(file, &last_char, 1) != 1) + return traits_type::eof(); + } + + // If you got here, you have succeeded (even if c was EOF) + // The return value should therefore be non-EOF + if (traits_type::eq_int_type(c, traits_type::eof())) + return traits_type::not_eof(c); + else + return c; +} + +// Assign new buffer +std::streambuf* +gzfilebuf::setbuf(char_type* p, + std::streamsize n) +{ + // First make sure stuff is sync'ed, for safety + if (this->sync() == -1) + return NULL; + // If buffering is turned off on purpose via setbuf(0,0), still allocate one... + // "Unbuffered" only really refers to put [27.8.1.4.10], while get needs at + // least a buffer of size 1 (very inefficient though, therefore make it bigger?) + // This follows from [27.5.2.4.3]/12 (gptr needs to point at something, it seems) + if (!p || !n) + { + // Replace existing buffer (if any) with small internal buffer + this->disable_buffer(); + buffer = NULL; + buffer_size = 0; + own_buffer = true; + this->enable_buffer(); + } + else + { + // Replace existing buffer (if any) with external buffer + this->disable_buffer(); + buffer = p; + buffer_size = n; + own_buffer = false; + this->enable_buffer(); + } + return this; +} + +// Write put area to gzipped file (i.e. ensures that put area is empty) +int +gzfilebuf::sync() +{ + return traits_type::eq_int_type(this->overflow(), traits_type::eof()) ? -1 : 0; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +// Allocate internal buffer +void +gzfilebuf::enable_buffer() +{ + // If internal buffer required, allocate one + if (own_buffer && !buffer) + { + // Check for buffered vs. "unbuffered" + if (buffer_size > 0) + { + // Allocate internal buffer + buffer = new char_type[buffer_size]; + // Get area starts empty and will be expanded by underflow as need arises + this->setg(buffer, buffer, buffer); + // Setup entire internal buffer as put area. + // The one-past-end pointer actually points to the last element of the buffer, + // so that overflow(c) can safely add the extra character c to the sequence. + // These pointers remain in place for the duration of the buffer + this->setp(buffer, buffer + buffer_size - 1); + } + else + { + // Even in "unbuffered" case, (small?) get buffer is still required + buffer_size = SMALLBUFSIZE; + buffer = new char_type[buffer_size]; + this->setg(buffer, buffer, buffer); + // "Unbuffered" means no put buffer + this->setp(0, 0); + } + } + else + { + // If buffer already allocated, reset buffer pointers just to make sure no + // stale chars are lying around + this->setg(buffer, buffer, buffer); + this->setp(buffer, buffer + buffer_size - 1); + } +} + +// Destroy internal buffer +void +gzfilebuf::disable_buffer() +{ + // If internal buffer exists, deallocate it + if (own_buffer && buffer) + { + // Preserve unbuffered status by zeroing size + if (!this->pbase()) + buffer_size = 0; + delete[] buffer; + buffer = NULL; + this->setg(0, 0, 0); + this->setp(0, 0); + } + else + { + // Reset buffer pointers to initial state if external buffer exists + this->setg(buffer, buffer, buffer); + if (buffer) + this->setp(buffer, buffer + buffer_size - 1); + else + this->setp(0, 0); + } +} + +/*****************************************************************************/ + +// Default constructor initializes stream buffer +gzifstream::gzifstream() +: std::istream(NULL), sb() +{ this->init(&sb); } + +// Initialize stream buffer and open file +gzifstream::gzifstream(const char* name, + std::ios_base::openmode mode) +: std::istream(NULL), sb() +{ + this->init(&sb); + this->open(name, mode); +} + +// Initialize stream buffer and attach to file +gzifstream::gzifstream(int fd, + std::ios_base::openmode mode) +: std::istream(NULL), sb() +{ + this->init(&sb); + this->attach(fd, mode); +} + +// Open file and go into fail() state if unsuccessful +void +gzifstream::open(const char* name, + std::ios_base::openmode mode) +{ + if (!sb.open(name, mode | std::ios_base::in)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Attach to file and go into fail() state if unsuccessful +void +gzifstream::attach(int fd, + std::ios_base::openmode mode) +{ + if (!sb.attach(fd, mode | std::ios_base::in)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Close file +void +gzifstream::close() +{ + if (!sb.close()) + this->setstate(std::ios_base::failbit); +} + +/*****************************************************************************/ + +// Default constructor initializes stream buffer +gzofstream::gzofstream() +: std::ostream(NULL), sb() +{ this->init(&sb); } + +// Initialize stream buffer and open file +gzofstream::gzofstream(const char* name, + std::ios_base::openmode mode) +: std::ostream(NULL), sb() +{ + this->init(&sb); + this->open(name, mode); +} + +// Initialize stream buffer and attach to file +gzofstream::gzofstream(int fd, + std::ios_base::openmode mode) +: std::ostream(NULL), sb() +{ + this->init(&sb); + this->attach(fd, mode); +} + +// Open file and go into fail() state if unsuccessful +void +gzofstream::open(const char* name, + std::ios_base::openmode mode) +{ + if (!sb.open(name, mode | std::ios_base::out)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Attach to file and go into fail() state if unsuccessful +void +gzofstream::attach(int fd, + std::ios_base::openmode mode) +{ + if (!sb.attach(fd, mode | std::ios_base::out)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Close file +void +gzofstream::close() +{ + if (!sb.close()) + this->setstate(std::ios_base::failbit); +} diff --git a/externe_kniznice/zlib/contrib/iostream3/zfstream.h b/externe_kniznice/zlib/contrib/iostream3/zfstream.h new file mode 100644 index 0000000..8574479 --- /dev/null +++ b/externe_kniznice/zlib/contrib/iostream3/zfstream.h @@ -0,0 +1,466 @@ +/* + * A C++ I/O streams interface to the zlib gz* functions + * + * by Ludwig Schwardt + * original version by Kevin Ruland + * + * This version is standard-compliant and compatible with gcc 3.x. + */ + +#ifndef ZFSTREAM_H +#define ZFSTREAM_H + +#include // not iostream, since we don't need cin/cout +#include +#include "zlib.h" + +/*****************************************************************************/ + +/** + * @brief Gzipped file stream buffer class. + * + * This class implements basic_filebuf for gzipped files. It doesn't yet support + * seeking (allowed by zlib but slow/limited), putback and read/write access + * (tricky). Otherwise, it attempts to be a drop-in replacement for the standard + * file streambuf. +*/ +class gzfilebuf : public std::streambuf +{ +public: + // Default constructor. + gzfilebuf(); + + // Destructor. + virtual + ~gzfilebuf(); + + /** + * @brief Set compression level and strategy on the fly. + * @param comp_level Compression level (see zlib.h for allowed values) + * @param comp_strategy Compression strategy (see zlib.h for allowed values) + * @return Z_OK on success, Z_STREAM_ERROR otherwise. + * + * Unfortunately, these parameters cannot be modified separately, as the + * previous zfstream version assumed. Since the strategy is seldom changed, + * it can default and setcompression(level) then becomes like the old + * setcompressionlevel(level). + */ + int + setcompression(int comp_level, + int comp_strategy = Z_DEFAULT_STRATEGY); + + /** + * @brief Check if file is open. + * @return True if file is open. + */ + bool + is_open() const { return (file != NULL); } + + /** + * @brief Open gzipped file. + * @param name File name. + * @param mode Open mode flags. + * @return @c this on success, NULL on failure. + */ + gzfilebuf* + open(const char* name, + std::ios_base::openmode mode); + + /** + * @brief Attach to already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags. + * @return @c this on success, NULL on failure. + */ + gzfilebuf* + attach(int fd, + std::ios_base::openmode mode); + + /** + * @brief Close gzipped file. + * @return @c this on success, NULL on failure. + */ + gzfilebuf* + close(); + +protected: + /** + * @brief Convert ios open mode int to mode string used by zlib. + * @return True if valid mode flag combination. + */ + bool + open_mode(std::ios_base::openmode mode, + char* c_mode) const; + + /** + * @brief Number of characters available in stream buffer. + * @return Number of characters. + * + * This indicates number of characters in get area of stream buffer. + * These characters can be read without accessing the gzipped file. + */ + virtual std::streamsize + showmanyc(); + + /** + * @brief Fill get area from gzipped file. + * @return First character in get area on success, EOF on error. + * + * This actually reads characters from gzipped file to stream + * buffer. Always buffered. + */ + virtual int_type + underflow(); + + /** + * @brief Write put area to gzipped file. + * @param c Extra character to add to buffer contents. + * @return Non-EOF on success, EOF on error. + * + * This actually writes characters in stream buffer to + * gzipped file. With unbuffered output this is done one + * character at a time. + */ + virtual int_type + overflow(int_type c = traits_type::eof()); + + /** + * @brief Installs external stream buffer. + * @param p Pointer to char buffer. + * @param n Size of external buffer. + * @return @c this on success, NULL on failure. + * + * Call setbuf(0,0) to enable unbuffered output. + */ + virtual std::streambuf* + setbuf(char_type* p, + std::streamsize n); + + /** + * @brief Flush stream buffer to file. + * @return 0 on success, -1 on error. + * + * This calls underflow(EOF) to do the job. + */ + virtual int + sync(); + +// +// Some future enhancements +// +// virtual int_type uflow(); +// virtual int_type pbackfail(int_type c = traits_type::eof()); +// virtual pos_type +// seekoff(off_type off, +// std::ios_base::seekdir way, +// std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out); +// virtual pos_type +// seekpos(pos_type sp, +// std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out); + +private: + /** + * @brief Allocate internal buffer. + * + * This function is safe to call multiple times. It will ensure + * that a proper internal buffer exists if it is required. If the + * buffer already exists or is external, the buffer pointers will be + * reset to their original state. + */ + void + enable_buffer(); + + /** + * @brief Destroy internal buffer. + * + * This function is safe to call multiple times. It will ensure + * that the internal buffer is deallocated if it exists. In any + * case, it will also reset the buffer pointers. + */ + void + disable_buffer(); + + /** + * Underlying file pointer. + */ + gzFile file; + + /** + * Mode in which file was opened. + */ + std::ios_base::openmode io_mode; + + /** + * @brief True if this object owns file descriptor. + * + * This makes the class responsible for closing the file + * upon destruction. + */ + bool own_fd; + + /** + * @brief Stream buffer. + * + * For simplicity this remains allocated on the free store for the + * entire life span of the gzfilebuf object, unless replaced by setbuf. + */ + char_type* buffer; + + /** + * @brief Stream buffer size. + * + * Defaults to system default buffer size (typically 8192 bytes). + * Modified by setbuf. + */ + std::streamsize buffer_size; + + /** + * @brief True if this object owns stream buffer. + * + * This makes the class responsible for deleting the buffer + * upon destruction. + */ + bool own_buffer; +}; + +/*****************************************************************************/ + +/** + * @brief Gzipped file input stream class. + * + * This class implements ifstream for gzipped files. Seeking and putback + * is not supported yet. +*/ +class gzifstream : public std::istream +{ +public: + // Default constructor + gzifstream(); + + /** + * @brief Construct stream on gzipped file to be opened. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::in). + */ + explicit + gzifstream(const char* name, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * @brief Construct stream on already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::in). + */ + explicit + gzifstream(int fd, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * Obtain underlying stream buffer. + */ + gzfilebuf* + rdbuf() const + { return const_cast(&sb); } + + /** + * @brief Check if file is open. + * @return True if file is open. + */ + bool + is_open() { return sb.is_open(); } + + /** + * @brief Open gzipped file. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::in). + * + * Stream will be in state good() if file opens successfully; + * otherwise in state fail(). This differs from the behavior of + * ifstream, which never sets the state to good() and therefore + * won't allow you to reuse the stream for a second file unless + * you manually clear() the state. The choice is a matter of + * convenience. + */ + void + open(const char* name, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * @brief Attach to already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::in). + * + * Stream will be in state good() if attach succeeded; otherwise + * in state fail(). + */ + void + attach(int fd, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * @brief Close gzipped file. + * + * Stream will be in state fail() if close failed. + */ + void + close(); + +private: + /** + * Underlying stream buffer. + */ + gzfilebuf sb; +}; + +/*****************************************************************************/ + +/** + * @brief Gzipped file output stream class. + * + * This class implements ofstream for gzipped files. Seeking and putback + * is not supported yet. +*/ +class gzofstream : public std::ostream +{ +public: + // Default constructor + gzofstream(); + + /** + * @brief Construct stream on gzipped file to be opened. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::out). + */ + explicit + gzofstream(const char* name, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * @brief Construct stream on already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::out). + */ + explicit + gzofstream(int fd, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * Obtain underlying stream buffer. + */ + gzfilebuf* + rdbuf() const + { return const_cast(&sb); } + + /** + * @brief Check if file is open. + * @return True if file is open. + */ + bool + is_open() { return sb.is_open(); } + + /** + * @brief Open gzipped file. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::out). + * + * Stream will be in state good() if file opens successfully; + * otherwise in state fail(). This differs from the behavior of + * ofstream, which never sets the state to good() and therefore + * won't allow you to reuse the stream for a second file unless + * you manually clear() the state. The choice is a matter of + * convenience. + */ + void + open(const char* name, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * @brief Attach to already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::out). + * + * Stream will be in state good() if attach succeeded; otherwise + * in state fail(). + */ + void + attach(int fd, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * @brief Close gzipped file. + * + * Stream will be in state fail() if close failed. + */ + void + close(); + +private: + /** + * Underlying stream buffer. + */ + gzfilebuf sb; +}; + +/*****************************************************************************/ + +/** + * @brief Gzipped file output stream manipulator class. + * + * This class defines a two-argument manipulator for gzofstream. It is used + * as base for the setcompression(int,int) manipulator. +*/ +template + class gzomanip2 + { + public: + // Allows insertor to peek at internals + template + friend gzofstream& + operator<<(gzofstream&, + const gzomanip2&); + + // Constructor + gzomanip2(gzofstream& (*f)(gzofstream&, T1, T2), + T1 v1, + T2 v2); + private: + // Underlying manipulator function + gzofstream& + (*func)(gzofstream&, T1, T2); + + // Arguments for manipulator function + T1 val1; + T2 val2; + }; + +/*****************************************************************************/ + +// Manipulator function thunks through to stream buffer +inline gzofstream& +setcompression(gzofstream &gzs, int l, int s = Z_DEFAULT_STRATEGY) +{ + (gzs.rdbuf())->setcompression(l, s); + return gzs; +} + +// Manipulator constructor stores arguments +template + inline + gzomanip2::gzomanip2(gzofstream &(*f)(gzofstream &, T1, T2), + T1 v1, + T2 v2) + : func(f), val1(v1), val2(v2) + { } + +// Insertor applies underlying manipulator function to stream +template + inline gzofstream& + operator<<(gzofstream& s, const gzomanip2& m) + { return (*m.func)(s, m.val1, m.val2); } + +// Insert this onto stream to simplify setting of compression level +inline gzomanip2 +setcompression(int l, int s = Z_DEFAULT_STRATEGY) +{ return gzomanip2(&setcompression, l, s); } + +#endif // ZFSTREAM_H diff --git a/externe_kniznice/zlib/contrib/masmx64/bld_ml64.bat b/externe_kniznice/zlib/contrib/masmx64/bld_ml64.bat new file mode 100644 index 0000000..f74bcef --- /dev/null +++ b/externe_kniznice/zlib/contrib/masmx64/bld_ml64.bat @@ -0,0 +1,2 @@ +ml64.exe /Flinffasx64 /c /Zi inffasx64.asm +ml64.exe /Flgvmat64 /c /Zi gvmat64.asm diff --git a/externe_kniznice/zlib/contrib/masmx64/gvmat64.asm b/externe_kniznice/zlib/contrib/masmx64/gvmat64.asm new file mode 100644 index 0000000..c1817f1 --- /dev/null +++ b/externe_kniznice/zlib/contrib/masmx64/gvmat64.asm @@ -0,0 +1,553 @@ +;uInt longest_match_x64( +; deflate_state *s, +; IPos cur_match); /* current match */ + +; gvmat64.asm -- Asm portion of the optimized longest_match for 32 bits x86_64 +; (AMD64 on Athlon 64, Opteron, Phenom +; and Intel EM64T on Pentium 4 with EM64T, Pentium D, Core 2 Duo, Core I5/I7) +; Copyright (C) 1995-2010 Jean-loup Gailly, Brian Raiter and Gilles Vollant. +; +; File written by Gilles Vollant, by converting to assembly the longest_match +; from Jean-loup Gailly in deflate.c of zLib and infoZip zip. +; +; and by taking inspiration on asm686 with masm, optimised assembly code +; from Brian Raiter, written 1998 +; +; This software is provided 'as-is', without any express or implied +; warranty. In no event will the authors be held liable for any damages +; arising from the use of this software. +; +; Permission is granted to anyone to use this software for any purpose, +; including commercial applications, and to alter it and redistribute it +; freely, subject to the following restrictions: +; +; 1. The origin of this software must not be misrepresented; you must not +; claim that you wrote the original software. If you use this software +; in a product, an acknowledgment in the product documentation would be +; appreciated but is not required. +; 2. Altered source versions must be plainly marked as such, and must not be +; misrepresented as being the original software +; 3. This notice may not be removed or altered from any source distribution. +; +; +; +; http://www.zlib.net +; http://www.winimage.com/zLibDll +; http://www.muppetlabs.com/~breadbox/software/assembly.html +; +; to compile this file for infozip Zip, I use option: +; ml64.exe /Flgvmat64 /c /Zi /DINFOZIP gvmat64.asm +; +; to compile this file for zLib, I use option: +; ml64.exe /Flgvmat64 /c /Zi gvmat64.asm +; Be carrefull to adapt zlib1222add below to your version of zLib +; (if you use a version of zLib before 1.0.4 or after 1.2.2.2, change +; value of zlib1222add later) +; +; This file compile with Microsoft Macro Assembler (x64) for AMD64 +; +; ml64.exe is given with Visual Studio 2005/2008/2010 and Windows WDK +; +; (you can get Windows WDK with ml64 for AMD64 from +; http://www.microsoft.com/whdc/Devtools/wdk/default.mspx for low price) +; + + +;uInt longest_match(s, cur_match) +; deflate_state *s; +; IPos cur_match; /* current match */ +.code +longest_match PROC + + +;LocalVarsSize equ 88 + LocalVarsSize equ 72 + +; register used : rax,rbx,rcx,rdx,rsi,rdi,r8,r9,r10,r11,r12 +; free register : r14,r15 +; register can be saved : rsp + + chainlenwmask equ rsp + 8 - LocalVarsSize ; high word: current chain len + ; low word: s->wmask +;window equ rsp + xx - LocalVarsSize ; local copy of s->window ; stored in r10 +;windowbestlen equ rsp + xx - LocalVarsSize ; s->window + bestlen , use r10+r11 +;scanstart equ rsp + xx - LocalVarsSize ; first two bytes of string ; stored in r12w +;scanend equ rsp + xx - LocalVarsSize ; last two bytes of string use ebx +;scanalign equ rsp + xx - LocalVarsSize ; dword-misalignment of string r13 +;bestlen equ rsp + xx - LocalVarsSize ; size of best match so far -> r11d +;scan equ rsp + xx - LocalVarsSize ; ptr to string wanting match -> r9 +IFDEF INFOZIP +ELSE + nicematch equ (rsp + 16 - LocalVarsSize) ; a good enough match size +ENDIF + +save_rdi equ rsp + 24 - LocalVarsSize +save_rsi equ rsp + 32 - LocalVarsSize +save_rbx equ rsp + 40 - LocalVarsSize +save_rbp equ rsp + 48 - LocalVarsSize +save_r12 equ rsp + 56 - LocalVarsSize +save_r13 equ rsp + 64 - LocalVarsSize +;save_r14 equ rsp + 72 - LocalVarsSize +;save_r15 equ rsp + 80 - LocalVarsSize + + +; summary of register usage +; scanend ebx +; scanendw bx +; chainlenwmask edx +; curmatch rsi +; curmatchd esi +; windowbestlen r8 +; scanalign r9 +; scanalignd r9d +; window r10 +; bestlen r11 +; bestlend r11d +; scanstart r12d +; scanstartw r12w +; scan r13 +; nicematch r14d +; limit r15 +; limitd r15d +; prev rcx + +; all the +4 offsets are due to the addition of pending_buf_size (in zlib +; in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, remove the +4). +; Note : these value are good with a 8 bytes boundary pack structure + + + MAX_MATCH equ 258 + MIN_MATCH equ 3 + MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1) + + +;;; Offsets for fields in the deflate_state structure. These numbers +;;; are calculated from the definition of deflate_state, with the +;;; assumption that the compiler will dword-align the fields. (Thus, +;;; changing the definition of deflate_state could easily cause this +;;; program to crash horribly, without so much as a warning at +;;; compile time. Sigh.) + +; all the +zlib1222add offsets are due to the addition of fields +; in zlib in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). +; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). +; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). + + +IFDEF INFOZIP + +_DATA SEGMENT +COMM window_size:DWORD +; WMask ; 7fff +COMM window:BYTE:010040H +COMM prev:WORD:08000H +; MatchLen : unused +; PrevMatch : unused +COMM strstart:DWORD +COMM match_start:DWORD +; Lookahead : ignore +COMM prev_length:DWORD ; PrevLen +COMM max_chain_length:DWORD +COMM good_match:DWORD +COMM nice_match:DWORD +prev_ad equ OFFSET prev +window_ad equ OFFSET window +nicematch equ nice_match +_DATA ENDS +WMask equ 07fffh + +ELSE + + IFNDEF zlib1222add + zlib1222add equ 8 + ENDIF +dsWSize equ 56+zlib1222add+(zlib1222add/2) +dsWMask equ 64+zlib1222add+(zlib1222add/2) +dsWindow equ 72+zlib1222add +dsPrev equ 88+zlib1222add +dsMatchLen equ 128+zlib1222add +dsPrevMatch equ 132+zlib1222add +dsStrStart equ 140+zlib1222add +dsMatchStart equ 144+zlib1222add +dsLookahead equ 148+zlib1222add +dsPrevLen equ 152+zlib1222add +dsMaxChainLen equ 156+zlib1222add +dsGoodMatch equ 172+zlib1222add +dsNiceMatch equ 176+zlib1222add + +window_size equ [ rcx + dsWSize] +WMask equ [ rcx + dsWMask] +window_ad equ [ rcx + dsWindow] +prev_ad equ [ rcx + dsPrev] +strstart equ [ rcx + dsStrStart] +match_start equ [ rcx + dsMatchStart] +Lookahead equ [ rcx + dsLookahead] ; 0ffffffffh on infozip +prev_length equ [ rcx + dsPrevLen] +max_chain_length equ [ rcx + dsMaxChainLen] +good_match equ [ rcx + dsGoodMatch] +nice_match equ [ rcx + dsNiceMatch] +ENDIF + +; parameter 1 in r8(deflate state s), param 2 in rdx (cur match) + +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and +; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp +; +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r9, r10, and r11, which are scratch. + + + +;;; Save registers that the compiler may be using, and adjust esp to +;;; make room for our stack frame. + + +;;; Retrieve the function arguments. r8d will hold cur_match +;;; throughout the entire function. edx will hold the pointer to the +;;; deflate_state structure during the function's setup (before +;;; entering the main loop. + +; parameter 1 in rcx (deflate_state* s), param 2 in edx -> r8 (cur match) + +; this clear high 32 bits of r8, which can be garbage in both r8 and rdx + + mov [save_rdi],rdi + mov [save_rsi],rsi + mov [save_rbx],rbx + mov [save_rbp],rbp +IFDEF INFOZIP + mov r8d,ecx +ELSE + mov r8d,edx +ENDIF + mov [save_r12],r12 + mov [save_r13],r13 +; mov [save_r14],r14 +; mov [save_r15],r15 + + +;;; uInt wmask = s->w_mask; +;;; unsigned chain_length = s->max_chain_length; +;;; if (s->prev_length >= s->good_match) { +;;; chain_length >>= 2; +;;; } + + mov edi, prev_length + mov esi, good_match + mov eax, WMask + mov ebx, max_chain_length + cmp edi, esi + jl LastMatchGood + shr ebx, 2 +LastMatchGood: + +;;; chainlen is decremented once beforehand so that the function can +;;; use the sign flag instead of the zero flag for the exit test. +;;; It is then shifted into the high word, to make room for the wmask +;;; value, which it will always accompany. + + dec ebx + shl ebx, 16 + or ebx, eax + +;;; on zlib only +;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + +IFDEF INFOZIP + mov [chainlenwmask], ebx +; on infozip nice_match = [nice_match] +ELSE + mov eax, nice_match + mov [chainlenwmask], ebx + mov r10d, Lookahead + cmp r10d, eax + cmovnl r10d, eax + mov [nicematch],r10d +ENDIF + +;;; register Bytef *scan = s->window + s->strstart; + mov r10, window_ad + mov ebp, strstart + lea r13, [r10 + rbp] + +;;; Determine how many bytes the scan ptr is off from being +;;; dword-aligned. + + mov r9,r13 + neg r13 + and r13,3 + +;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? +;;; s->strstart - (IPos)MAX_DIST(s) : NIL; +IFDEF INFOZIP + mov eax,07efah ; MAX_DIST = (WSIZE-MIN_LOOKAHEAD) (0x8000-(3+8+1)) +ELSE + mov eax, window_size + sub eax, MIN_LOOKAHEAD +ENDIF + xor edi,edi + sub ebp, eax + + mov r11d, prev_length + + cmovng ebp,edi + +;;; int best_len = s->prev_length; + + +;;; Store the sum of s->window + best_len in esi locally, and in esi. + + lea rsi,[r10+r11] + +;;; register ush scan_start = *(ushf*)scan; +;;; register ush scan_end = *(ushf*)(scan+best_len-1); +;;; Posf *prev = s->prev; + + movzx r12d,word ptr [r9] + movzx ebx, word ptr [r9 + r11 - 1] + + mov rdi, prev_ad + +;;; Jump into the main loop. + + mov edx, [chainlenwmask] + + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + +LookupLoop1: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry1: + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + +LookupLoop2: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry2: + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + +LookupLoop4: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry4: + + cmp bx,word ptr [rsi + r8 - 1] + jnz LookupLoop1 + jmp LookupLoopIsZero + + +;;; do { +;;; match = s->window + cur_match; +;;; if (*(ushf*)(match+best_len-1) != scan_end || +;;; *(ushf*)match != scan_start) continue; +;;; [...] +;;; } while ((cur_match = prev[cur_match & wmask]) > limit +;;; && --chain_length != 0); +;;; +;;; Here is the inner loop of the function. The function will spend the +;;; majority of its time in this loop, and majority of that time will +;;; be spent in the first ten instructions. +;;; +;;; Within this loop: +;;; ebx = scanend +;;; r8d = curmatch +;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) +;;; esi = windowbestlen - i.e., (window + bestlen) +;;; edi = prev +;;; ebp = limit + +LookupLoop: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry: + + cmp bx,word ptr [rsi + r8 - 1] + jnz LookupLoop1 +LookupLoopIsZero: + cmp r12w, word ptr [r10 + r8] + jnz LookupLoop1 + + +;;; Store the current value of chainlen. + mov [chainlenwmask], edx + +;;; Point edi to the string under scrutiny, and esi to the string we +;;; are hoping to match it up with. In actuality, esi and edi are +;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is +;;; initialized to -(MAX_MATCH_8 - scanalign). + + lea rsi,[r8+r10] + mov rdx, 0fffffffffffffef8h; -(MAX_MATCH_8) + lea rsi, [rsi + r13 + 0108h] ;MAX_MATCH_8] + lea rdi, [r9 + r13 + 0108h] ;MAX_MATCH_8] + + prefetcht1 [rsi+rdx] + prefetcht1 [rdi+rdx] + + +;;; Test the strings for equality, 8 bytes at a time. At the end, +;;; adjust rdx so that it is offset to the exact byte that mismatched. +;;; +;;; We already know at this point that the first three bytes of the +;;; strings match each other, and they can be safely passed over before +;;; starting the compare loop. So what this code does is skip over 0-3 +;;; bytes, as much as necessary in order to dword-align the edi +;;; pointer. (rsi will still be misaligned three times out of four.) +;;; +;;; It should be confessed that this loop usually does not represent +;;; much of the total running time. Replacing it with a more +;;; straightforward "rep cmpsb" would not drastically degrade +;;; performance. + + +LoopCmps: + mov rax, [rsi + rdx] + xor rax, [rdi + rdx] + jnz LeaveLoopCmps + + mov rax, [rsi + rdx + 8] + xor rax, [rdi + rdx + 8] + jnz LeaveLoopCmps8 + + + mov rax, [rsi + rdx + 8+8] + xor rax, [rdi + rdx + 8+8] + jnz LeaveLoopCmps16 + + add rdx,8+8+8 + + jnz short LoopCmps + jmp short LenMaximum +LeaveLoopCmps16: add rdx,8 +LeaveLoopCmps8: add rdx,8 +LeaveLoopCmps: + + test eax, 0000FFFFh + jnz LenLower + + test eax,0ffffffffh + + jnz LenLower32 + + add rdx,4 + shr rax,32 + or ax,ax + jnz LenLower + +LenLower32: + shr eax,16 + add rdx,2 +LenLower: sub al, 1 + adc rdx, 0 +;;; Calculate the length of the match. If it is longer than MAX_MATCH, +;;; then automatically accept it as the best possible match and leave. + + lea rax, [rdi + rdx] + sub rax, r9 + cmp eax, MAX_MATCH + jge LenMaximum + +;;; If the length of the match is not longer than the best match we +;;; have so far, then forget it and return to the lookup loop. +;/////////////////////////////////// + + cmp eax, r11d + jg LongerMatch + + lea rsi,[r10+r11] + + mov rdi, prev_ad + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; s->match_start = cur_match; +;;; best_len = len; +;;; if (len >= nice_match) break; +;;; scan_end = *(ushf*)(scan+best_len-1); + +LongerMatch: + mov r11d, eax + mov match_start, r8d + cmp eax, [nicematch] + jge LeaveNow + + lea rsi,[r10+rax] + + movzx ebx, word ptr [r9 + rax - 1] + mov rdi, prev_ad + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; Accept the current string, with the maximum possible length. + +LenMaximum: + mov r11d,MAX_MATCH + mov match_start, r8d + +;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len; +;;; return s->lookahead; + +LeaveNow: +IFDEF INFOZIP + mov eax,r11d +ELSE + mov eax, Lookahead + cmp r11d, eax + cmovng eax, r11d +ENDIF + +;;; Restore the stack and return from whence we came. + + + mov rsi,[save_rsi] + mov rdi,[save_rdi] + mov rbx,[save_rbx] + mov rbp,[save_rbp] + mov r12,[save_r12] + mov r13,[save_r13] +; mov r14,[save_r14] +; mov r15,[save_r15] + + + ret 0 +; please don't remove this string ! +; Your can freely use gvmat64 in any free or commercial app +; but it is far better don't remove the string in the binary! + db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998, converted to amd 64 by Gilles Vollant 2005",0dh,0ah,0 +longest_match ENDP + +match_init PROC + ret 0 +match_init ENDP + + +END diff --git a/externe_kniznice/zlib/contrib/masmx64/inffas8664.c b/externe_kniznice/zlib/contrib/masmx64/inffas8664.c new file mode 100644 index 0000000..aa861a3 --- /dev/null +++ b/externe_kniznice/zlib/contrib/masmx64/inffas8664.c @@ -0,0 +1,186 @@ +/* inffas8664.c is a hand tuned assembler version of inffast.c - fast decoding + * version for AMD64 on Windows using Microsoft C compiler + * + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Copyright (C) 2003 Chris Anderson + * Please use the copyright conditions above. + * + * 2005 - Adaptation to Microsoft C Compiler for AMD64 by Gilles Vollant + * + * inffas8664.c call function inffas8664fnc in inffasx64.asm + * inffasx64.asm is automatically convert from AMD64 portion of inffas86.c + * + * Dec-29-2003 -- I added AMD64 inflate asm support. This version is also + * slightly quicker on x86 systems because, instead of using rep movsb to copy + * data, it uses rep movsw, which moves data in 2-byte chunks instead of single + * bytes. I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates + * from http://fedora.linux.duke.edu/fc1_x86_64 + * which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with + * 1GB ram. The 64-bit version is about 4% faster than the 32-bit version, + * when decompressing mozilla-source-1.3.tar.gz. + * + * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from + * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at + * the moment. I have successfully compiled and tested this code with gcc2.96, + * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S + * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX + * enabled. I will attempt to merge the MMX code into this version. Newer + * versions of this and inffast.S can be found at + * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ + * + */ + +#include +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* Mark Adler's comments from inffast.c: */ + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ + + + + typedef struct inffast_ar { +/* 64 32 x86 x86_64 */ +/* ar offset register */ +/* 0 0 */ void *esp; /* esp save */ +/* 8 4 */ void *ebp; /* ebp save */ +/* 16 8 */ unsigned char FAR *in; /* esi rsi local strm->next_in */ +/* 24 12 */ unsigned char FAR *last; /* r9 while in < last */ +/* 32 16 */ unsigned char FAR *out; /* edi rdi local strm->next_out */ +/* 40 20 */ unsigned char FAR *beg; /* inflate()'s init next_out */ +/* 48 24 */ unsigned char FAR *end; /* r10 while out < end */ +/* 56 28 */ unsigned char FAR *window;/* size of window, wsize!=0 */ +/* 64 32 */ code const FAR *lcode; /* ebp rbp local strm->lencode */ +/* 72 36 */ code const FAR *dcode; /* r11 local strm->distcode */ +/* 80 40 */ size_t /*unsigned long */hold; /* edx rdx local strm->hold */ +/* 88 44 */ unsigned bits; /* ebx rbx local strm->bits */ +/* 92 48 */ unsigned wsize; /* window size */ +/* 96 52 */ unsigned write; /* window write index */ +/*100 56 */ unsigned lmask; /* r12 mask for lcode */ +/*104 60 */ unsigned dmask; /* r13 mask for dcode */ +/*108 64 */ unsigned len; /* r14 match length */ +/*112 68 */ unsigned dist; /* r15 match distance */ +/*116 72 */ unsigned status; /* set when state chng*/ + } type_ar; +#ifdef ASMINF + +void inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + type_ar ar; + void inffas8664fnc(struct inffast_ar * par); + + + +#if (defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 )) || (defined(_MSC_VER) && defined(_M_AMD64)) +#define PAD_AVAIL_IN 6 +#define PAD_AVAIL_OUT 258 +#else +#define PAD_AVAIL_IN 5 +#define PAD_AVAIL_OUT 257 +#endif + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + + ar.in = strm->next_in; + ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN); + ar.out = strm->next_out; + ar.beg = ar.out - (start - strm->avail_out); + ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT); + ar.wsize = state->wsize; + ar.write = state->wnext; + ar.window = state->window; + ar.hold = state->hold; + ar.bits = state->bits; + ar.lcode = state->lencode; + ar.dcode = state->distcode; + ar.lmask = (1U << state->lenbits) - 1; + ar.dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + + /* align in on 1/2 hold size boundary */ + while (((size_t)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) { + ar.hold += (unsigned long)*ar.in++ << ar.bits; + ar.bits += 8; + } + + inffas8664fnc(&ar); + + if (ar.status > 1) { + if (ar.status == 2) + strm->msg = "invalid literal/length code"; + else if (ar.status == 3) + strm->msg = "invalid distance code"; + else + strm->msg = "invalid distance too far back"; + state->mode = BAD; + } + else if ( ar.status == 1 ) { + state->mode = TYPE; + } + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + ar.len = ar.bits >> 3; + ar.in -= ar.len; + ar.bits -= ar.len << 3; + ar.hold &= (1U << ar.bits) - 1; + + /* update state and return */ + strm->next_in = ar.in; + strm->next_out = ar.out; + strm->avail_in = (unsigned)(ar.in < ar.last ? + PAD_AVAIL_IN + (ar.last - ar.in) : + PAD_AVAIL_IN - (ar.in - ar.last)); + strm->avail_out = (unsigned)(ar.out < ar.end ? + PAD_AVAIL_OUT + (ar.end - ar.out) : + PAD_AVAIL_OUT - (ar.out - ar.end)); + state->hold = (unsigned long)ar.hold; + state->bits = ar.bits; + return; +} + +#endif diff --git a/externe_kniznice/zlib/contrib/masmx64/inffasx64.asm b/externe_kniznice/zlib/contrib/masmx64/inffasx64.asm new file mode 100644 index 0000000..41ec823 --- /dev/null +++ b/externe_kniznice/zlib/contrib/masmx64/inffasx64.asm @@ -0,0 +1,396 @@ +; inffasx64.asm is a hand tuned assembler version of inffast.c - fast decoding +; version for AMD64 on Windows using Microsoft C compiler +; +; inffasx64.asm is automatically convert from AMD64 portion of inffas86.c +; inffasx64.asm is called by inffas8664.c, which contain more info. + + +; to compile this file, I use option +; ml64.exe /Flinffasx64 /c /Zi inffasx64.asm +; with Microsoft Macro Assembler (x64) for AMD64 +; + +; This file compile with Microsoft Macro Assembler (x64) for AMD64 +; +; ml64.exe is given with Visual Studio 2005/2008/2010 and Windows WDK +; +; (you can get Windows WDK with ml64 for AMD64 from +; http://www.microsoft.com/whdc/Devtools/wdk/default.mspx for low price) +; + + +.code +inffas8664fnc PROC + +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and +; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp +; +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r-9, r10, and r11, which are scratch. + + + mov [rsp-8],rsi + mov [rsp-16],rdi + mov [rsp-24],r12 + mov [rsp-32],r13 + mov [rsp-40],r14 + mov [rsp-48],r15 + mov [rsp-56],rbx + + mov rax,rcx + + mov [rax+8], rbp ; /* save regs rbp and rsp */ + mov [rax], rsp + + mov rsp, rax ; /* make rsp point to &ar */ + + mov rsi, [rsp+16] ; /* rsi = in */ + mov rdi, [rsp+32] ; /* rdi = out */ + mov r9, [rsp+24] ; /* r9 = last */ + mov r10, [rsp+48] ; /* r10 = end */ + mov rbp, [rsp+64] ; /* rbp = lcode */ + mov r11, [rsp+72] ; /* r11 = dcode */ + mov rdx, [rsp+80] ; /* rdx = hold */ + mov ebx, [rsp+88] ; /* ebx = bits */ + mov r12d, [rsp+100] ; /* r12d = lmask */ + mov r13d, [rsp+104] ; /* r13d = dmask */ + ; /* r14d = len */ + ; /* r15d = dist */ + + + cld + cmp r10, rdi + je L_one_time ; /* if only one decode left */ + cmp r9, rsi + + jne L_do_loop + + +L_one_time: + mov r8, r12 ; /* r8 = lmask */ + cmp bl, 32 + ja L_get_length_code_one_time + + lodsd ; /* eax = *(uint *)in++ */ + mov cl, bl ; /* cl = bits, needs it for shifting */ + add bl, 32 ; /* bits += 32 */ + shl rax, cl + or rdx, rax ; /* hold |= *((uint *)in)++ << bits */ + jmp L_get_length_code_one_time + +ALIGN 4 +L_while_test: + cmp r10, rdi + jbe L_break_loop + cmp r9, rsi + jbe L_break_loop + +L_do_loop: + mov r8, r12 ; /* r8 = lmask */ + cmp bl, 32 + ja L_get_length_code ; /* if (32 < bits) */ + + lodsd ; /* eax = *(uint *)in++ */ + mov cl, bl ; /* cl = bits, needs it for shifting */ + add bl, 32 ; /* bits += 32 */ + shl rax, cl + or rdx, rax ; /* hold |= *((uint *)in)++ << bits */ + +L_get_length_code: + and r8, rdx ; /* r8 &= hold */ + mov eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */ + + mov cl, ah ; /* cl = this.bits */ + sub bl, ah ; /* bits -= this.bits */ + shr rdx, cl ; /* hold >>= this.bits */ + + test al, al + jnz L_test_for_length_base ; /* if (op != 0) 45.7% */ + + mov r8, r12 ; /* r8 = lmask */ + shr eax, 16 ; /* output this.val char */ + stosb + +L_get_length_code_one_time: + and r8, rdx ; /* r8 &= hold */ + mov eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */ + +L_dolen: + mov cl, ah ; /* cl = this.bits */ + sub bl, ah ; /* bits -= this.bits */ + shr rdx, cl ; /* hold >>= this.bits */ + + test al, al + jnz L_test_for_length_base ; /* if (op != 0) 45.7% */ + + shr eax, 16 ; /* output this.val char */ + stosb + jmp L_while_test + +ALIGN 4 +L_test_for_length_base: + mov r14d, eax ; /* len = this */ + shr r14d, 16 ; /* len = this.val */ + mov cl, al + + test al, 16 + jz L_test_for_second_level_length ; /* if ((op & 16) == 0) 8% */ + and cl, 15 ; /* op &= 15 */ + jz L_decode_distance ; /* if (!op) */ + +L_add_bits_to_len: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx ; /* eax &= hold */ + shr rdx, cl + add r14d, eax ; /* len += hold & mask[op] */ + +L_decode_distance: + mov r8, r13 ; /* r8 = dmask */ + cmp bl, 32 + ja L_get_distance_code ; /* if (32 < bits) */ + + lodsd ; /* eax = *(uint *)in++ */ + mov cl, bl ; /* cl = bits, needs it for shifting */ + add bl, 32 ; /* bits += 32 */ + shl rax, cl + or rdx, rax ; /* hold |= *((uint *)in)++ << bits */ + +L_get_distance_code: + and r8, rdx ; /* r8 &= hold */ + mov eax, [r11+r8*4] ; /* eax = dcode[hold & dmask] */ + +L_dodist: + mov r15d, eax ; /* dist = this */ + shr r15d, 16 ; /* dist = this.val */ + mov cl, ah + sub bl, ah ; /* bits -= this.bits */ + shr rdx, cl ; /* hold >>= this.bits */ + mov cl, al ; /* cl = this.op */ + + test al, 16 ; /* if ((op & 16) == 0) */ + jz L_test_for_second_level_dist + and cl, 15 ; /* op &= 15 */ + jz L_check_dist_one + +L_add_bits_to_dist: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax ; /* (1 << op) - 1 */ + and eax, edx ; /* eax &= hold */ + shr rdx, cl + add r15d, eax ; /* dist += hold & ((1 << op) - 1) */ + +L_check_window: + mov r8, rsi ; /* save in so from can use it's reg */ + mov rax, rdi + sub rax, [rsp+40] ; /* nbytes = out - beg */ + + cmp eax, r15d + jb L_clip_window ; /* if (dist > nbytes) 4.2% */ + + mov ecx, r14d ; /* ecx = len */ + mov rsi, rdi + sub rsi, r15 ; /* from = out - dist */ + + sar ecx, 1 + jnc L_copy_two ; /* if len % 2 == 0 */ + + rep movsw + mov al, [rsi] + mov [rdi], al + inc rdi + + mov rsi, r8 ; /* move in back to %rsi, toss from */ + jmp L_while_test + +L_copy_two: + rep movsw + mov rsi, r8 ; /* move in back to %rsi, toss from */ + jmp L_while_test + +ALIGN 4 +L_check_dist_one: + cmp r15d, 1 ; /* if dist 1, is a memset */ + jne L_check_window + cmp [rsp+40], rdi ; /* if out == beg, outside window */ + je L_check_window + + mov ecx, r14d ; /* ecx = len */ + mov al, [rdi-1] + mov ah, al + + sar ecx, 1 + jnc L_set_two + mov [rdi], al + inc rdi + +L_set_two: + rep stosw + jmp L_while_test + +ALIGN 4 +L_test_for_second_level_length: + test al, 64 + jnz L_test_for_end_of_block ; /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx ; /* eax &= hold */ + add eax, r14d ; /* eax += len */ + mov eax, [rbp+rax*4] ; /* eax = lcode[val+(hold&mask[op])]*/ + jmp L_dolen + +ALIGN 4 +L_test_for_second_level_dist: + test al, 64 + jnz L_invalid_distance_code ; /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx ; /* eax &= hold */ + add eax, r15d ; /* eax += dist */ + mov eax, [r11+rax*4] ; /* eax = dcode[val+(hold&mask[op])]*/ + jmp L_dodist + +ALIGN 4 +L_clip_window: + mov ecx, eax ; /* ecx = nbytes */ + mov eax, [rsp+92] ; /* eax = wsize, prepare for dist cmp */ + neg ecx ; /* nbytes = -nbytes */ + + cmp eax, r15d + jb L_invalid_distance_too_far ; /* if (dist > wsize) */ + + add ecx, r15d ; /* nbytes = dist - nbytes */ + cmp dword ptr [rsp+96], 0 + jne L_wrap_around_window ; /* if (write != 0) */ + + mov rsi, [rsp+56] ; /* from = window */ + sub eax, ecx ; /* eax -= nbytes */ + add rsi, rax ; /* from += wsize - nbytes */ + + mov eax, r14d ; /* eax = len */ + cmp r14d, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* eax -= nbytes */ + rep movsb + mov rsi, rdi + sub rsi, r15 ; /* from = &out[ -dist ] */ + jmp L_do_copy + +ALIGN 4 +L_wrap_around_window: + mov eax, [rsp+96] ; /* eax = write */ + cmp ecx, eax + jbe L_contiguous_in_window ; /* if (write >= nbytes) */ + + mov esi, [rsp+92] ; /* from = wsize */ + add rsi, [rsp+56] ; /* from += window */ + add rsi, rax ; /* from += write */ + sub rsi, rcx ; /* from -= nbytes */ + sub ecx, eax ; /* nbytes -= write */ + + mov eax, r14d ; /* eax = len */ + cmp eax, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* len -= nbytes */ + rep movsb + mov rsi, [rsp+56] ; /* from = window */ + mov ecx, [rsp+96] ; /* nbytes = write */ + cmp eax, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* len -= nbytes */ + rep movsb + mov rsi, rdi + sub rsi, r15 ; /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_contiguous_in_window: + mov rsi, [rsp+56] ; /* rsi = window */ + add rsi, rax + sub rsi, rcx ; /* from += write - nbytes */ + + mov eax, r14d ; /* eax = len */ + cmp eax, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* len -= nbytes */ + rep movsb + mov rsi, rdi + sub rsi, r15 ; /* from = out - dist */ + jmp L_do_copy ; /* if (nbytes >= len) */ + +ALIGN 4 +L_do_copy: + mov ecx, eax ; /* ecx = len */ + rep movsb + + mov rsi, r8 ; /* move in back to %esi, toss from */ + jmp L_while_test + +L_test_for_end_of_block: + test al, 32 + jz L_invalid_literal_length_code + mov dword ptr [rsp+116], 1 + jmp L_break_loop_with_status + +L_invalid_literal_length_code: + mov dword ptr [rsp+116], 2 + jmp L_break_loop_with_status + +L_invalid_distance_code: + mov dword ptr [rsp+116], 3 + jmp L_break_loop_with_status + +L_invalid_distance_too_far: + mov dword ptr [rsp+116], 4 + jmp L_break_loop_with_status + +L_break_loop: + mov dword ptr [rsp+116], 0 + +L_break_loop_with_status: +; /* put in, out, bits, and hold back into ar and pop esp */ + mov [rsp+16], rsi ; /* in */ + mov [rsp+32], rdi ; /* out */ + mov [rsp+88], ebx ; /* bits */ + mov [rsp+80], rdx ; /* hold */ + + mov rax, [rsp] ; /* restore rbp and rsp */ + mov rbp, [rsp+8] + mov rsp, rax + + + + mov rsi,[rsp-8] + mov rdi,[rsp-16] + mov r12,[rsp-24] + mov r13,[rsp-32] + mov r14,[rsp-40] + mov r15,[rsp-48] + mov rbx,[rsp-56] + + ret 0 +; : +; : "m" (ar) +; : "memory", "%rax", "%rbx", "%rcx", "%rdx", "%rsi", "%rdi", +; "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" +; ); + +inffas8664fnc ENDP +;_TEXT ENDS +END diff --git a/externe_kniznice/zlib/contrib/masmx64/readme.txt b/externe_kniznice/zlib/contrib/masmx64/readme.txt new file mode 100644 index 0000000..652571c --- /dev/null +++ b/externe_kniznice/zlib/contrib/masmx64/readme.txt @@ -0,0 +1,31 @@ +Summary +------- +This directory contains ASM implementations of the functions +longest_match() and inflate_fast(), for 64 bits x86 (both AMD64 and Intel EM64t), +for use with Microsoft Macro Assembler (x64) for AMD64 and Microsoft C++ 64 bits. + +gvmat64.asm is written by Gilles Vollant (2005), by using Brian Raiter 686/32 bits + assembly optimized version from Jean-loup Gailly original longest_match function + +inffasx64.asm and inffas8664.c were written by Chris Anderson, by optimizing + original function from Mark Adler + +Use instructions +---------------- +Assemble the .asm files using MASM and put the object files into the zlib source +directory. You can also get object files here: + + http://www.winimage.com/zLibDll/zlib124_masm_obj.zip + +define ASMV and ASMINF in your project. Include inffas8664.c in your source tree, +and inffasx64.obj and gvmat64.obj as object to link. + + +Build instructions +------------------ +run bld_64.bat with Microsoft Macro Assembler (x64) for AMD64 (ml64.exe) + +ml64.exe is given with Visual Studio 2005, Windows 2003 server DDK + +You can get Windows 2003 server DDK with ml64 and cl for AMD64 from + http://www.microsoft.com/whdc/devtools/ddk/default.mspx for low price) diff --git a/externe_kniznice/zlib/contrib/masmx86/bld_ml32.bat b/externe_kniznice/zlib/contrib/masmx86/bld_ml32.bat new file mode 100644 index 0000000..fcf5755 --- /dev/null +++ b/externe_kniznice/zlib/contrib/masmx86/bld_ml32.bat @@ -0,0 +1,2 @@ +ml /coff /Zi /c /Flmatch686.lst match686.asm +ml /coff /Zi /c /Flinffas32.lst inffas32.asm diff --git a/externe_kniznice/zlib/contrib/masmx86/inffas32.asm b/externe_kniznice/zlib/contrib/masmx86/inffas32.asm new file mode 100644 index 0000000..cb37a81 --- /dev/null +++ b/externe_kniznice/zlib/contrib/masmx86/inffas32.asm @@ -0,0 +1,1080 @@ +;/* inffas32.asm is a hand tuned assembler version of inffast.c -- fast decoding +; * +; * inffas32.asm is derivated from inffas86.c, with translation of assembly code +; * +; * Copyright (C) 1995-2003 Mark Adler +; * For conditions of distribution and use, see copyright notice in zlib.h +; * +; * Copyright (C) 2003 Chris Anderson +; * Please use the copyright conditions above. +; * +; * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from +; * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at +; * the moment. I have successfully compiled and tested this code with gcc2.96, +; * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S +; * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX +; * enabled. I will attempt to merge the MMX code into this version. Newer +; * versions of this and inffast.S can be found at +; * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ +; * +; * 2005 : modification by Gilles Vollant +; */ +; For Visual C++ 4.x and higher and ML 6.x and higher +; ml.exe is in directory \MASM611C of Win95 DDK +; ml.exe is also distributed in http://www.masm32.com/masmdl.htm +; and in VC++2003 toolkit at http://msdn.microsoft.com/visualc/vctoolkit2003/ +; +; +; compile with command line option +; ml /coff /Zi /c /Flinffas32.lst inffas32.asm + +; if you define NO_GZIP (see inflate.h), compile with +; ml /coff /Zi /c /Flinffas32.lst /DNO_GUNZIP inffas32.asm + + +; zlib122sup is 0 fort zlib 1.2.2.1 and lower +; zlib122sup is 8 fort zlib 1.2.2.2 and more (with addition of dmax and head +; in inflate_state in inflate.h) +zlib1222sup equ 8 + + +IFDEF GUNZIP + INFLATE_MODE_TYPE equ 11 + INFLATE_MODE_BAD equ 26 +ELSE + IFNDEF NO_GUNZIP + INFLATE_MODE_TYPE equ 11 + INFLATE_MODE_BAD equ 26 + ELSE + INFLATE_MODE_TYPE equ 3 + INFLATE_MODE_BAD equ 17 + ENDIF +ENDIF + + +; 75 "inffast.S" +;FILE "inffast.S" + +;;;GLOBAL _inflate_fast + +;;;SECTION .text + + + + .586p + .mmx + + name inflate_fast_x86 + .MODEL FLAT + +_DATA segment +inflate_fast_use_mmx: + dd 1 + + +_TEXT segment + + + +ALIGN 4 + db 'Fast decoding Code from Chris Anderson' + db 0 + +ALIGN 4 +invalid_literal_length_code_msg: + db 'invalid literal/length code' + db 0 + +ALIGN 4 +invalid_distance_code_msg: + db 'invalid distance code' + db 0 + +ALIGN 4 +invalid_distance_too_far_msg: + db 'invalid distance too far back' + db 0 + + +ALIGN 4 +inflate_fast_mask: +dd 0 +dd 1 +dd 3 +dd 7 +dd 15 +dd 31 +dd 63 +dd 127 +dd 255 +dd 511 +dd 1023 +dd 2047 +dd 4095 +dd 8191 +dd 16383 +dd 32767 +dd 65535 +dd 131071 +dd 262143 +dd 524287 +dd 1048575 +dd 2097151 +dd 4194303 +dd 8388607 +dd 16777215 +dd 33554431 +dd 67108863 +dd 134217727 +dd 268435455 +dd 536870911 +dd 1073741823 +dd 2147483647 +dd 4294967295 + + +mode_state equ 0 ;/* state->mode */ +wsize_state equ (32+zlib1222sup) ;/* state->wsize */ +write_state equ (36+4+zlib1222sup) ;/* state->write */ +window_state equ (40+4+zlib1222sup) ;/* state->window */ +hold_state equ (44+4+zlib1222sup) ;/* state->hold */ +bits_state equ (48+4+zlib1222sup) ;/* state->bits */ +lencode_state equ (64+4+zlib1222sup) ;/* state->lencode */ +distcode_state equ (68+4+zlib1222sup) ;/* state->distcode */ +lenbits_state equ (72+4+zlib1222sup) ;/* state->lenbits */ +distbits_state equ (76+4+zlib1222sup) ;/* state->distbits */ + + +;;SECTION .text +; 205 "inffast.S" +;GLOBAL inflate_fast_use_mmx + +;SECTION .data + + +; GLOBAL inflate_fast_use_mmx:object +;.size inflate_fast_use_mmx, 4 +; 226 "inffast.S" +;SECTION .text + +ALIGN 4 +_inflate_fast proc near +.FPO (16, 4, 0, 0, 1, 0) + push edi + push esi + push ebp + push ebx + pushfd + sub esp,64 + cld + + + + + mov esi, [esp+88] + mov edi, [esi+28] + + + + + + + + mov edx, [esi+4] + mov eax, [esi+0] + + add edx,eax + sub edx,11 + + mov [esp+44],eax + mov [esp+20],edx + + mov ebp, [esp+92] + mov ecx, [esi+16] + mov ebx, [esi+12] + + sub ebp,ecx + neg ebp + add ebp,ebx + + sub ecx,257 + add ecx,ebx + + mov [esp+60],ebx + mov [esp+40],ebp + mov [esp+16],ecx +; 285 "inffast.S" + mov eax, [edi+lencode_state] + mov ecx, [edi+distcode_state] + + mov [esp+8],eax + mov [esp+12],ecx + + mov eax,1 + mov ecx, [edi+lenbits_state] + shl eax,cl + dec eax + mov [esp+0],eax + + mov eax,1 + mov ecx, [edi+distbits_state] + shl eax,cl + dec eax + mov [esp+4],eax + + mov eax, [edi+wsize_state] + mov ecx, [edi+write_state] + mov edx, [edi+window_state] + + mov [esp+52],eax + mov [esp+48],ecx + mov [esp+56],edx + + mov ebp, [edi+hold_state] + mov ebx, [edi+bits_state] +; 321 "inffast.S" + mov esi, [esp+44] + mov ecx, [esp+20] + cmp ecx,esi + ja L_align_long + + add ecx,11 + sub ecx,esi + mov eax,12 + sub eax,ecx + lea edi, [esp+28] + rep movsb + mov ecx,eax + xor eax,eax + rep stosb + lea esi, [esp+28] + mov [esp+20],esi + jmp L_is_aligned + + +L_align_long: + test esi,3 + jz L_is_aligned + xor eax,eax + mov al, [esi] + inc esi + mov ecx,ebx + add ebx,8 + shl eax,cl + or ebp,eax + jmp L_align_long + +L_is_aligned: + mov edi, [esp+60] +; 366 "inffast.S" +L_check_mmx: + cmp dword ptr [inflate_fast_use_mmx],2 + je L_init_mmx + ja L_do_loop + + push eax + push ebx + push ecx + push edx + pushfd + mov eax, [esp] + xor dword ptr [esp],0200000h + + + + + popfd + pushfd + pop edx + xor edx,eax + jz L_dont_use_mmx + xor eax,eax + cpuid + cmp ebx,0756e6547h + jne L_dont_use_mmx + cmp ecx,06c65746eh + jne L_dont_use_mmx + cmp edx,049656e69h + jne L_dont_use_mmx + mov eax,1 + cpuid + shr eax,8 + and eax,15 + cmp eax,6 + jne L_dont_use_mmx + test edx,0800000h + jnz L_use_mmx + jmp L_dont_use_mmx +L_use_mmx: + mov dword ptr [inflate_fast_use_mmx],2 + jmp L_check_mmx_pop +L_dont_use_mmx: + mov dword ptr [inflate_fast_use_mmx],3 +L_check_mmx_pop: + pop edx + pop ecx + pop ebx + pop eax + jmp L_check_mmx +; 426 "inffast.S" +ALIGN 4 +L_do_loop: +; 437 "inffast.S" + cmp bl,15 + ja L_get_length_code + + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + +L_get_length_code: + mov edx, [esp+0] + mov ecx, [esp+8] + and edx,ebp + mov eax, [ecx+edx*4] + +L_dolen: + + + + + + + mov cl,ah + sub bl,ah + shr ebp,cl + + + + + + + test al,al + jnz L_test_for_length_base + + shr eax,16 + stosb + +L_while_test: + + + cmp [esp+16],edi + jbe L_break_loop + + cmp [esp+20],esi + ja L_do_loop + jmp L_break_loop + +L_test_for_length_base: +; 502 "inffast.S" + mov edx,eax + shr edx,16 + mov cl,al + + test al,16 + jz L_test_for_second_level_length + and cl,15 + jz L_save_len + cmp bl,cl + jae L_add_bits_to_len + + mov ch,cl + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + mov cl,ch + +L_add_bits_to_len: + mov eax,1 + shl eax,cl + dec eax + sub bl,cl + and eax,ebp + shr ebp,cl + add edx,eax + +L_save_len: + mov [esp+24],edx + + +L_decode_distance: +; 549 "inffast.S" + cmp bl,15 + ja L_get_distance_code + + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + +L_get_distance_code: + mov edx, [esp+4] + mov ecx, [esp+12] + and edx,ebp + mov eax, [ecx+edx*4] + + +L_dodist: + mov edx,eax + shr edx,16 + mov cl,ah + sub bl,ah + shr ebp,cl +; 584 "inffast.S" + mov cl,al + + test al,16 + jz L_test_for_second_level_dist + and cl,15 + jz L_check_dist_one + cmp bl,cl + jae L_add_bits_to_dist + + mov ch,cl + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + mov cl,ch + +L_add_bits_to_dist: + mov eax,1 + shl eax,cl + dec eax + sub bl,cl + and eax,ebp + shr ebp,cl + add edx,eax + jmp L_check_window + +L_check_window: +; 625 "inffast.S" + mov [esp+44],esi + mov eax,edi + sub eax, [esp+40] + + cmp eax,edx + jb L_clip_window + + mov ecx, [esp+24] + mov esi,edi + sub esi,edx + + sub ecx,3 + mov al, [esi] + mov [edi],al + mov al, [esi+1] + mov dl, [esi+2] + add esi,3 + mov [edi+1],al + mov [edi+2],dl + add edi,3 + rep movsb + + mov esi, [esp+44] + jmp L_while_test + +ALIGN 4 +L_check_dist_one: + cmp edx,1 + jne L_check_window + cmp [esp+40],edi + je L_check_window + + dec edi + mov ecx, [esp+24] + mov al, [edi] + sub ecx,3 + + mov [edi+1],al + mov [edi+2],al + mov [edi+3],al + add edi,4 + rep stosb + + jmp L_while_test + +ALIGN 4 +L_test_for_second_level_length: + + + + + test al,64 + jnz L_test_for_end_of_block + + mov eax,1 + shl eax,cl + dec eax + and eax,ebp + add eax,edx + mov edx, [esp+8] + mov eax, [edx+eax*4] + jmp L_dolen + +ALIGN 4 +L_test_for_second_level_dist: + + + + + test al,64 + jnz L_invalid_distance_code + + mov eax,1 + shl eax,cl + dec eax + and eax,ebp + add eax,edx + mov edx, [esp+12] + mov eax, [edx+eax*4] + jmp L_dodist + +ALIGN 4 +L_clip_window: +; 721 "inffast.S" + mov ecx,eax + mov eax, [esp+52] + neg ecx + mov esi, [esp+56] + + cmp eax,edx + jb L_invalid_distance_too_far + + add ecx,edx + cmp dword ptr [esp+48],0 + jne L_wrap_around_window + + sub eax,ecx + add esi,eax +; 749 "inffast.S" + mov eax, [esp+24] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + jmp L_do_copy1 + + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + jmp L_do_copy1 + +L_wrap_around_window: +; 793 "inffast.S" + mov eax, [esp+48] + cmp ecx,eax + jbe L_contiguous_in_window + + add esi, [esp+52] + add esi,eax + sub esi,ecx + sub ecx,eax + + + mov eax, [esp+24] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi, [esp+56] + mov ecx, [esp+48] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + jmp L_do_copy1 + +L_contiguous_in_window: +; 836 "inffast.S" + add esi,eax + sub esi,ecx + + + mov eax, [esp+24] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + +L_do_copy1: +; 862 "inffast.S" + mov ecx,eax + rep movsb + + mov esi, [esp+44] + jmp L_while_test +; 878 "inffast.S" +ALIGN 4 +L_init_mmx: + emms + + + + + + movd mm0,ebp + mov ebp,ebx +; 896 "inffast.S" + movd mm4,dword ptr [esp+0] + movq mm3,mm4 + movd mm5,dword ptr [esp+4] + movq mm2,mm5 + pxor mm1,mm1 + mov ebx, [esp+8] + jmp L_do_loop_mmx + +ALIGN 4 +L_do_loop_mmx: + psrlq mm0,mm1 + + cmp ebp,32 + ja L_get_length_code_mmx + + movd mm6,ebp + movd mm7,dword ptr [esi] + add esi,4 + psllq mm7,mm6 + add ebp,32 + por mm0,mm7 + +L_get_length_code_mmx: + pand mm4,mm0 + movd eax,mm4 + movq mm4,mm3 + mov eax, [ebx+eax*4] + +L_dolen_mmx: + movzx ecx,ah + movd mm1,ecx + sub ebp,ecx + + test al,al + jnz L_test_for_length_base_mmx + + shr eax,16 + stosb + +L_while_test_mmx: + + + cmp [esp+16],edi + jbe L_break_loop + + cmp [esp+20],esi + ja L_do_loop_mmx + jmp L_break_loop + +L_test_for_length_base_mmx: + + mov edx,eax + shr edx,16 + + test al,16 + jz L_test_for_second_level_length_mmx + and eax,15 + jz L_decode_distance_mmx + + psrlq mm0,mm1 + movd mm1,eax + movd ecx,mm0 + sub ebp,eax + and ecx, [inflate_fast_mask+eax*4] + add edx,ecx + +L_decode_distance_mmx: + psrlq mm0,mm1 + + cmp ebp,32 + ja L_get_dist_code_mmx + + movd mm6,ebp + movd mm7,dword ptr [esi] + add esi,4 + psllq mm7,mm6 + add ebp,32 + por mm0,mm7 + +L_get_dist_code_mmx: + mov ebx, [esp+12] + pand mm5,mm0 + movd eax,mm5 + movq mm5,mm2 + mov eax, [ebx+eax*4] + +L_dodist_mmx: + + movzx ecx,ah + mov ebx,eax + shr ebx,16 + sub ebp,ecx + movd mm1,ecx + + test al,16 + jz L_test_for_second_level_dist_mmx + and eax,15 + jz L_check_dist_one_mmx + +L_add_bits_to_dist_mmx: + psrlq mm0,mm1 + movd mm1,eax + movd ecx,mm0 + sub ebp,eax + and ecx, [inflate_fast_mask+eax*4] + add ebx,ecx + +L_check_window_mmx: + mov [esp+44],esi + mov eax,edi + sub eax, [esp+40] + + cmp eax,ebx + jb L_clip_window_mmx + + mov ecx,edx + mov esi,edi + sub esi,ebx + + sub ecx,3 + mov al, [esi] + mov [edi],al + mov al, [esi+1] + mov dl, [esi+2] + add esi,3 + mov [edi+1],al + mov [edi+2],dl + add edi,3 + rep movsb + + mov esi, [esp+44] + mov ebx, [esp+8] + jmp L_while_test_mmx + +ALIGN 4 +L_check_dist_one_mmx: + cmp ebx,1 + jne L_check_window_mmx + cmp [esp+40],edi + je L_check_window_mmx + + dec edi + mov ecx,edx + mov al, [edi] + sub ecx,3 + + mov [edi+1],al + mov [edi+2],al + mov [edi+3],al + add edi,4 + rep stosb + + mov ebx, [esp+8] + jmp L_while_test_mmx + +ALIGN 4 +L_test_for_second_level_length_mmx: + test al,64 + jnz L_test_for_end_of_block + + and eax,15 + psrlq mm0,mm1 + movd ecx,mm0 + and ecx, [inflate_fast_mask+eax*4] + add ecx,edx + mov eax, [ebx+ecx*4] + jmp L_dolen_mmx + +ALIGN 4 +L_test_for_second_level_dist_mmx: + test al,64 + jnz L_invalid_distance_code + + and eax,15 + psrlq mm0,mm1 + movd ecx,mm0 + and ecx, [inflate_fast_mask+eax*4] + mov eax, [esp+12] + add ecx,ebx + mov eax, [eax+ecx*4] + jmp L_dodist_mmx + +ALIGN 4 +L_clip_window_mmx: + + mov ecx,eax + mov eax, [esp+52] + neg ecx + mov esi, [esp+56] + + cmp eax,ebx + jb L_invalid_distance_too_far + + add ecx,ebx + cmp dword ptr [esp+48],0 + jne L_wrap_around_window_mmx + + sub eax,ecx + add esi,eax + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + jmp L_do_copy1_mmx + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + jmp L_do_copy1_mmx + +L_wrap_around_window_mmx: + + mov eax, [esp+48] + cmp ecx,eax + jbe L_contiguous_in_window_mmx + + add esi, [esp+52] + add esi,eax + sub esi,ecx + sub ecx,eax + + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi, [esp+56] + mov ecx, [esp+48] + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + jmp L_do_copy1_mmx + +L_contiguous_in_window_mmx: + + add esi,eax + sub esi,ecx + + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + +L_do_copy1_mmx: + + + mov ecx,edx + rep movsb + + mov esi, [esp+44] + mov ebx, [esp+8] + jmp L_while_test_mmx +; 1174 "inffast.S" +L_invalid_distance_code: + + + + + + mov ecx, invalid_distance_code_msg + mov edx,INFLATE_MODE_BAD + jmp L_update_stream_state + +L_test_for_end_of_block: + + + + + + test al,32 + jz L_invalid_literal_length_code + + mov ecx,0 + mov edx,INFLATE_MODE_TYPE + jmp L_update_stream_state + +L_invalid_literal_length_code: + + + + + + mov ecx, invalid_literal_length_code_msg + mov edx,INFLATE_MODE_BAD + jmp L_update_stream_state + +L_invalid_distance_too_far: + + + + mov esi, [esp+44] + mov ecx, invalid_distance_too_far_msg + mov edx,INFLATE_MODE_BAD + jmp L_update_stream_state + +L_update_stream_state: + + mov eax, [esp+88] + test ecx,ecx + jz L_skip_msg + mov [eax+24],ecx +L_skip_msg: + mov eax, [eax+28] + mov [eax+mode_state],edx + jmp L_break_loop + +ALIGN 4 +L_break_loop: +; 1243 "inffast.S" + cmp dword ptr [inflate_fast_use_mmx],2 + jne L_update_next_in + + + + mov ebx,ebp + +L_update_next_in: +; 1266 "inffast.S" + mov eax, [esp+88] + mov ecx,ebx + mov edx, [eax+28] + shr ecx,3 + sub esi,ecx + shl ecx,3 + sub ebx,ecx + mov [eax+12],edi + mov [edx+bits_state],ebx + mov ecx,ebx + + lea ebx, [esp+28] + cmp [esp+20],ebx + jne L_buf_not_used + + sub esi,ebx + mov ebx, [eax+0] + mov [esp+20],ebx + add esi,ebx + mov ebx, [eax+4] + sub ebx,11 + add [esp+20],ebx + +L_buf_not_used: + mov [eax+0],esi + + mov ebx,1 + shl ebx,cl + dec ebx + + + + + + cmp dword ptr [inflate_fast_use_mmx],2 + jne L_update_hold + + + + psrlq mm0,mm1 + movd ebp,mm0 + + emms + +L_update_hold: + + + + and ebp,ebx + mov [edx+hold_state],ebp + + + + + mov ebx, [esp+20] + cmp ebx,esi + jbe L_last_is_smaller + + sub ebx,esi + add ebx,11 + mov [eax+4],ebx + jmp L_fixup_out +L_last_is_smaller: + sub esi,ebx + neg esi + add esi,11 + mov [eax+4],esi + + + + +L_fixup_out: + + mov ebx, [esp+16] + cmp ebx,edi + jbe L_end_is_smaller + + sub ebx,edi + add ebx,257 + mov [eax+16],ebx + jmp L_done +L_end_is_smaller: + sub edi,ebx + neg edi + add edi,257 + mov [eax+16],edi + + + + + +L_done: + add esp,64 + popfd + pop ebx + pop ebp + pop esi + pop edi + ret +_inflate_fast endp + +_TEXT ends +end diff --git a/externe_kniznice/zlib/contrib/masmx86/match686.asm b/externe_kniznice/zlib/contrib/masmx86/match686.asm new file mode 100644 index 0000000..69e0eed --- /dev/null +++ b/externe_kniznice/zlib/contrib/masmx86/match686.asm @@ -0,0 +1,479 @@ +; match686.asm -- Asm portion of the optimized longest_match for 32 bits x86 +; Copyright (C) 1995-1996 Jean-loup Gailly, Brian Raiter and Gilles Vollant. +; File written by Gilles Vollant, by converting match686.S from Brian Raiter +; for MASM. This is as assembly version of longest_match +; from Jean-loup Gailly in deflate.c +; +; http://www.zlib.net +; http://www.winimage.com/zLibDll +; http://www.muppetlabs.com/~breadbox/software/assembly.html +; +; For Visual C++ 4.x and higher and ML 6.x and higher +; ml.exe is distributed in +; http://www.microsoft.com/downloads/details.aspx?FamilyID=7a1c9da0-0510-44a2-b042-7ef370530c64 +; +; this file contain two implementation of longest_match +; +; this longest_match was written by Brian raiter (1998), optimized for Pentium Pro +; (and the faster known version of match_init on modern Core 2 Duo and AMD Phenom) +; +; for using an assembly version of longest_match, you need define ASMV in project +; +; compile the asm file running +; ml /coff /Zi /c /Flmatch686.lst match686.asm +; and do not include match686.obj in your project +; +; note: contrib of zLib 1.2.3 and earlier contained both a deprecated version for +; Pentium (prior Pentium Pro) and this version for Pentium Pro and modern processor +; with autoselect (with cpu detection code) +; if you want support the old pentium optimization, you can still use these version +; +; this file is not optimized for old pentium, but it compatible with all x86 32 bits +; processor (starting 80386) +; +; +; see below : zlib1222add must be adjuster if you use a zlib version < 1.2.2.2 + +;uInt longest_match(s, cur_match) +; deflate_state *s; +; IPos cur_match; /* current match */ + + NbStack equ 76 + cur_match equ dword ptr[esp+NbStack-0] + str_s equ dword ptr[esp+NbStack-4] +; 5 dword on top (ret,ebp,esi,edi,ebx) + adrret equ dword ptr[esp+NbStack-8] + pushebp equ dword ptr[esp+NbStack-12] + pushedi equ dword ptr[esp+NbStack-16] + pushesi equ dword ptr[esp+NbStack-20] + pushebx equ dword ptr[esp+NbStack-24] + + chain_length equ dword ptr [esp+NbStack-28] + limit equ dword ptr [esp+NbStack-32] + best_len equ dword ptr [esp+NbStack-36] + window equ dword ptr [esp+NbStack-40] + prev equ dword ptr [esp+NbStack-44] + scan_start equ word ptr [esp+NbStack-48] + wmask equ dword ptr [esp+NbStack-52] + match_start_ptr equ dword ptr [esp+NbStack-56] + nice_match equ dword ptr [esp+NbStack-60] + scan equ dword ptr [esp+NbStack-64] + + windowlen equ dword ptr [esp+NbStack-68] + match_start equ dword ptr [esp+NbStack-72] + strend equ dword ptr [esp+NbStack-76] + NbStackAdd equ (NbStack-24) + + .386p + + name gvmatch + .MODEL FLAT + + + +; all the +zlib1222add offsets are due to the addition of fields +; in zlib in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). +; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). +; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). + + zlib1222add equ 8 + +; Note : these value are good with a 8 bytes boundary pack structure + dep_chain_length equ 74h+zlib1222add + dep_window equ 30h+zlib1222add + dep_strstart equ 64h+zlib1222add + dep_prev_length equ 70h+zlib1222add + dep_nice_match equ 88h+zlib1222add + dep_w_size equ 24h+zlib1222add + dep_prev equ 38h+zlib1222add + dep_w_mask equ 2ch+zlib1222add + dep_good_match equ 84h+zlib1222add + dep_match_start equ 68h+zlib1222add + dep_lookahead equ 6ch+zlib1222add + + +_TEXT segment + +IFDEF NOUNDERLINE + public longest_match + public match_init +ELSE + public _longest_match + public _match_init +ENDIF + + MAX_MATCH equ 258 + MIN_MATCH equ 3 + MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1) + + + +MAX_MATCH equ 258 +MIN_MATCH equ 3 +MIN_LOOKAHEAD equ (MAX_MATCH + MIN_MATCH + 1) +MAX_MATCH_8_ equ ((MAX_MATCH + 7) AND 0FFF0h) + + +;;; stack frame offsets + +chainlenwmask equ esp + 0 ; high word: current chain len + ; low word: s->wmask +window equ esp + 4 ; local copy of s->window +windowbestlen equ esp + 8 ; s->window + bestlen +scanstart equ esp + 16 ; first two bytes of string +scanend equ esp + 12 ; last two bytes of string +scanalign equ esp + 20 ; dword-misalignment of string +nicematch equ esp + 24 ; a good enough match size +bestlen equ esp + 28 ; size of best match so far +scan equ esp + 32 ; ptr to string wanting match + +LocalVarsSize equ 36 +; saved ebx byte esp + 36 +; saved edi byte esp + 40 +; saved esi byte esp + 44 +; saved ebp byte esp + 48 +; return address byte esp + 52 +deflatestate equ esp + 56 ; the function arguments +curmatch equ esp + 60 + +;;; Offsets for fields in the deflate_state structure. These numbers +;;; are calculated from the definition of deflate_state, with the +;;; assumption that the compiler will dword-align the fields. (Thus, +;;; changing the definition of deflate_state could easily cause this +;;; program to crash horribly, without so much as a warning at +;;; compile time. Sigh.) + +dsWSize equ 36+zlib1222add +dsWMask equ 44+zlib1222add +dsWindow equ 48+zlib1222add +dsPrev equ 56+zlib1222add +dsMatchLen equ 88+zlib1222add +dsPrevMatch equ 92+zlib1222add +dsStrStart equ 100+zlib1222add +dsMatchStart equ 104+zlib1222add +dsLookahead equ 108+zlib1222add +dsPrevLen equ 112+zlib1222add +dsMaxChainLen equ 116+zlib1222add +dsGoodMatch equ 132+zlib1222add +dsNiceMatch equ 136+zlib1222add + + +;;; match686.asm -- Pentium-Pro-optimized version of longest_match() +;;; Written for zlib 1.1.2 +;;; Copyright (C) 1998 Brian Raiter +;;; You can look at http://www.muppetlabs.com/~breadbox/software/assembly.html +;;; +;; +;; This software is provided 'as-is', without any express or implied +;; warranty. In no event will the authors be held liable for any damages +;; arising from the use of this software. +;; +;; Permission is granted to anyone to use this software for any purpose, +;; including commercial applications, and to alter it and redistribute it +;; freely, subject to the following restrictions: +;; +;; 1. The origin of this software must not be misrepresented; you must not +;; claim that you wrote the original software. If you use this software +;; in a product, an acknowledgment in the product documentation would be +;; appreciated but is not required. +;; 2. Altered source versions must be plainly marked as such, and must not be +;; misrepresented as being the original software +;; 3. This notice may not be removed or altered from any source distribution. +;; + +;GLOBAL _longest_match, _match_init + + +;SECTION .text + +;;; uInt longest_match(deflate_state *deflatestate, IPos curmatch) + +;_longest_match: + IFDEF NOUNDERLINE + longest_match proc near + ELSE + _longest_match proc near + ENDIF +.FPO (9, 4, 0, 0, 1, 0) + +;;; Save registers that the compiler may be using, and adjust esp to +;;; make room for our stack frame. + + push ebp + push edi + push esi + push ebx + sub esp, LocalVarsSize + +;;; Retrieve the function arguments. ecx will hold cur_match +;;; throughout the entire function. edx will hold the pointer to the +;;; deflate_state structure during the function's setup (before +;;; entering the main loop. + + mov edx, [deflatestate] + mov ecx, [curmatch] + +;;; uInt wmask = s->w_mask; +;;; unsigned chain_length = s->max_chain_length; +;;; if (s->prev_length >= s->good_match) { +;;; chain_length >>= 2; +;;; } + + mov eax, [edx + dsPrevLen] + mov ebx, [edx + dsGoodMatch] + cmp eax, ebx + mov eax, [edx + dsWMask] + mov ebx, [edx + dsMaxChainLen] + jl LastMatchGood + shr ebx, 2 +LastMatchGood: + +;;; chainlen is decremented once beforehand so that the function can +;;; use the sign flag instead of the zero flag for the exit test. +;;; It is then shifted into the high word, to make room for the wmask +;;; value, which it will always accompany. + + dec ebx + shl ebx, 16 + or ebx, eax + mov [chainlenwmask], ebx + +;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + mov eax, [edx + dsNiceMatch] + mov ebx, [edx + dsLookahead] + cmp ebx, eax + jl LookaheadLess + mov ebx, eax +LookaheadLess: mov [nicematch], ebx + +;;; register Bytef *scan = s->window + s->strstart; + + mov esi, [edx + dsWindow] + mov [window], esi + mov ebp, [edx + dsStrStart] + lea edi, [esi + ebp] + mov [scan], edi + +;;; Determine how many bytes the scan ptr is off from being +;;; dword-aligned. + + mov eax, edi + neg eax + and eax, 3 + mov [scanalign], eax + +;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? +;;; s->strstart - (IPos)MAX_DIST(s) : NIL; + + mov eax, [edx + dsWSize] + sub eax, MIN_LOOKAHEAD + sub ebp, eax + jg LimitPositive + xor ebp, ebp +LimitPositive: + +;;; int best_len = s->prev_length; + + mov eax, [edx + dsPrevLen] + mov [bestlen], eax + +;;; Store the sum of s->window + best_len in esi locally, and in esi. + + add esi, eax + mov [windowbestlen], esi + +;;; register ush scan_start = *(ushf*)scan; +;;; register ush scan_end = *(ushf*)(scan+best_len-1); +;;; Posf *prev = s->prev; + + movzx ebx, word ptr [edi] + mov [scanstart], ebx + movzx ebx, word ptr [edi + eax - 1] + mov [scanend], ebx + mov edi, [edx + dsPrev] + +;;; Jump into the main loop. + + mov edx, [chainlenwmask] + jmp short LoopEntry + +align 4 + +;;; do { +;;; match = s->window + cur_match; +;;; if (*(ushf*)(match+best_len-1) != scan_end || +;;; *(ushf*)match != scan_start) continue; +;;; [...] +;;; } while ((cur_match = prev[cur_match & wmask]) > limit +;;; && --chain_length != 0); +;;; +;;; Here is the inner loop of the function. The function will spend the +;;; majority of its time in this loop, and majority of that time will +;;; be spent in the first ten instructions. +;;; +;;; Within this loop: +;;; ebx = scanend +;;; ecx = curmatch +;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) +;;; esi = windowbestlen - i.e., (window + bestlen) +;;; edi = prev +;;; ebp = limit + +LookupLoop: + and ecx, edx + movzx ecx, word ptr [edi + ecx*2] + cmp ecx, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow +LoopEntry: movzx eax, word ptr [esi + ecx - 1] + cmp eax, ebx + jnz LookupLoop + mov eax, [window] + movzx eax, word ptr [eax + ecx] + cmp eax, [scanstart] + jnz LookupLoop + +;;; Store the current value of chainlen. + + mov [chainlenwmask], edx + +;;; Point edi to the string under scrutiny, and esi to the string we +;;; are hoping to match it up with. In actuality, esi and edi are +;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is +;;; initialized to -(MAX_MATCH_8 - scanalign). + + mov esi, [window] + mov edi, [scan] + add esi, ecx + mov eax, [scanalign] + mov edx, 0fffffef8h; -(MAX_MATCH_8) + lea edi, [edi + eax + 0108h] ;MAX_MATCH_8] + lea esi, [esi + eax + 0108h] ;MAX_MATCH_8] + +;;; Test the strings for equality, 8 bytes at a time. At the end, +;;; adjust edx so that it is offset to the exact byte that mismatched. +;;; +;;; We already know at this point that the first three bytes of the +;;; strings match each other, and they can be safely passed over before +;;; starting the compare loop. So what this code does is skip over 0-3 +;;; bytes, as much as necessary in order to dword-align the edi +;;; pointer. (esi will still be misaligned three times out of four.) +;;; +;;; It should be confessed that this loop usually does not represent +;;; much of the total running time. Replacing it with a more +;;; straightforward "rep cmpsb" would not drastically degrade +;;; performance. + +LoopCmps: + mov eax, [esi + edx] + xor eax, [edi + edx] + jnz LeaveLoopCmps + mov eax, [esi + edx + 4] + xor eax, [edi + edx + 4] + jnz LeaveLoopCmps4 + add edx, 8 + jnz LoopCmps + jmp short LenMaximum +LeaveLoopCmps4: add edx, 4 +LeaveLoopCmps: test eax, 0000FFFFh + jnz LenLower + add edx, 2 + shr eax, 16 +LenLower: sub al, 1 + adc edx, 0 + +;;; Calculate the length of the match. If it is longer than MAX_MATCH, +;;; then automatically accept it as the best possible match and leave. + + lea eax, [edi + edx] + mov edi, [scan] + sub eax, edi + cmp eax, MAX_MATCH + jge LenMaximum + +;;; If the length of the match is not longer than the best match we +;;; have so far, then forget it and return to the lookup loop. + + mov edx, [deflatestate] + mov ebx, [bestlen] + cmp eax, ebx + jg LongerMatch + mov esi, [windowbestlen] + mov edi, [edx + dsPrev] + mov ebx, [scanend] + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; s->match_start = cur_match; +;;; best_len = len; +;;; if (len >= nice_match) break; +;;; scan_end = *(ushf*)(scan+best_len-1); + +LongerMatch: mov ebx, [nicematch] + mov [bestlen], eax + mov [edx + dsMatchStart], ecx + cmp eax, ebx + jge LeaveNow + mov esi, [window] + add esi, eax + mov [windowbestlen], esi + movzx ebx, word ptr [edi + eax - 1] + mov edi, [edx + dsPrev] + mov [scanend], ebx + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; Accept the current string, with the maximum possible length. + +LenMaximum: mov edx, [deflatestate] + mov dword ptr [bestlen], MAX_MATCH + mov [edx + dsMatchStart], ecx + +;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len; +;;; return s->lookahead; + +LeaveNow: + mov edx, [deflatestate] + mov ebx, [bestlen] + mov eax, [edx + dsLookahead] + cmp ebx, eax + jg LookaheadRet + mov eax, ebx +LookaheadRet: + +;;; Restore the stack and return from whence we came. + + add esp, LocalVarsSize + pop ebx + pop esi + pop edi + pop ebp + + ret +; please don't remove this string ! +; Your can freely use match686 in any free or commercial app if you don't remove the string in the binary! + db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998",0dh,0ah + + + IFDEF NOUNDERLINE + longest_match endp + ELSE + _longest_match endp + ENDIF + + IFDEF NOUNDERLINE + match_init proc near + ret + match_init endp + ELSE + _match_init proc near + ret + _match_init endp + ENDIF + + +_TEXT ends +end diff --git a/externe_kniznice/zlib/contrib/masmx86/readme.txt b/externe_kniznice/zlib/contrib/masmx86/readme.txt new file mode 100644 index 0000000..3f88886 --- /dev/null +++ b/externe_kniznice/zlib/contrib/masmx86/readme.txt @@ -0,0 +1,27 @@ + +Summary +------- +This directory contains ASM implementations of the functions +longest_match() and inflate_fast(). + + +Use instructions +---------------- +Assemble using MASM, and copy the object files into the zlib source +directory, then run the appropriate makefile, as suggested below. You can +donwload MASM from here: + + http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=7a1c9da0-0510-44a2-b042-7ef370530c64 + +You can also get objects files here: + + http://www.winimage.com/zLibDll/zlib124_masm_obj.zip + +Build instructions +------------------ +* With Microsoft C and MASM: +nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" OBJA="match686.obj inffas32.obj" + +* With Borland C and TASM: +make -f win32/Makefile.bor LOCAL_ZLIB="-DASMV -DASMINF" OBJA="match686.obj inffas32.obj" OBJPA="+match686c.obj+match686.obj+inffas32.obj" + diff --git a/externe_kniznice/zlib/contrib/minizip/Makefile b/externe_kniznice/zlib/contrib/minizip/Makefile new file mode 100644 index 0000000..84eaad2 --- /dev/null +++ b/externe_kniznice/zlib/contrib/minizip/Makefile @@ -0,0 +1,25 @@ +CC=cc +CFLAGS=-O -I../.. + +UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a +ZIP_OBJS = minizip.o zip.o ioapi.o ../../libz.a + +.c.o: + $(CC) -c $(CFLAGS) $*.c + +all: miniunz minizip + +miniunz: $(UNZ_OBJS) + $(CC) $(CFLAGS) -o $@ $(UNZ_OBJS) + +minizip: $(ZIP_OBJS) + $(CC) $(CFLAGS) -o $@ $(ZIP_OBJS) + +test: miniunz minizip + ./minizip test readme.txt + ./miniunz -l test.zip + mv readme.txt readme.old + ./miniunz test.zip + +clean: + /bin/rm -f *.o *~ minizip miniunz diff --git a/externe_kniznice/zlib/contrib/minizip/Makefile.am b/externe_kniznice/zlib/contrib/minizip/Makefile.am new file mode 100644 index 0000000..d343011 --- /dev/null +++ b/externe_kniznice/zlib/contrib/minizip/Makefile.am @@ -0,0 +1,45 @@ +lib_LTLIBRARIES = libminizip.la + +if COND_DEMOS +bin_PROGRAMS = miniunzip minizip +endif + +zlib_top_srcdir = $(top_srcdir)/../.. +zlib_top_builddir = $(top_builddir)/../.. + +AM_CPPFLAGS = -I$(zlib_top_srcdir) +AM_LDFLAGS = -L$(zlib_top_builddir) + +if WIN32 +iowin32_src = iowin32.c +iowin32_h = iowin32.h +endif + +libminizip_la_SOURCES = \ + ioapi.c \ + mztools.c \ + unzip.c \ + zip.c \ + ${iowin32_src} + +libminizip_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 -lz + +minizip_includedir = $(includedir)/minizip +minizip_include_HEADERS = \ + crypt.h \ + ioapi.h \ + mztools.h \ + unzip.h \ + zip.h \ + ${iowin32_h} + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = minizip.pc + +EXTRA_PROGRAMS = miniunzip minizip + +miniunzip_SOURCES = miniunz.c +miniunzip_LDADD = libminizip.la + +minizip_SOURCES = minizip.c +minizip_LDADD = libminizip.la -lz diff --git a/externe_kniznice/zlib/contrib/minizip/MiniZip64_Changes.txt b/externe_kniznice/zlib/contrib/minizip/MiniZip64_Changes.txt new file mode 100644 index 0000000..13a1bd9 --- /dev/null +++ b/externe_kniznice/zlib/contrib/minizip/MiniZip64_Changes.txt @@ -0,0 +1,6 @@ + +MiniZip 1.1 was derrived from MiniZip at version 1.01f + +Change in 1.0 (Okt 2009) + - **TODO - Add history** + diff --git a/externe_kniznice/zlib/contrib/minizip/MiniZip64_info.txt b/externe_kniznice/zlib/contrib/minizip/MiniZip64_info.txt new file mode 100644 index 0000000..57d7152 --- /dev/null +++ b/externe_kniznice/zlib/contrib/minizip/MiniZip64_info.txt @@ -0,0 +1,74 @@ +MiniZip - Copyright (c) 1998-2010 - by Gilles Vollant - version 1.1 64 bits from Mathias Svensson + +Introduction +--------------------- +MiniZip 1.1 is built from MiniZip 1.0 by Gilles Vollant ( http://www.winimage.com/zLibDll/minizip.html ) + +When adding ZIP64 support into minizip it would result into risk of breaking compatibility with minizip 1.0. +All possible work was done for compatibility. + + +Background +--------------------- +When adding ZIP64 support Mathias Svensson found that Even Rouault have added ZIP64 +support for unzip.c into minizip for a open source project called gdal ( http://www.gdal.org/ ) + +That was used as a starting point. And after that ZIP64 support was added to zip.c +some refactoring and code cleanup was also done. + + +Changed from MiniZip 1.0 to MiniZip 1.1 +--------------------------------------- +* Added ZIP64 support for unzip ( by Even Rouault ) +* Added ZIP64 support for zip ( by Mathias Svensson ) +* Reverted some changed that Even Rouault did. +* Bunch of patches received from Gulles Vollant that he received for MiniZip from various users. +* Added unzip patch for BZIP Compression method (patch create by Daniel Borca) +* Added BZIP Compress method for zip +* Did some refactoring and code cleanup + + +Credits + + Gilles Vollant - Original MiniZip author + Even Rouault - ZIP64 unzip Support + Daniel Borca - BZip Compression method support in unzip + Mathias Svensson - ZIP64 zip support + Mathias Svensson - BZip Compression method support in zip + + Resources + + ZipLayout http://result42.com/projects/ZipFileLayout + Command line tool for Windows that shows the layout and information of the headers in a zip archive. + Used when debugging and validating the creation of zip files using MiniZip64 + + + ZIP App Note http://www.pkware.com/documents/casestudies/APPNOTE.TXT + Zip File specification + + +Notes. + * To be able to use BZip compression method in zip64.c or unzip64.c the BZIP2 lib is needed and HAVE_BZIP2 need to be defined. + +License +---------------------------------------------------------- + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + +---------------------------------------------------------- + diff --git a/externe_kniznice/zlib/contrib/minizip/configure.ac b/externe_kniznice/zlib/contrib/minizip/configure.ac new file mode 100644 index 0000000..5b11970 --- /dev/null +++ b/externe_kniznice/zlib/contrib/minizip/configure.ac @@ -0,0 +1,32 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_INIT([minizip], [1.2.11], [bugzilla.redhat.com]) +AC_CONFIG_SRCDIR([minizip.c]) +AM_INIT_AUTOMAKE([foreign]) +LT_INIT + +AC_MSG_CHECKING([whether to build example programs]) +AC_ARG_ENABLE([demos], AC_HELP_STRING([--enable-demos], [build example programs])) +AM_CONDITIONAL([COND_DEMOS], [test "$enable_demos" = yes]) +if test "$enable_demos" = yes +then + AC_MSG_RESULT([yes]) +else + AC_MSG_RESULT([no]) +fi + +case "${host}" in + *-mingw* | mingw*) + WIN32="yes" + ;; + *) + ;; +esac +AM_CONDITIONAL([WIN32], [test "${WIN32}" = "yes"]) + + +AC_SUBST([HAVE_UNISTD_H], [0]) +AC_CHECK_HEADER([unistd.h], [HAVE_UNISTD_H=1], []) +AC_CONFIG_FILES([Makefile minizip.pc]) +AC_OUTPUT diff --git a/externe_kniznice/zlib/contrib/minizip/crypt.h b/externe_kniznice/zlib/contrib/minizip/crypt.h new file mode 100644 index 0000000..1e9e820 --- /dev/null +++ b/externe_kniznice/zlib/contrib/minizip/crypt.h @@ -0,0 +1,131 @@ +/* crypt.h -- base code for crypt/uncrypt ZIPfile + + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + This code is a modified version of crypting code in Infozip distribution + + The encryption/decryption parts of this source code (as opposed to the + non-echoing password parts) were originally written in Europe. The + whole source package can be freely distributed, including from the USA. + (Prior to January 2000, re-export from the US was a violation of US law.) + + This encryption code is a direct transcription of the algorithm from + Roger Schlafly, described by Phil Katz in the file appnote.txt. This + file (appnote.txt) is distributed with the PKZIP program (even in the + version without encryption capabilities). + + If you don't need crypting in your application, just define symbols + NOCRYPT and NOUNCRYPT. + + This code support the "Traditional PKWARE Encryption". + + The new AES encryption added on Zip format by Winzip (see the page + http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong + Encryption is not supported. +*/ + +#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) + +/*********************************************************************** + * Return the next byte in the pseudo-random sequence + */ +static int decrypt_byte(unsigned long* pkeys, const z_crc_t* pcrc_32_tab) +{ + unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an + * unpredictable manner on 16-bit systems; not a problem + * with any known compiler so far, though */ + + temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; + return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); +} + +/*********************************************************************** + * Update the encryption keys with the next byte of plain text + */ +static int update_keys(unsigned long* pkeys,const z_crc_t* pcrc_32_tab,int c) +{ + (*(pkeys+0)) = CRC32((*(pkeys+0)), c); + (*(pkeys+1)) += (*(pkeys+0)) & 0xff; + (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; + { + register int keyshift = (int)((*(pkeys+1)) >> 24); + (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); + } + return c; +} + + +/*********************************************************************** + * Initialize the encryption keys and the random header according to + * the given password. + */ +static void init_keys(const char* passwd,unsigned long* pkeys,const z_crc_t* pcrc_32_tab) +{ + *(pkeys+0) = 305419896L; + *(pkeys+1) = 591751049L; + *(pkeys+2) = 878082192L; + while (*passwd != '\0') { + update_keys(pkeys,pcrc_32_tab,(int)*passwd); + passwd++; + } +} + +#define zdecode(pkeys,pcrc_32_tab,c) \ + (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) + +#define zencode(pkeys,pcrc_32_tab,c,t) \ + (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) + +#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED + +#define RAND_HEAD_LEN 12 + /* "last resort" source for second part of crypt seed pattern */ +# ifndef ZCR_SEED2 +# define ZCR_SEED2 3141592654UL /* use PI as default pattern */ +# endif + +static int crypthead(const char* passwd, /* password string */ + unsigned char* buf, /* where to write header */ + int bufSize, + unsigned long* pkeys, + const z_crc_t* pcrc_32_tab, + unsigned long crcForCrypting) +{ + int n; /* index in random header */ + int t; /* temporary */ + int c; /* random byte */ + unsigned char header[RAND_HEAD_LEN-2]; /* random header */ + static unsigned calls = 0; /* ensure different random header each time */ + + if (bufSize> 7) & 0xff; + header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); + } + /* Encrypt random header (last two bytes is high word of crc) */ + init_keys(passwd, pkeys, pcrc_32_tab); + for (n = 0; n < RAND_HEAD_LEN-2; n++) + { + buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); + } + buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); + buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); + return n; +} + +#endif diff --git a/externe_kniznice/zlib/contrib/minizip/ioapi.c b/externe_kniznice/zlib/contrib/minizip/ioapi.c new file mode 100644 index 0000000..7f5c191 --- /dev/null +++ b/externe_kniznice/zlib/contrib/minizip/ioapi.c @@ -0,0 +1,247 @@ +/* ioapi.h -- IO base function header for compress/uncompress .zip + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + +*/ + +#if defined(_WIN32) && (!(defined(_CRT_SECURE_NO_WARNINGS))) + #define _CRT_SECURE_NO_WARNINGS +#endif + +#if defined(__APPLE__) || defined(IOAPI_NO_64) +// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions +#define FOPEN_FUNC(filename, mode) fopen(filename, mode) +#define FTELLO_FUNC(stream) ftello(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) +#else +#define FOPEN_FUNC(filename, mode) fopen64(filename, mode) +#define FTELLO_FUNC(stream) ftello64(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) +#endif + + +#include "ioapi.h" + +voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode) +{ + if (pfilefunc->zfile_func64.zopen64_file != NULL) + return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode); + else + { + return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode); + } +} + +long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin) +{ + if (pfilefunc->zfile_func64.zseek64_file != NULL) + return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin); + else + { + uLong offsetTruncated = (uLong)offset; + if (offsetTruncated != offset) + return -1; + else + return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin); + } +} + +ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream) +{ + if (pfilefunc->zfile_func64.zseek64_file != NULL) + return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream); + else + { + uLong tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream); + if ((tell_uLong) == MAXU32) + return (ZPOS64_T)-1; + else + return tell_uLong; + } +} + +void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32) +{ + p_filefunc64_32->zfile_func64.zopen64_file = NULL; + p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file; + p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; + p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file; + p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file; + p_filefunc64_32->zfile_func64.ztell64_file = NULL; + p_filefunc64_32->zfile_func64.zseek64_file = NULL; + p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file; + p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; + p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque; + p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file; + p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file; +} + + + +static voidpf ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode)); +static uLong ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +static uLong ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size)); +static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream)); +static long ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); +static int ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream)); +static int ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream)); + +static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode) +{ + FILE* file = NULL; + const char* mode_fopen = NULL; + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + mode_fopen = "rb"; + else + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + mode_fopen = "r+b"; + else + if (mode & ZLIB_FILEFUNC_MODE_CREATE) + mode_fopen = "wb"; + + if ((filename!=NULL) && (mode_fopen != NULL)) + file = fopen(filename, mode_fopen); + return file; +} + +static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode) +{ + FILE* file = NULL; + const char* mode_fopen = NULL; + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + mode_fopen = "rb"; + else + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + mode_fopen = "r+b"; + else + if (mode & ZLIB_FILEFUNC_MODE_CREATE) + mode_fopen = "wb"; + + if ((filename!=NULL) && (mode_fopen != NULL)) + file = FOPEN_FUNC((const char*)filename, mode_fopen); + return file; +} + + +static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size) +{ + uLong ret; + ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + +static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size) +{ + uLong ret; + ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + +static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream) +{ + long ret; + ret = ftell((FILE *)stream); + return ret; +} + + +static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream) +{ + ZPOS64_T ret; + ret = FTELLO_FUNC((FILE *)stream); + return ret; +} + +static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offset, int origin) +{ + int fseek_origin=0; + long ret; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + fseek_origin = SEEK_CUR; + break; + case ZLIB_FILEFUNC_SEEK_END : + fseek_origin = SEEK_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + fseek_origin = SEEK_SET; + break; + default: return -1; + } + ret = 0; + if (fseek((FILE *)stream, offset, fseek_origin) != 0) + ret = -1; + return ret; +} + +static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) +{ + int fseek_origin=0; + long ret; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + fseek_origin = SEEK_CUR; + break; + case ZLIB_FILEFUNC_SEEK_END : + fseek_origin = SEEK_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + fseek_origin = SEEK_SET; + break; + default: return -1; + } + ret = 0; + + if(FSEEKO_FUNC((FILE *)stream, offset, fseek_origin) != 0) + ret = -1; + + return ret; +} + + +static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream) +{ + int ret; + ret = fclose((FILE *)stream); + return ret; +} + +static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream) +{ + int ret; + ret = ferror((FILE *)stream); + return ret; +} + +void fill_fopen_filefunc (pzlib_filefunc_def) + zlib_filefunc_def* pzlib_filefunc_def; +{ + pzlib_filefunc_def->zopen_file = fopen_file_func; + pzlib_filefunc_def->zread_file = fread_file_func; + pzlib_filefunc_def->zwrite_file = fwrite_file_func; + pzlib_filefunc_def->ztell_file = ftell_file_func; + pzlib_filefunc_def->zseek_file = fseek_file_func; + pzlib_filefunc_def->zclose_file = fclose_file_func; + pzlib_filefunc_def->zerror_file = ferror_file_func; + pzlib_filefunc_def->opaque = NULL; +} + +void fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = fopen64_file_func; + pzlib_filefunc_def->zread_file = fread_file_func; + pzlib_filefunc_def->zwrite_file = fwrite_file_func; + pzlib_filefunc_def->ztell64_file = ftell64_file_func; + pzlib_filefunc_def->zseek64_file = fseek64_file_func; + pzlib_filefunc_def->zclose_file = fclose_file_func; + pzlib_filefunc_def->zerror_file = ferror_file_func; + pzlib_filefunc_def->opaque = NULL; +} diff --git a/externe_kniznice/zlib/contrib/minizip/ioapi.h b/externe_kniznice/zlib/contrib/minizip/ioapi.h new file mode 100644 index 0000000..8dcbdb0 --- /dev/null +++ b/externe_kniznice/zlib/contrib/minizip/ioapi.h @@ -0,0 +1,208 @@ +/* ioapi.h -- IO base function header for compress/uncompress .zip + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + Changes + + Oct-2009 - Defined ZPOS64_T to fpos_t on windows and u_int64_t on linux. (might need to find a better why for this) + Oct-2009 - Change to fseeko64, ftello64 and fopen64 so large files would work on linux. + More if/def section may be needed to support other platforms + Oct-2009 - Defined fxxxx64 calls to normal fopen/ftell/fseek so they would compile on windows. + (but you should use iowin32.c for windows instead) + +*/ + +#ifndef _ZLIBIOAPI64_H +#define _ZLIBIOAPI64_H + +#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) + + // Linux needs this to support file operation on files larger then 4+GB + // But might need better if/def to select just the platforms that needs them. + + #ifndef __USE_FILE_OFFSET64 + #define __USE_FILE_OFFSET64 + #endif + #ifndef __USE_LARGEFILE64 + #define __USE_LARGEFILE64 + #endif + #ifndef _LARGEFILE64_SOURCE + #define _LARGEFILE64_SOURCE + #endif + #ifndef _FILE_OFFSET_BIT + #define _FILE_OFFSET_BIT 64 + #endif + +#endif + +#include +#include +#include "zlib.h" + +#if defined(USE_FILE32API) +#define fopen64 fopen +#define ftello64 ftell +#define fseeko64 fseek +#else +#ifdef __FreeBSD__ +#define fopen64 fopen +#define ftello64 ftello +#define fseeko64 fseeko +#endif +#ifdef _MSC_VER + #define fopen64 fopen + #if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC))) + #define ftello64 _ftelli64 + #define fseeko64 _fseeki64 + #else // old MSC + #define ftello64 ftell + #define fseeko64 fseek + #endif +#endif +#endif + +/* +#ifndef ZPOS64_T + #ifdef _WIN32 + #define ZPOS64_T fpos_t + #else + #include + #define ZPOS64_T uint64_t + #endif +#endif +*/ + +#ifdef HAVE_MINIZIP64_CONF_H +#include "mz64conf.h" +#endif + +/* a type choosen by DEFINE */ +#ifdef HAVE_64BIT_INT_CUSTOM +typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T; +#else +#ifdef HAS_STDINT_H +#include "stdint.h" +typedef uint64_t ZPOS64_T; +#else + +/* Maximum unsigned 32-bit value used as placeholder for zip64 */ +#define MAXU32 0xffffffff + +#if defined(_MSC_VER) || defined(__BORLANDC__) +typedef unsigned __int64 ZPOS64_T; +#else +typedef unsigned long long int ZPOS64_T; +#endif +#endif +#endif + + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define ZLIB_FILEFUNC_SEEK_CUR (1) +#define ZLIB_FILEFUNC_SEEK_END (2) +#define ZLIB_FILEFUNC_SEEK_SET (0) + +#define ZLIB_FILEFUNC_MODE_READ (1) +#define ZLIB_FILEFUNC_MODE_WRITE (2) +#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) + +#define ZLIB_FILEFUNC_MODE_EXISTING (4) +#define ZLIB_FILEFUNC_MODE_CREATE (8) + + +#ifndef ZCALLBACK + #if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) + #define ZCALLBACK CALLBACK + #else + #define ZCALLBACK + #endif +#endif + + + + +typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); +typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); +typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); +typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); + +typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); +typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); + + +/* here is the "old" 32 bits structure structure */ +typedef struct zlib_filefunc_def_s +{ + open_file_func zopen_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell_file_func ztell_file; + seek_file_func zseek_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; +} zlib_filefunc_def; + +typedef ZPOS64_T (ZCALLBACK *tell64_file_func) OF((voidpf opaque, voidpf stream)); +typedef long (ZCALLBACK *seek64_file_func) OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); +typedef voidpf (ZCALLBACK *open64_file_func) OF((voidpf opaque, const void* filename, int mode)); + +typedef struct zlib_filefunc64_def_s +{ + open64_file_func zopen64_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell64_file_func ztell64_file; + seek64_file_func zseek64_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; +} zlib_filefunc64_def; + +void fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def)); +void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); + +/* now internal definition, only for zip.c and unzip.h */ +typedef struct zlib_filefunc64_32_def_s +{ + zlib_filefunc64_def zfile_func64; + open_file_func zopen32_file; + tell_file_func ztell32_file; + seek_file_func zseek32_file; +} zlib_filefunc64_32_def; + + +#define ZREAD64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zread_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) +#define ZWRITE64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zwrite_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) +//#define ZTELL64(filefunc,filestream) ((*((filefunc).ztell64_file)) ((filefunc).opaque,filestream)) +//#define ZSEEK64(filefunc,filestream,pos,mode) ((*((filefunc).zseek64_file)) ((filefunc).opaque,filestream,pos,mode)) +#define ZCLOSE64(filefunc,filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque,filestream)) +#define ZERROR64(filefunc,filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque,filestream)) + +voidpf call_zopen64 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)); +long call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)); +ZPOS64_T call_ztell64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)); + +void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32); + +#define ZOPEN64(filefunc,filename,mode) (call_zopen64((&(filefunc)),(filename),(mode))) +#define ZTELL64(filefunc,filestream) (call_ztell64((&(filefunc)),(filestream))) +#define ZSEEK64(filefunc,filestream,pos,mode) (call_zseek64((&(filefunc)),(filestream),(pos),(mode))) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/externe_kniznice/zlib/contrib/minizip/iowin32.c b/externe_kniznice/zlib/contrib/minizip/iowin32.c new file mode 100644 index 0000000..274f39e --- /dev/null +++ b/externe_kniznice/zlib/contrib/minizip/iowin32.c @@ -0,0 +1,462 @@ +/* iowin32.c -- IO base function header for compress/uncompress .zip + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + +*/ + +#include + +#include "zlib.h" +#include "ioapi.h" +#include "iowin32.h" + +#ifndef INVALID_HANDLE_VALUE +#define INVALID_HANDLE_VALUE (0xFFFFFFFF) +#endif + +#ifndef INVALID_SET_FILE_POINTER +#define INVALID_SET_FILE_POINTER ((DWORD)-1) +#endif + + +// see Include/shared/winapifamily.h in the Windows Kit +#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API))) +#if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP) +#define IOWIN32_USING_WINRT_API 1 +#endif +#endif + +voidpf ZCALLBACK win32_open_file_func OF((voidpf opaque, const char* filename, int mode)); +uLong ZCALLBACK win32_read_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +uLong ZCALLBACK win32_write_file_func OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); +ZPOS64_T ZCALLBACK win32_tell64_file_func OF((voidpf opaque, voidpf stream)); +long ZCALLBACK win32_seek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); +int ZCALLBACK win32_close_file_func OF((voidpf opaque, voidpf stream)); +int ZCALLBACK win32_error_file_func OF((voidpf opaque, voidpf stream)); + +typedef struct +{ + HANDLE hf; + int error; +} WIN32FILE_IOWIN; + + +static void win32_translate_open_mode(int mode, + DWORD* lpdwDesiredAccess, + DWORD* lpdwCreationDisposition, + DWORD* lpdwShareMode, + DWORD* lpdwFlagsAndAttributes) +{ + *lpdwDesiredAccess = *lpdwShareMode = *lpdwFlagsAndAttributes = *lpdwCreationDisposition = 0; + + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + { + *lpdwDesiredAccess = GENERIC_READ; + *lpdwCreationDisposition = OPEN_EXISTING; + *lpdwShareMode = FILE_SHARE_READ; + } + else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + { + *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ; + *lpdwCreationDisposition = OPEN_EXISTING; + } + else if (mode & ZLIB_FILEFUNC_MODE_CREATE) + { + *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ; + *lpdwCreationDisposition = CREATE_ALWAYS; + } +} + +static voidpf win32_build_iowin(HANDLE hFile) +{ + voidpf ret=NULL; + + if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE)) + { + WIN32FILE_IOWIN w32fiow; + w32fiow.hf = hFile; + w32fiow.error = 0; + ret = malloc(sizeof(WIN32FILE_IOWIN)); + + if (ret==NULL) + CloseHandle(hFile); + else + *((WIN32FILE_IOWIN*)ret) = w32fiow; + } + return ret; +} + +voidpf ZCALLBACK win32_open64_file_func (voidpf opaque,const void* filename,int mode) +{ + const char* mode_fopen = NULL; + DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; + HANDLE hFile = NULL; + + win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); + +#ifdef IOWIN32_USING_WINRT_API +#ifdef UNICODE + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + { + WCHAR filenameW[FILENAME_MAX + 0x200 + 1]; + MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200); + hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); + } +#endif +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); +#endif + + return win32_build_iowin(hFile); +} + + +voidpf ZCALLBACK win32_open64_file_funcA (voidpf opaque,const void* filename,int mode) +{ + const char* mode_fopen = NULL; + DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; + HANDLE hFile = NULL; + + win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); + +#ifdef IOWIN32_USING_WINRT_API + if ((filename!=NULL) && (dwDesiredAccess != 0)) + { + WCHAR filenameW[FILENAME_MAX + 0x200 + 1]; + MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200); + hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); + } +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFileA((LPCSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); +#endif + + return win32_build_iowin(hFile); +} + + +voidpf ZCALLBACK win32_open64_file_funcW (voidpf opaque,const void* filename,int mode) +{ + const char* mode_fopen = NULL; + DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; + HANDLE hFile = NULL; + + win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); + +#ifdef IOWIN32_USING_WINRT_API + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile2((LPCWSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition,NULL); +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFileW((LPCWSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); +#endif + + return win32_build_iowin(hFile); +} + + +voidpf ZCALLBACK win32_open_file_func (voidpf opaque,const char* filename,int mode) +{ + const char* mode_fopen = NULL; + DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; + HANDLE hFile = NULL; + + win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); + +#ifdef IOWIN32_USING_WINRT_API +#ifdef UNICODE + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + { + WCHAR filenameW[FILENAME_MAX + 0x200 + 1]; + MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200); + hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL); + } +#endif +#else + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); +#endif + + return win32_build_iowin(hFile); +} + + +uLong ZCALLBACK win32_read_file_func (voidpf opaque, voidpf stream, void* buf,uLong size) +{ + uLong ret=0; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + + if (hFile != NULL) + { + if (!ReadFile(hFile, buf, size, &ret, NULL)) + { + DWORD dwErr = GetLastError(); + if (dwErr == ERROR_HANDLE_EOF) + dwErr = 0; + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + } + } + + return ret; +} + + +uLong ZCALLBACK win32_write_file_func (voidpf opaque,voidpf stream,const void* buf,uLong size) +{ + uLong ret=0; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + + if (hFile != NULL) + { + if (!WriteFile(hFile, buf, size, &ret, NULL)) + { + DWORD dwErr = GetLastError(); + if (dwErr == ERROR_HANDLE_EOF) + dwErr = 0; + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + } + } + + return ret; +} + +static BOOL MySetFilePointerEx(HANDLE hFile, LARGE_INTEGER pos, LARGE_INTEGER *newPos, DWORD dwMoveMethod) +{ +#ifdef IOWIN32_USING_WINRT_API + return SetFilePointerEx(hFile, pos, newPos, dwMoveMethod); +#else + LONG lHigh = pos.HighPart; + DWORD dwNewPos = SetFilePointer(hFile, pos.LowPart, &lHigh, dwMoveMethod); + BOOL fOk = TRUE; + if (dwNewPos == 0xFFFFFFFF) + if (GetLastError() != NO_ERROR) + fOk = FALSE; + if ((newPos != NULL) && (fOk)) + { + newPos->LowPart = dwNewPos; + newPos->HighPart = lHigh; + } + return fOk; +#endif +} + +long ZCALLBACK win32_tell_file_func (voidpf opaque,voidpf stream) +{ + long ret=-1; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + if (hFile != NULL) + { + LARGE_INTEGER pos; + pos.QuadPart = 0; + + if (!MySetFilePointerEx(hFile, pos, &pos, FILE_CURRENT)) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = -1; + } + else + ret=(long)pos.LowPart; + } + return ret; +} + +ZPOS64_T ZCALLBACK win32_tell64_file_func (voidpf opaque, voidpf stream) +{ + ZPOS64_T ret= (ZPOS64_T)-1; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream)->hf; + + if (hFile) + { + LARGE_INTEGER pos; + pos.QuadPart = 0; + + if (!MySetFilePointerEx(hFile, pos, &pos, FILE_CURRENT)) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = (ZPOS64_T)-1; + } + else + ret=pos.QuadPart; + } + return ret; +} + + +long ZCALLBACK win32_seek_file_func (voidpf opaque,voidpf stream,uLong offset,int origin) +{ + DWORD dwMoveMethod=0xFFFFFFFF; + HANDLE hFile = NULL; + + long ret=-1; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + dwMoveMethod = FILE_CURRENT; + break; + case ZLIB_FILEFUNC_SEEK_END : + dwMoveMethod = FILE_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + dwMoveMethod = FILE_BEGIN; + break; + default: return -1; + } + + if (hFile != NULL) + { + LARGE_INTEGER pos; + pos.QuadPart = offset; + if (!MySetFilePointerEx(hFile, pos, NULL, dwMoveMethod)) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = -1; + } + else + ret=0; + } + return ret; +} + +long ZCALLBACK win32_seek64_file_func (voidpf opaque, voidpf stream,ZPOS64_T offset,int origin) +{ + DWORD dwMoveMethod=0xFFFFFFFF; + HANDLE hFile = NULL; + long ret=-1; + + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream)->hf; + + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + dwMoveMethod = FILE_CURRENT; + break; + case ZLIB_FILEFUNC_SEEK_END : + dwMoveMethod = FILE_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + dwMoveMethod = FILE_BEGIN; + break; + default: return -1; + } + + if (hFile) + { + LARGE_INTEGER pos; + pos.QuadPart = offset; + if (!MySetFilePointerEx(hFile, pos, NULL, dwMoveMethod)) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = -1; + } + else + ret=0; + } + return ret; +} + +int ZCALLBACK win32_close_file_func (voidpf opaque, voidpf stream) +{ + int ret=-1; + + if (stream!=NULL) + { + HANDLE hFile; + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + if (hFile != NULL) + { + CloseHandle(hFile); + ret=0; + } + free(stream); + } + return ret; +} + +int ZCALLBACK win32_error_file_func (voidpf opaque,voidpf stream) +{ + int ret=-1; + if (stream!=NULL) + { + ret = ((WIN32FILE_IOWIN*)stream) -> error; + } + return ret; +} + +void fill_win32_filefunc (zlib_filefunc_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen_file = win32_open_file_func; + pzlib_filefunc_def->zread_file = win32_read_file_func; + pzlib_filefunc_def->zwrite_file = win32_write_file_func; + pzlib_filefunc_def->ztell_file = win32_tell_file_func; + pzlib_filefunc_def->zseek_file = win32_seek_file_func; + pzlib_filefunc_def->zclose_file = win32_close_file_func; + pzlib_filefunc_def->zerror_file = win32_error_file_func; + pzlib_filefunc_def->opaque = NULL; +} + +void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = win32_open64_file_func; + pzlib_filefunc_def->zread_file = win32_read_file_func; + pzlib_filefunc_def->zwrite_file = win32_write_file_func; + pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; + pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; + pzlib_filefunc_def->zclose_file = win32_close_file_func; + pzlib_filefunc_def->zerror_file = win32_error_file_func; + pzlib_filefunc_def->opaque = NULL; +} + + +void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = win32_open64_file_funcA; + pzlib_filefunc_def->zread_file = win32_read_file_func; + pzlib_filefunc_def->zwrite_file = win32_write_file_func; + pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; + pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; + pzlib_filefunc_def->zclose_file = win32_close_file_func; + pzlib_filefunc_def->zerror_file = win32_error_file_func; + pzlib_filefunc_def->opaque = NULL; +} + + +void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = win32_open64_file_funcW; + pzlib_filefunc_def->zread_file = win32_read_file_func; + pzlib_filefunc_def->zwrite_file = win32_write_file_func; + pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; + pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; + pzlib_filefunc_def->zclose_file = win32_close_file_func; + pzlib_filefunc_def->zerror_file = win32_error_file_func; + pzlib_filefunc_def->opaque = NULL; +} diff --git a/externe_kniznice/zlib/contrib/minizip/iowin32.h b/externe_kniznice/zlib/contrib/minizip/iowin32.h new file mode 100644 index 0000000..0ca0969 --- /dev/null +++ b/externe_kniznice/zlib/contrib/minizip/iowin32.h @@ -0,0 +1,28 @@ +/* iowin32.h -- IO base function header for compress/uncompress .zip + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + +*/ + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); +void fill_win32_filefunc64 OF((zlib_filefunc64_def* pzlib_filefunc_def)); +void fill_win32_filefunc64A OF((zlib_filefunc64_def* pzlib_filefunc_def)); +void fill_win32_filefunc64W OF((zlib_filefunc64_def* pzlib_filefunc_def)); + +#ifdef __cplusplus +} +#endif diff --git a/externe_kniznice/zlib/contrib/minizip/make_vms.com b/externe_kniznice/zlib/contrib/minizip/make_vms.com new file mode 100644 index 0000000..9ac13a9 --- /dev/null +++ b/externe_kniznice/zlib/contrib/minizip/make_vms.com @@ -0,0 +1,25 @@ +$ if f$search("ioapi.h_orig") .eqs. "" then copy ioapi.h ioapi.h_orig +$ open/write zdef vmsdefs.h +$ copy sys$input: zdef +$ deck +#define unix +#define fill_zlib_filefunc64_32_def_from_filefunc32 fillzffunc64from +#define Write_Zip64EndOfCentralDirectoryLocator Write_Zip64EoDLocator +#define Write_Zip64EndOfCentralDirectoryRecord Write_Zip64EoDRecord +#define Write_EndOfCentralDirectoryRecord Write_EoDRecord +$ eod +$ close zdef +$ copy vmsdefs.h,ioapi.h_orig ioapi.h +$ cc/include=[--]/prefix=all ioapi.c +$ cc/include=[--]/prefix=all miniunz.c +$ cc/include=[--]/prefix=all unzip.c +$ cc/include=[--]/prefix=all minizip.c +$ cc/include=[--]/prefix=all zip.c +$ link miniunz,unzip,ioapi,[--]libz.olb/lib +$ link minizip,zip,ioapi,[--]libz.olb/lib +$ mcr []minizip test minizip_info.txt +$ mcr []miniunz -l test.zip +$ rename minizip_info.txt; minizip_info.txt_old +$ mcr []miniunz test.zip +$ delete test.zip;* +$exit diff --git a/externe_kniznice/zlib/contrib/minizip/miniunz.c b/externe_kniznice/zlib/contrib/minizip/miniunz.c new file mode 100644 index 0000000..3d65401 --- /dev/null +++ b/externe_kniznice/zlib/contrib/minizip/miniunz.c @@ -0,0 +1,660 @@ +/* + miniunz.c + Version 1.1, February 14h, 2010 + sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) +*/ + +#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) + #ifndef __USE_FILE_OFFSET64 + #define __USE_FILE_OFFSET64 + #endif + #ifndef __USE_LARGEFILE64 + #define __USE_LARGEFILE64 + #endif + #ifndef _LARGEFILE64_SOURCE + #define _LARGEFILE64_SOURCE + #endif + #ifndef _FILE_OFFSET_BIT + #define _FILE_OFFSET_BIT 64 + #endif +#endif + +#ifdef __APPLE__ +// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions +#define FOPEN_FUNC(filename, mode) fopen(filename, mode) +#define FTELLO_FUNC(stream) ftello(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) +#else +#define FOPEN_FUNC(filename, mode) fopen64(filename, mode) +#define FTELLO_FUNC(stream) ftello64(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) +#endif + + +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +# include +# include +#else +# include +# include +#endif + + +#include "unzip.h" + +#define CASESENSITIVITY (0) +#define WRITEBUFFERSIZE (8192) +#define MAXFILENAME (256) + +#ifdef _WIN32 +#define USEWIN32IOAPI +#include "iowin32.h" +#endif +/* + mini unzip, demo of unzip package + + usage : + Usage : miniunz [-exvlo] file.zip [file_to_extract] [-d extractdir] + + list the file in the zipfile, and print the content of FILE_ID.ZIP or README.TXT + if it exists +*/ + + +/* change_file_date : change the date/time of a file + filename : the filename of the file where date/time must be modified + dosdate : the new date at the MSDos format (4 bytes) + tmu_date : the SAME new date at the tm_unz format */ +void change_file_date(filename,dosdate,tmu_date) + const char *filename; + uLong dosdate; + tm_unz tmu_date; +{ +#ifdef _WIN32 + HANDLE hFile; + FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite; + + hFile = CreateFileA(filename,GENERIC_READ | GENERIC_WRITE, + 0,NULL,OPEN_EXISTING,0,NULL); + GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite); + DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal); + LocalFileTimeToFileTime(&ftLocal,&ftm); + SetFileTime(hFile,&ftm,&ftLastAcc,&ftm); + CloseHandle(hFile); +#else +#ifdef unix || __APPLE__ + struct utimbuf ut; + struct tm newdate; + newdate.tm_sec = tmu_date.tm_sec; + newdate.tm_min=tmu_date.tm_min; + newdate.tm_hour=tmu_date.tm_hour; + newdate.tm_mday=tmu_date.tm_mday; + newdate.tm_mon=tmu_date.tm_mon; + if (tmu_date.tm_year > 1900) + newdate.tm_year=tmu_date.tm_year - 1900; + else + newdate.tm_year=tmu_date.tm_year ; + newdate.tm_isdst=-1; + + ut.actime=ut.modtime=mktime(&newdate); + utime(filename,&ut); +#endif +#endif +} + + +/* mymkdir and change_file_date are not 100 % portable + As I don't know well Unix, I wait feedback for the unix portion */ + +int mymkdir(dirname) + const char* dirname; +{ + int ret=0; +#ifdef _WIN32 + ret = _mkdir(dirname); +#elif unix + ret = mkdir (dirname,0775); +#elif __APPLE__ + ret = mkdir (dirname,0775); +#endif + return ret; +} + +int makedir (newdir) + char *newdir; +{ + char *buffer ; + char *p; + int len = (int)strlen(newdir); + + if (len <= 0) + return 0; + + buffer = (char*)malloc(len+1); + if (buffer==NULL) + { + printf("Error allocating memory\n"); + return UNZ_INTERNALERROR; + } + strcpy(buffer,newdir); + + if (buffer[len-1] == '/') { + buffer[len-1] = '\0'; + } + if (mymkdir(buffer) == 0) + { + free(buffer); + return 1; + } + + p = buffer+1; + while (1) + { + char hold; + + while(*p && *p != '\\' && *p != '/') + p++; + hold = *p; + *p = 0; + if ((mymkdir(buffer) == -1) && (errno == ENOENT)) + { + printf("couldn't create directory %s\n",buffer); + free(buffer); + return 0; + } + if (hold == 0) + break; + *p++ = hold; + } + free(buffer); + return 1; +} + +void do_banner() +{ + printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n"); + printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n"); +} + +void do_help() +{ + printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \ + " -e Extract without pathname (junk paths)\n" \ + " -x Extract with pathname\n" \ + " -v list files\n" \ + " -l list files\n" \ + " -d directory to extract into\n" \ + " -o overwrite files without prompting\n" \ + " -p extract crypted file using password\n\n"); +} + +void Display64BitsSize(ZPOS64_T n, int size_char) +{ + /* to avoid compatibility problem , we do here the conversion */ + char number[21]; + int offset=19; + int pos_string = 19; + number[20]=0; + for (;;) { + number[offset]=(char)((n%10)+'0'); + if (number[offset] != '0') + pos_string=offset; + n/=10; + if (offset==0) + break; + offset--; + } + { + int size_display_string = 19-pos_string; + while (size_char > size_display_string) + { + size_char--; + printf(" "); + } + } + + printf("%s",&number[pos_string]); +} + +int do_list(uf) + unzFile uf; +{ + uLong i; + unz_global_info64 gi; + int err; + + err = unzGetGlobalInfo64(uf,&gi); + if (err!=UNZ_OK) + printf("error %d with zipfile in unzGetGlobalInfo \n",err); + printf(" Length Method Size Ratio Date Time CRC-32 Name\n"); + printf(" ------ ------ ---- ----- ---- ---- ------ ----\n"); + for (i=0;i0) + ratio = (uLong)((file_info.compressed_size*100)/file_info.uncompressed_size); + + /* display a '*' if the file is crypted */ + if ((file_info.flag & 1) != 0) + charCrypt='*'; + + if (file_info.compression_method==0) + string_method="Stored"; + else + if (file_info.compression_method==Z_DEFLATED) + { + uInt iLevel=(uInt)((file_info.flag & 0x6)/2); + if (iLevel==0) + string_method="Defl:N"; + else if (iLevel==1) + string_method="Defl:X"; + else if ((iLevel==2) || (iLevel==3)) + string_method="Defl:F"; /* 2:fast , 3 : extra fast*/ + } + else + if (file_info.compression_method==Z_BZIP2ED) + { + string_method="BZip2 "; + } + else + string_method="Unkn. "; + + Display64BitsSize(file_info.uncompressed_size,7); + printf(" %6s%c",string_method,charCrypt); + Display64BitsSize(file_info.compressed_size,7); + printf(" %3lu%% %2.2lu-%2.2lu-%2.2lu %2.2lu:%2.2lu %8.8lx %s\n", + ratio, + (uLong)file_info.tmu_date.tm_mon + 1, + (uLong)file_info.tmu_date.tm_mday, + (uLong)file_info.tmu_date.tm_year % 100, + (uLong)file_info.tmu_date.tm_hour,(uLong)file_info.tmu_date.tm_min, + (uLong)file_info.crc,filename_inzip); + if ((i+1)='a') && (rep<='z')) + rep -= 0x20; + } + while ((rep!='Y') && (rep!='N') && (rep!='A')); + } + + if (rep == 'N') + skip = 1; + + if (rep == 'A') + *popt_overwrite=1; + } + + if ((skip==0) && (err==UNZ_OK)) + { + fout=FOPEN_FUNC(write_filename,"wb"); + /* some zipfile don't contain directory alone before file */ + if ((fout==NULL) && ((*popt_extract_without_path)==0) && + (filename_withoutpath!=(char*)filename_inzip)) + { + char c=*(filename_withoutpath-1); + *(filename_withoutpath-1)='\0'; + makedir(write_filename); + *(filename_withoutpath-1)=c; + fout=FOPEN_FUNC(write_filename,"wb"); + } + + if (fout==NULL) + { + printf("error opening %s\n",write_filename); + } + } + + if (fout!=NULL) + { + printf(" extracting: %s\n",write_filename); + + do + { + err = unzReadCurrentFile(uf,buf,size_buf); + if (err<0) + { + printf("error %d with zipfile in unzReadCurrentFile\n",err); + break; + } + if (err>0) + if (fwrite(buf,err,1,fout)!=1) + { + printf("error in writing extracted file\n"); + err=UNZ_ERRNO; + break; + } + } + while (err>0); + if (fout) + fclose(fout); + + if (err==0) + change_file_date(write_filename,file_info.dosDate, + file_info.tmu_date); + } + + if (err==UNZ_OK) + { + err = unzCloseCurrentFile (uf); + if (err!=UNZ_OK) + { + printf("error %d with zipfile in unzCloseCurrentFile\n",err); + } + } + else + unzCloseCurrentFile(uf); /* don't lose the error */ + } + + free(buf); + return err; +} + + +int do_extract(uf,opt_extract_without_path,opt_overwrite,password) + unzFile uf; + int opt_extract_without_path; + int opt_overwrite; + const char* password; +{ + uLong i; + unz_global_info64 gi; + int err; + FILE* fout=NULL; + + err = unzGetGlobalInfo64(uf,&gi); + if (err!=UNZ_OK) + printf("error %d with zipfile in unzGetGlobalInfo \n",err); + + for (i=0;i insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +miniunzip - uncompress and examine ZIP archives +.SH SYNOPSIS +.B miniunzip +.RI [ -exvlo ] +zipfile [ files_to_extract ] [-d tempdir] +.SH DESCRIPTION +.B minizip +is a simple tool which allows the extraction of compressed file +archives in the ZIP format used by the MS-DOS utility PKZIP. It was +written as a demonstration of the +.IR zlib (3) +library and therefore lack many of the features of the +.IR unzip (1) +program. +.SH OPTIONS +A number of options are supported. With the exception of +.BI \-d\ tempdir +these must be supplied before any +other arguments and are: +.TP +.BI \-l\ ,\ \-\-v +List the files in the archive without extracting them. +.TP +.B \-o +Overwrite files without prompting for confirmation. +.TP +.B \-x +Extract files (default). +.PP +The +.I zipfile +argument is the name of the archive to process. The next argument can be used +to specify a single file to extract from the archive. + +Lastly, the following option can be specified at the end of the command-line: +.TP +.BI \-d\ tempdir +Extract the archive in the directory +.I tempdir +rather than the current directory. +.SH SEE ALSO +.BR minizip (1), +.BR zlib (3), +.BR unzip (1). +.SH AUTHOR +This program was written by Gilles Vollant. This manual page was +written by Mark Brown . The -d tempdir option +was added by Dirk Eddelbuettel . diff --git a/externe_kniznice/zlib/contrib/minizip/minizip.1 b/externe_kniznice/zlib/contrib/minizip/minizip.1 new file mode 100644 index 0000000..1154484 --- /dev/null +++ b/externe_kniznice/zlib/contrib/minizip/minizip.1 @@ -0,0 +1,46 @@ +.\" Hey, EMACS: -*- nroff -*- +.TH minizip 1 "May 2, 2001" +.\" Please adjust this date whenever revising the manpage. +.\" +.\" Some roff macros, for reference: +.\" .nh disable hyphenation +.\" .hy enable hyphenation +.\" .ad l left justify +.\" .ad b justify to both left and right margins +.\" .nf disable filling +.\" .fi enable filling +.\" .br insert line break +.\" .sp insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +minizip - create ZIP archives +.SH SYNOPSIS +.B minizip +.RI [ -o ] +zipfile [ " files" ... ] +.SH DESCRIPTION +.B minizip +is a simple tool which allows the creation of compressed file archives +in the ZIP format used by the MS-DOS utility PKZIP. It was written as +a demonstration of the +.IR zlib (3) +library and therefore lack many of the features of the +.IR zip (1) +program. +.SH OPTIONS +The first argument supplied is the name of the ZIP archive to create or +.RI -o +in which case it is ignored and the second argument treated as the +name of the ZIP file. If the ZIP file already exists it will be +overwritten. +.PP +Subsequent arguments specify a list of files to place in the ZIP +archive. If none are specified then an empty archive will be created. +.SH SEE ALSO +.BR miniunzip (1), +.BR zlib (3), +.BR zip (1). +.SH AUTHOR +This program was written by Gilles Vollant. This manual page was +written by Mark Brown . + diff --git a/externe_kniznice/zlib/contrib/minizip/minizip.c b/externe_kniznice/zlib/contrib/minizip/minizip.c new file mode 100644 index 0000000..4288962 --- /dev/null +++ b/externe_kniznice/zlib/contrib/minizip/minizip.c @@ -0,0 +1,520 @@ +/* + minizip.c + Version 1.1, February 14h, 2010 + sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) +*/ + + +#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__)) + #ifndef __USE_FILE_OFFSET64 + #define __USE_FILE_OFFSET64 + #endif + #ifndef __USE_LARGEFILE64 + #define __USE_LARGEFILE64 + #endif + #ifndef _LARGEFILE64_SOURCE + #define _LARGEFILE64_SOURCE + #endif + #ifndef _FILE_OFFSET_BIT + #define _FILE_OFFSET_BIT 64 + #endif +#endif + +#ifdef __APPLE__ +// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions +#define FOPEN_FUNC(filename, mode) fopen(filename, mode) +#define FTELLO_FUNC(stream) ftello(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin) +#else +#define FOPEN_FUNC(filename, mode) fopen64(filename, mode) +#define FTELLO_FUNC(stream) ftello64(stream) +#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin) +#endif + + + +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +# include +# include +#else +# include +# include +# include +# include +#endif + +#include "zip.h" + +#ifdef _WIN32 + #define USEWIN32IOAPI + #include "iowin32.h" +#endif + + + +#define WRITEBUFFERSIZE (16384) +#define MAXFILENAME (256) + +#ifdef _WIN32 +uLong filetime(f, tmzip, dt) + char *f; /* name of file to get info on */ + tm_zip *tmzip; /* return value: access, modific. and creation times */ + uLong *dt; /* dostime */ +{ + int ret = 0; + { + FILETIME ftLocal; + HANDLE hFind; + WIN32_FIND_DATAA ff32; + + hFind = FindFirstFileA(f,&ff32); + if (hFind != INVALID_HANDLE_VALUE) + { + FileTimeToLocalFileTime(&(ff32.ftLastWriteTime),&ftLocal); + FileTimeToDosDateTime(&ftLocal,((LPWORD)dt)+1,((LPWORD)dt)+0); + FindClose(hFind); + ret = 1; + } + } + return ret; +} +#else +#ifdef unix || __APPLE__ +uLong filetime(f, tmzip, dt) + char *f; /* name of file to get info on */ + tm_zip *tmzip; /* return value: access, modific. and creation times */ + uLong *dt; /* dostime */ +{ + int ret=0; + struct stat s; /* results of stat() */ + struct tm* filedate; + time_t tm_t=0; + + if (strcmp(f,"-")!=0) + { + char name[MAXFILENAME+1]; + int len = strlen(f); + if (len > MAXFILENAME) + len = MAXFILENAME; + + strncpy(name, f,MAXFILENAME-1); + /* strncpy doesnt append the trailing NULL, of the string is too long. */ + name[ MAXFILENAME ] = '\0'; + + if (name[len - 1] == '/') + name[len - 1] = '\0'; + /* not all systems allow stat'ing a file with / appended */ + if (stat(name,&s)==0) + { + tm_t = s.st_mtime; + ret = 1; + } + } + filedate = localtime(&tm_t); + + tmzip->tm_sec = filedate->tm_sec; + tmzip->tm_min = filedate->tm_min; + tmzip->tm_hour = filedate->tm_hour; + tmzip->tm_mday = filedate->tm_mday; + tmzip->tm_mon = filedate->tm_mon ; + tmzip->tm_year = filedate->tm_year; + + return ret; +} +#else +uLong filetime(f, tmzip, dt) + char *f; /* name of file to get info on */ + tm_zip *tmzip; /* return value: access, modific. and creation times */ + uLong *dt; /* dostime */ +{ + return 0; +} +#endif +#endif + + + + +int check_exist_file(filename) + const char* filename; +{ + FILE* ftestexist; + int ret = 1; + ftestexist = FOPEN_FUNC(filename,"rb"); + if (ftestexist==NULL) + ret = 0; + else + fclose(ftestexist); + return ret; +} + +void do_banner() +{ + printf("MiniZip 1.1, demo of zLib + MiniZip64 package, written by Gilles Vollant\n"); + printf("more info on MiniZip at http://www.winimage.com/zLibDll/minizip.html\n\n"); +} + +void do_help() +{ + printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] [-j] file.zip [files_to_add]\n\n" \ + " -o Overwrite existing file.zip\n" \ + " -a Append to existing file.zip\n" \ + " -0 Store only\n" \ + " -1 Compress faster\n" \ + " -9 Compress better\n\n" \ + " -j exclude path. store only the file name.\n\n"); +} + +/* calculate the CRC32 of a file, + because to encrypt a file, we need known the CRC32 of the file before */ +int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc) +{ + unsigned long calculate_crc=0; + int err=ZIP_OK; + FILE * fin = FOPEN_FUNC(filenameinzip,"rb"); + + unsigned long size_read = 0; + unsigned long total_read = 0; + if (fin==NULL) + { + err = ZIP_ERRNO; + } + + if (err == ZIP_OK) + do + { + err = ZIP_OK; + size_read = (int)fread(buf,1,size_buf,fin); + if (size_read < size_buf) + if (feof(fin)==0) + { + printf("error in reading %s\n",filenameinzip); + err = ZIP_ERRNO; + } + + if (size_read>0) + calculate_crc = crc32(calculate_crc,buf,size_read); + total_read += size_read; + + } while ((err == ZIP_OK) && (size_read>0)); + + if (fin) + fclose(fin); + + *result_crc=calculate_crc; + printf("file %s crc %lx\n", filenameinzip, calculate_crc); + return err; +} + +int isLargeFile(const char* filename) +{ + int largeFile = 0; + ZPOS64_T pos = 0; + FILE* pFile = FOPEN_FUNC(filename, "rb"); + + if(pFile != NULL) + { + int n = FSEEKO_FUNC(pFile, 0, SEEK_END); + pos = FTELLO_FUNC(pFile); + + printf("File : %s is %lld bytes\n", filename, pos); + + if(pos >= 0xffffffff) + largeFile = 1; + + fclose(pFile); + } + + return largeFile; +} + +int main(argc,argv) + int argc; + char *argv[]; +{ + int i; + int opt_overwrite=0; + int opt_compress_level=Z_DEFAULT_COMPRESSION; + int opt_exclude_path=0; + int zipfilenamearg = 0; + char filename_try[MAXFILENAME+16]; + int zipok; + int err=0; + int size_buf=0; + void* buf=NULL; + const char* password=NULL; + + + do_banner(); + if (argc==1) + { + do_help(); + return 0; + } + else + { + for (i=1;i='0') && (c<='9')) + opt_compress_level = c-'0'; + if ((c=='j') || (c=='J')) + opt_exclude_path = 1; + + if (((c=='p') || (c=='P')) && (i+1='a') && (rep<='z')) + rep -= 0x20; + } + while ((rep!='Y') && (rep!='N') && (rep!='A')); + if (rep=='N') + zipok = 0; + if (rep=='A') + opt_overwrite = 2; + } + } + + if (zipok==1) + { + zipFile zf; + int errclose; +# ifdef USEWIN32IOAPI + zlib_filefunc64_def ffunc; + fill_win32_filefunc64A(&ffunc); + zf = zipOpen2_64(filename_try,(opt_overwrite==2) ? 2 : 0,NULL,&ffunc); +# else + zf = zipOpen64(filename_try,(opt_overwrite==2) ? 2 : 0); +# endif + + if (zf == NULL) + { + printf("error opening %s\n",filename_try); + err= ZIP_ERRNO; + } + else + printf("creating %s\n",filename_try); + + for (i=zipfilenamearg+1;(i='0') || (argv[i][1]<='9'))) && + (strlen(argv[i]) == 2))) + { + FILE * fin; + int size_read; + const char* filenameinzip = argv[i]; + const char *savefilenameinzip; + zip_fileinfo zi; + unsigned long crcFile=0; + int zip64 = 0; + + zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour = + zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0; + zi.dosDate = 0; + zi.internal_fa = 0; + zi.external_fa = 0; + filetime(filenameinzip,&zi.tmz_date,&zi.dosDate); + +/* + err = zipOpenNewFileInZip(zf,filenameinzip,&zi, + NULL,0,NULL,0,NULL / * comment * /, + (opt_compress_level != 0) ? Z_DEFLATED : 0, + opt_compress_level); +*/ + if ((password != NULL) && (err==ZIP_OK)) + err = getFileCrc(filenameinzip,buf,size_buf,&crcFile); + + zip64 = isLargeFile(filenameinzip); + + /* The path name saved, should not include a leading slash. */ + /*if it did, windows/xp and dynazip couldn't read the zip file. */ + savefilenameinzip = filenameinzip; + while( savefilenameinzip[0] == '\\' || savefilenameinzip[0] == '/' ) + { + savefilenameinzip++; + } + + /*should the zip file contain any path at all?*/ + if( opt_exclude_path ) + { + const char *tmpptr; + const char *lastslash = 0; + for( tmpptr = savefilenameinzip; *tmpptr; tmpptr++) + { + if( *tmpptr == '\\' || *tmpptr == '/') + { + lastslash = tmpptr; + } + } + if( lastslash != NULL ) + { + savefilenameinzip = lastslash+1; // base filename follows last slash. + } + } + + /**/ + err = zipOpenNewFileInZip3_64(zf,savefilenameinzip,&zi, + NULL,0,NULL,0,NULL /* comment*/, + (opt_compress_level != 0) ? Z_DEFLATED : 0, + opt_compress_level,0, + /* -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, */ + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + password,crcFile, zip64); + + if (err != ZIP_OK) + printf("error in opening %s in zipfile\n",filenameinzip); + else + { + fin = FOPEN_FUNC(filenameinzip,"rb"); + if (fin==NULL) + { + err=ZIP_ERRNO; + printf("error in opening %s for reading\n",filenameinzip); + } + } + + if (err == ZIP_OK) + do + { + err = ZIP_OK; + size_read = (int)fread(buf,1,size_buf,fin); + if (size_read < size_buf) + if (feof(fin)==0) + { + printf("error in reading %s\n",filenameinzip); + err = ZIP_ERRNO; + } + + if (size_read>0) + { + err = zipWriteInFileInZip (zf,buf,size_read); + if (err<0) + { + printf("error in writing %s in the zipfile\n", + filenameinzip); + } + + } + } while ((err == ZIP_OK) && (size_read>0)); + + if (fin) + fclose(fin); + + if (err<0) + err=ZIP_ERRNO; + else + { + err = zipCloseFileInZip(zf); + if (err!=ZIP_OK) + printf("error in closing %s in the zipfile\n", + filenameinzip); + } + } + } + errclose = zipClose(zf,NULL); + if (errclose != ZIP_OK) + printf("error in closing %s\n",filename_try); + } + else + { + do_help(); + } + + free(buf); + return 0; +} diff --git a/externe_kniznice/zlib/contrib/minizip/minizip.pc.in b/externe_kniznice/zlib/contrib/minizip/minizip.pc.in new file mode 100644 index 0000000..69b5b7f --- /dev/null +++ b/externe_kniznice/zlib/contrib/minizip/minizip.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@/minizip + +Name: minizip +Description: Minizip zip file manipulation library +Requires: +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lminizip +Libs.private: -lz +Cflags: -I${includedir} diff --git a/externe_kniznice/zlib/contrib/minizip/mztools.c b/externe_kniznice/zlib/contrib/minizip/mztools.c new file mode 100644 index 0000000..96891c2 --- /dev/null +++ b/externe_kniznice/zlib/contrib/minizip/mztools.c @@ -0,0 +1,291 @@ +/* + Additional tools for Minizip + Code: Xavier Roche '2004 + License: Same as ZLIB (www.gzip.org) +*/ + +/* Code */ +#include +#include +#include +#include "zlib.h" +#include "unzip.h" + +#define READ_8(adr) ((unsigned char)*(adr)) +#define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) ) +#define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) ) + +#define WRITE_8(buff, n) do { \ + *((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \ +} while(0) +#define WRITE_16(buff, n) do { \ + WRITE_8((unsigned char*)(buff), n); \ + WRITE_8(((unsigned char*)(buff)) + 1, (n) >> 8); \ +} while(0) +#define WRITE_32(buff, n) do { \ + WRITE_16((unsigned char*)(buff), (n) & 0xffff); \ + WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \ +} while(0) + +extern int ZEXPORT unzRepair(file, fileOut, fileOutTmp, nRecovered, bytesRecovered) +const char* file; +const char* fileOut; +const char* fileOutTmp; +uLong* nRecovered; +uLong* bytesRecovered; +{ + int err = Z_OK; + FILE* fpZip = fopen(file, "rb"); + FILE* fpOut = fopen(fileOut, "wb"); + FILE* fpOutCD = fopen(fileOutTmp, "wb"); + if (fpZip != NULL && fpOut != NULL) { + int entries = 0; + uLong totalBytes = 0; + char header[30]; + char filename[1024]; + char extra[1024]; + int offset = 0; + int offsetCD = 0; + while ( fread(header, 1, 30, fpZip) == 30 ) { + int currentOffset = offset; + + /* File entry */ + if (READ_32(header) == 0x04034b50) { + unsigned int version = READ_16(header + 4); + unsigned int gpflag = READ_16(header + 6); + unsigned int method = READ_16(header + 8); + unsigned int filetime = READ_16(header + 10); + unsigned int filedate = READ_16(header + 12); + unsigned int crc = READ_32(header + 14); /* crc */ + unsigned int cpsize = READ_32(header + 18); /* compressed size */ + unsigned int uncpsize = READ_32(header + 22); /* uncompressed sz */ + unsigned int fnsize = READ_16(header + 26); /* file name length */ + unsigned int extsize = READ_16(header + 28); /* extra field length */ + filename[0] = extra[0] = '\0'; + + /* Header */ + if (fwrite(header, 1, 30, fpOut) == 30) { + offset += 30; + } else { + err = Z_ERRNO; + break; + } + + /* Filename */ + if (fnsize > 0) { + if (fnsize < sizeof(filename)) { + if (fread(filename, 1, fnsize, fpZip) == fnsize) { + if (fwrite(filename, 1, fnsize, fpOut) == fnsize) { + offset += fnsize; + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_STREAM_ERROR; + break; + } + + /* Extra field */ + if (extsize > 0) { + if (extsize < sizeof(extra)) { + if (fread(extra, 1, extsize, fpZip) == extsize) { + if (fwrite(extra, 1, extsize, fpOut) == extsize) { + offset += extsize; + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_ERRNO; + break; + } + } + + /* Data */ + { + int dataSize = cpsize; + if (dataSize == 0) { + dataSize = uncpsize; + } + if (dataSize > 0) { + char* data = malloc(dataSize); + if (data != NULL) { + if ((int)fread(data, 1, dataSize, fpZip) == dataSize) { + if ((int)fwrite(data, 1, dataSize, fpOut) == dataSize) { + offset += dataSize; + totalBytes += dataSize; + } else { + err = Z_ERRNO; + } + } else { + err = Z_ERRNO; + } + free(data); + if (err != Z_OK) { + break; + } + } else { + err = Z_MEM_ERROR; + break; + } + } + } + + /* Central directory entry */ + { + char header[46]; + char* comment = ""; + int comsize = (int) strlen(comment); + WRITE_32(header, 0x02014b50); + WRITE_16(header + 4, version); + WRITE_16(header + 6, version); + WRITE_16(header + 8, gpflag); + WRITE_16(header + 10, method); + WRITE_16(header + 12, filetime); + WRITE_16(header + 14, filedate); + WRITE_32(header + 16, crc); + WRITE_32(header + 20, cpsize); + WRITE_32(header + 24, uncpsize); + WRITE_16(header + 28, fnsize); + WRITE_16(header + 30, extsize); + WRITE_16(header + 32, comsize); + WRITE_16(header + 34, 0); /* disk # */ + WRITE_16(header + 36, 0); /* int attrb */ + WRITE_32(header + 38, 0); /* ext attrb */ + WRITE_32(header + 42, currentOffset); + /* Header */ + if (fwrite(header, 1, 46, fpOutCD) == 46) { + offsetCD += 46; + + /* Filename */ + if (fnsize > 0) { + if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) { + offsetCD += fnsize; + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_STREAM_ERROR; + break; + } + + /* Extra field */ + if (extsize > 0) { + if (fwrite(extra, 1, extsize, fpOutCD) == extsize) { + offsetCD += extsize; + } else { + err = Z_ERRNO; + break; + } + } + + /* Comment field */ + if (comsize > 0) { + if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) { + offsetCD += comsize; + } else { + err = Z_ERRNO; + break; + } + } + + + } else { + err = Z_ERRNO; + break; + } + } + + /* Success */ + entries++; + + } else { + break; + } + } + + /* Final central directory */ + { + int entriesZip = entries; + char header[22]; + char* comment = ""; // "ZIP File recovered by zlib/minizip/mztools"; + int comsize = (int) strlen(comment); + if (entriesZip > 0xffff) { + entriesZip = 0xffff; + } + WRITE_32(header, 0x06054b50); + WRITE_16(header + 4, 0); /* disk # */ + WRITE_16(header + 6, 0); /* disk # */ + WRITE_16(header + 8, entriesZip); /* hack */ + WRITE_16(header + 10, entriesZip); /* hack */ + WRITE_32(header + 12, offsetCD); /* size of CD */ + WRITE_32(header + 16, offset); /* offset to CD */ + WRITE_16(header + 20, comsize); /* comment */ + + /* Header */ + if (fwrite(header, 1, 22, fpOutCD) == 22) { + + /* Comment field */ + if (comsize > 0) { + if ((int)fwrite(comment, 1, comsize, fpOutCD) != comsize) { + err = Z_ERRNO; + } + } + + } else { + err = Z_ERRNO; + } + } + + /* Final merge (file + central directory) */ + fclose(fpOutCD); + if (err == Z_OK) { + fpOutCD = fopen(fileOutTmp, "rb"); + if (fpOutCD != NULL) { + int nRead; + char buffer[8192]; + while ( (nRead = (int)fread(buffer, 1, sizeof(buffer), fpOutCD)) > 0) { + if ((int)fwrite(buffer, 1, nRead, fpOut) != nRead) { + err = Z_ERRNO; + break; + } + } + fclose(fpOutCD); + } + } + + /* Close */ + fclose(fpZip); + fclose(fpOut); + + /* Wipe temporary file */ + (void)remove(fileOutTmp); + + /* Number of recovered entries */ + if (err == Z_OK) { + if (nRecovered != NULL) { + *nRecovered = entries; + } + if (bytesRecovered != NULL) { + *bytesRecovered = totalBytes; + } + } + } else { + err = Z_STREAM_ERROR; + } + return err; +} diff --git a/externe_kniznice/zlib/contrib/minizip/mztools.h b/externe_kniznice/zlib/contrib/minizip/mztools.h new file mode 100644 index 0000000..a49a426 --- /dev/null +++ b/externe_kniznice/zlib/contrib/minizip/mztools.h @@ -0,0 +1,37 @@ +/* + Additional tools for Minizip + Code: Xavier Roche '2004 + License: Same as ZLIB (www.gzip.org) +*/ + +#ifndef _zip_tools_H +#define _zip_tools_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#include "unzip.h" + +/* Repair a ZIP file (missing central directory) + file: file to recover + fileOut: output file after recovery + fileOutTmp: temporary file name used for recovery +*/ +extern int ZEXPORT unzRepair(const char* file, + const char* fileOut, + const char* fileOutTmp, + uLong* nRecovered, + uLong* bytesRecovered); + + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/externe_kniznice/zlib/contrib/minizip/unzip.c b/externe_kniznice/zlib/contrib/minizip/unzip.c new file mode 100644 index 0000000..bcfb941 --- /dev/null +++ b/externe_kniznice/zlib/contrib/minizip/unzip.c @@ -0,0 +1,2125 @@ +/* unzip.c -- IO for uncompress .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + + ------------------------------------------------------------------------------------ + Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of + compatibility with older software. The following is from the original crypt.c. + Code woven in by Terry Thorsen 1/2003. + + Copyright (c) 1990-2000 Info-ZIP. All rights reserved. + + See the accompanying file LICENSE, version 2000-Apr-09 or later + (the contents of which are also included in zip.h) for terms of use. + If, for some reason, all these files are missing, the Info-ZIP license + also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html + + crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] + + The encryption/decryption parts of this source code (as opposed to the + non-echoing password parts) were originally written in Europe. The + whole source package can be freely distributed, including from the USA. + (Prior to January 2000, re-export from the US was a violation of US law.) + + This encryption code is a direct transcription of the algorithm from + Roger Schlafly, described by Phil Katz in the file appnote.txt. This + file (appnote.txt) is distributed with the PKZIP program (even in the + version without encryption capabilities). + + ------------------------------------------------------------------------------------ + + Changes in unzip.c + + 2007-2008 - Even Rouault - Addition of cpl_unzGetCurrentFileZStreamPos + 2007-2008 - Even Rouault - Decoration of symbol names unz* -> cpl_unz* + 2007-2008 - Even Rouault - Remove old C style function prototypes + 2007-2008 - Even Rouault - Add unzip support for ZIP64 + + Copyright (C) 2007-2008 Even Rouault + + + Oct-2009 - Mathias Svensson - Removed cpl_* from symbol names (Even Rouault added them but since this is now moved to a new project (minizip64) I renamed them again). + Oct-2009 - Mathias Svensson - Fixed problem if uncompressed size was > 4G and compressed size was <4G + should only read the compressed/uncompressed size from the Zip64 format if + the size from normal header was 0xFFFFFFFF + Oct-2009 - Mathias Svensson - Applied some bug fixes from paches recived from Gilles Vollant + Oct-2009 - Mathias Svensson - Applied support to unzip files with compression mathod BZIP2 (bzip2 lib is required) + Patch created by Daniel Borca + + Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer + + Copyright (C) 1998 - 2010 Gilles Vollant, Even Rouault, Mathias Svensson + +*/ + + +#include +#include +#include + +#ifndef NOUNCRYPT + #define NOUNCRYPT +#endif + +#include "zlib.h" +#include "unzip.h" + +#ifdef STDC +# include +# include +# include +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include +#endif + + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + + +#ifndef CASESENSITIVITYDEFAULT_NO +# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) +# define CASESENSITIVITYDEFAULT_NO +# endif +#endif + + +#ifndef UNZ_BUFSIZE +#define UNZ_BUFSIZE (16384) +#endif + +#ifndef UNZ_MAXFILENAMEINZIP +#define UNZ_MAXFILENAMEINZIP (256) +#endif + +#ifndef ALLOC +# define ALLOC(size) (malloc(size)) +#endif +#ifndef TRYFREE +# define TRYFREE(p) {if (p) free(p);} +#endif + +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) + + +const char unz_copyright[] = + " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; + +/* unz_file_info_interntal contain internal info about a file in zipfile*/ +typedef struct unz_file_info64_internal_s +{ + ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */ +} unz_file_info64_internal; + + +/* file_in_zip_read_info_s contain internal information about a file in zipfile, + when reading and decompress it */ +typedef struct +{ + char *read_buffer; /* internal buffer for compressed data */ + z_stream stream; /* zLib stream structure for inflate */ + +#ifdef HAVE_BZIP2 + bz_stream bstream; /* bzLib stream structure for bziped */ +#endif + + ZPOS64_T pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ + uLong stream_initialised; /* flag set if stream structure is initialised*/ + + ZPOS64_T offset_local_extrafield;/* offset of the local extra field */ + uInt size_local_extrafield;/* size of the local extra field */ + ZPOS64_T pos_local_extrafield; /* position in the local extra field in read*/ + ZPOS64_T total_out_64; + + uLong crc32; /* crc32 of all data uncompressed */ + uLong crc32_wait; /* crc32 we must obtain after decompress all */ + ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */ + ZPOS64_T rest_read_uncompressed;/*number of byte to be obtained after decomp*/ + zlib_filefunc64_32_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + uLong compression_method; /* compression method (0==store) */ + ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + int raw; +} file_in_zip64_read_info_s; + + +/* unz64_s contain internal information about the zipfile +*/ +typedef struct +{ + zlib_filefunc64_32_def z_filefunc; + int is64bitOpenFunction; + voidpf filestream; /* io structore of the zipfile */ + unz_global_info64 gi; /* public global information */ + ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + ZPOS64_T num_file; /* number of the current file in the zipfile*/ + ZPOS64_T pos_in_central_dir; /* pos of the current file in the central dir*/ + ZPOS64_T current_file_ok; /* flag about the usability of the current file*/ + ZPOS64_T central_pos; /* position of the beginning of the central dir*/ + + ZPOS64_T size_central_dir; /* size of the central directory */ + ZPOS64_T offset_central_dir; /* offset of start of central directory with + respect to the starting disk number */ + + unz_file_info64 cur_file_info; /* public info about the current file in zip*/ + unz_file_info64_internal cur_file_info_internal; /* private info about it*/ + file_in_zip64_read_info_s* pfile_in_zip_read; /* structure about the current + file if we are decompressing it */ + int encrypted; + + int isZip64; + +# ifndef NOUNCRYPT + unsigned long keys[3]; /* keys defining the pseudo-random sequence */ + const z_crc_t* pcrc_32_tab; +# endif +} unz64_s; + + +#ifndef NOUNCRYPT +#include "crypt.h" +#endif + +/* =========================================================================== + Read a byte from a gz_stream; update next_in and avail_in. Return EOF + for end of file. + IN assertion: the stream s has been successfully opened for reading. +*/ + + +local int unz64local_getByte OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + int *pi)); + +local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi) +{ + unsigned char c; + int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); + if (err==1) + { + *pi = (int)c; + return UNZ_OK; + } + else + { + if (ZERROR64(*pzlib_filefunc_def,filestream)) + return UNZ_ERRNO; + else + return UNZ_EOF; + } +} + + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets +*/ +local int unz64local_getShort OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unz64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX) +{ + uLong x ; + int i = 0; + int err; + + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((uLong)i)<<8; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int unz64local_getLong OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unz64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX) +{ + uLong x ; + int i = 0; + int err; + + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((uLong)i)<<8; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((uLong)i)<<16; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<24; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int unz64local_getLong64 OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + ZPOS64_T *pX)); + + +local int unz64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + ZPOS64_T *pX) +{ + ZPOS64_T x ; + int i = 0; + int err; + + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (ZPOS64_T)i; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<8; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<16; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<24; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<32; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<40; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<48; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<56; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +/* My own strcmpi / strcasecmp */ +local int strcmpcasenosensitive_internal (const char* fileName1, const char* fileName2) +{ + for (;;) + { + char c1=*(fileName1++); + char c2=*(fileName2++); + if ((c1>='a') && (c1<='z')) + c1 -= 0x20; + if ((c2>='a') && (c2<='z')) + c2 -= 0x20; + if (c1=='\0') + return ((c2=='\0') ? 0 : -1); + if (c2=='\0') + return 1; + if (c1c2) + return 1; + } +} + + +#ifdef CASESENSITIVITYDEFAULT_NO +#define CASESENSITIVITYDEFAULTVALUE 2 +#else +#define CASESENSITIVITYDEFAULTVALUE 1 +#endif + +#ifndef STRCMPCASENOSENTIVEFUNCTION +#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal +#endif + +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) + +*/ +extern int ZEXPORT unzStringFileNameCompare (const char* fileName1, + const char* fileName2, + int iCaseSensitivity) + +{ + if (iCaseSensitivity==0) + iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; + + if (iCaseSensitivity==1) + return strcmp(fileName1,fileName2); + + return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); +} + +#ifndef BUFREADCOMMENT +#define BUFREADCOMMENT (0x400) +#endif + +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); +local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} + + +/* + Locate the Central directory 64 of a zipfile (at the end, just before + the global comment) +*/ +local ZPOS64_T unz64local_SearchCentralDir64 OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream)); + +local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + uLong uL; + ZPOS64_T relativeOffset; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + if (uPosFound == 0) + return 0; + + /* Zip64 end of central directory locator */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature, already checked */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + + /* number of the disk with the start of the zip64 end of central directory */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + if (uL != 0) + return 0; + + /* relative offset of the zip64 end of central directory record */ + if (unz64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=UNZ_OK) + return 0; + + /* total number of disks */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + if (uL != 1) + return 0; + + /* Goto end of central directory record */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + + if (uL != 0x06064b50) + return 0; + + return relativeOffset; +} + +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer + "zlib/zlib114.zip". + If the zipfile cannot be opened (file doesn't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ +local unzFile unzOpenInternal (const void *path, + zlib_filefunc64_32_def* pzlib_filefunc64_32_def, + int is64bitOpenFunction) +{ + unz64_s us; + unz64_s *s; + ZPOS64_T central_pos; + uLong uL; + + uLong number_disk; /* number of the current dist, used for + spaning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the the disk with central dir, used + for spaning ZIP, unsupported, always 0*/ + ZPOS64_T number_entry_CD; /* total number of entries in + the central dir + (same than number_entry on nospan) */ + + int err=UNZ_OK; + + if (unz_copyright[0]!=' ') + return NULL; + + us.z_filefunc.zseek32_file = NULL; + us.z_filefunc.ztell32_file = NULL; + if (pzlib_filefunc64_32_def==NULL) + fill_fopen64_filefunc(&us.z_filefunc.zfile_func64); + else + us.z_filefunc = *pzlib_filefunc64_32_def; + us.is64bitOpenFunction = is64bitOpenFunction; + + + + us.filestream = ZOPEN64(us.z_filefunc, + path, + ZLIB_FILEFUNC_MODE_READ | + ZLIB_FILEFUNC_MODE_EXISTING); + if (us.filestream==NULL) + return NULL; + + central_pos = unz64local_SearchCentralDir64(&us.z_filefunc,us.filestream); + if (central_pos) + { + uLong uS; + ZPOS64_T uL64; + + us.isZip64 = 1; + + if (ZSEEK64(us.z_filefunc, us.filestream, + central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + /* the signature, already checked */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + + /* size of zip64 end of central directory record */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&uL64)!=UNZ_OK) + err=UNZ_ERRNO; + + /* version made by */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK) + err=UNZ_ERRNO; + + /* version needed to extract */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of this disk */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of the disk with the start of the central directory */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central directory on this disk */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central directory */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + if ((number_entry_CD!=us.gi.number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=UNZ_BADZIPFILE; + + /* size of the central directory */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + /* offset of start of central directory with respect to the + starting disk number */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + us.gi.size_comment = 0; + } + else + { + central_pos = unz64local_SearchCentralDir(&us.z_filefunc,us.filestream); + if (central_pos==0) + err=UNZ_ERRNO; + + us.isZip64 = 0; + + if (ZSEEK64(us.z_filefunc, us.filestream, + central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + /* the signature, already checked */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of this disk */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of the disk with the start of the central directory */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central dir on this disk */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + us.gi.number_entry = uL; + + /* total number of entries in the central dir */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + number_entry_CD = uL; + + if ((number_entry_CD!=us.gi.number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=UNZ_BADZIPFILE; + + /* size of the central directory */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + us.size_central_dir = uL; + + /* offset of start of central directory with respect to the + starting disk number */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + us.offset_central_dir = uL; + + /* zipfile comment length */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) + err=UNZ_ERRNO; + } + + if ((central_pospfile_in_zip_read!=NULL) + unzCloseCurrentFile(file); + + ZCLOSE64(s->z_filefunc, s->filestream); + TRYFREE(s); + return UNZ_OK; +} + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ +extern int ZEXPORT unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_info) +{ + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + *pglobal_info=s->gi; + return UNZ_OK; +} + +extern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info32) +{ + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + /* to do : check if number_entry is not truncated */ + pglobal_info32->number_entry = (uLong)s->gi.number_entry; + pglobal_info32->size_comment = s->gi.size_comment; + return UNZ_OK; +} +/* + Translate date/time from Dos format to tm_unz (readable more easilty) +*/ +local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm) +{ + ZPOS64_T uDate; + uDate = (ZPOS64_T)(ulDosDate>>16); + ptm->tm_mday = (uInt)(uDate&0x1f) ; + ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; + ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; + + ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); + ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; + ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; +} + +/* + Get Info about the current file in the zipfile, with internal only info +*/ +local int unz64local_GetCurrentFileInfoInternal OF((unzFile file, + unz_file_info64 *pfile_info, + unz_file_info64_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + +local int unz64local_GetCurrentFileInfoInternal (unzFile file, + unz_file_info64 *pfile_info, + unz_file_info64_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize) +{ + unz64_s* s; + unz_file_info64 file_info; + unz_file_info64_internal file_info_internal; + int err=UNZ_OK; + uLong uMagic; + long lSeek=0; + uLong uL; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (ZSEEK64(s->z_filefunc, s->filestream, + s->pos_in_central_dir+s->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + + /* we check the magic */ + if (err==UNZ_OK) + { + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x02014b50) + err=UNZ_BADZIPFILE; + } + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) + err=UNZ_ERRNO; + + unz64local_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + file_info.compressed_size = uL; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + file_info.uncompressed_size = uL; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) + err=UNZ_ERRNO; + + // relative offset of local header + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + file_info_internal.offset_curfile = uL; + + lSeek+=file_info.size_filename; + if ((err==UNZ_OK) && (szFileName!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_filename0) && (fileNameBufferSize>0)) + if (ZREAD64(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek -= uSizeRead; + } + + // Read extrafield + if ((err==UNZ_OK) && (extraField!=NULL)) + { + ZPOS64_T uSizeRead ; + if (file_info.size_file_extraz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) + if (ZREAD64(s->z_filefunc, s->filestream,extraField,(uLong)uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + + lSeek += file_info.size_file_extra - (uLong)uSizeRead; + } + else + lSeek += file_info.size_file_extra; + + + if ((err==UNZ_OK) && (file_info.size_file_extra != 0)) + { + uLong acc = 0; + + // since lSeek now points to after the extra field we need to move back + lSeek -= file_info.size_file_extra; + + if (lSeek!=0) + { + if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + while(acc < file_info.size_file_extra) + { + uLong headerId; + uLong dataSize; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&headerId) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&dataSize) != UNZ_OK) + err=UNZ_ERRNO; + + /* ZIP64 extra fields */ + if (headerId == 0x0001) + { + uLong uL; + + if(file_info.uncompressed_size == MAXU32) + { + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info.compressed_size == MAXU32) + { + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info_internal.offset_curfile == MAXU32) + { + /* Relative Header offset */ + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info.disk_num_start == MAXU32) + { + /* Disk Start Number */ + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + } + + } + else + { + if (ZSEEK64(s->z_filefunc, s->filestream,dataSize,ZLIB_FILEFUNC_SEEK_CUR)!=0) + err=UNZ_ERRNO; + } + + acc += 2 + 2 + dataSize; + } + } + + if ((err==UNZ_OK) && (szComment!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_file_commentz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + if ((file_info.size_file_comment>0) && (commentBufferSize>0)) + if (ZREAD64(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek+=file_info.size_file_comment - uSizeRead; + } + else + lSeek+=file_info.size_file_comment; + + + if ((err==UNZ_OK) && (pfile_info!=NULL)) + *pfile_info=file_info; + + if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) + *pfile_info_internal=file_info_internal; + + return err; +} + + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. +*/ +extern int ZEXPORT unzGetCurrentFileInfo64 (unzFile file, + unz_file_info64 * pfile_info, + char * szFileName, uLong fileNameBufferSize, + void *extraField, uLong extraFieldBufferSize, + char* szComment, uLong commentBufferSize) +{ + return unz64local_GetCurrentFileInfoInternal(file,pfile_info,NULL, + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); +} + +extern int ZEXPORT unzGetCurrentFileInfo (unzFile file, + unz_file_info * pfile_info, + char * szFileName, uLong fileNameBufferSize, + void *extraField, uLong extraFieldBufferSize, + char* szComment, uLong commentBufferSize) +{ + int err; + unz_file_info64 file_info64; + err = unz64local_GetCurrentFileInfoInternal(file,&file_info64,NULL, + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); + if ((err==UNZ_OK) && (pfile_info != NULL)) + { + pfile_info->version = file_info64.version; + pfile_info->version_needed = file_info64.version_needed; + pfile_info->flag = file_info64.flag; + pfile_info->compression_method = file_info64.compression_method; + pfile_info->dosDate = file_info64.dosDate; + pfile_info->crc = file_info64.crc; + + pfile_info->size_filename = file_info64.size_filename; + pfile_info->size_file_extra = file_info64.size_file_extra; + pfile_info->size_file_comment = file_info64.size_file_comment; + + pfile_info->disk_num_start = file_info64.disk_num_start; + pfile_info->internal_fa = file_info64.internal_fa; + pfile_info->external_fa = file_info64.external_fa; + + pfile_info->tmu_date = file_info64.tmu_date, + + + pfile_info->compressed_size = (uLong)file_info64.compressed_size; + pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size; + + } + return err; +} +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ +extern int ZEXPORT unzGoToFirstFile (unzFile file) +{ + int err=UNZ_OK; + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + s->pos_in_central_dir=s->offset_central_dir; + s->num_file=0; + err=unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ +extern int ZEXPORT unzGoToNextFile (unzFile file) +{ + unz64_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ + if (s->num_file+1==s->gi.number_entry) + return UNZ_END_OF_LIST_OF_FILE; + + s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; + s->num_file++; + err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + + +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ +extern int ZEXPORT unzLocateFile (unzFile file, const char *szFileName, int iCaseSensitivity) +{ + unz64_s* s; + int err; + + /* We remember the 'current' position in the file so that we can jump + * back there if we fail. + */ + unz_file_info64 cur_file_infoSaved; + unz_file_info64_internal cur_file_info_internalSaved; + ZPOS64_T num_fileSaved; + ZPOS64_T pos_in_central_dirSaved; + + + if (file==NULL) + return UNZ_PARAMERROR; + + if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) + return UNZ_PARAMERROR; + + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + /* Save the current state */ + num_fileSaved = s->num_file; + pos_in_central_dirSaved = s->pos_in_central_dir; + cur_file_infoSaved = s->cur_file_info; + cur_file_info_internalSaved = s->cur_file_info_internal; + + err = unzGoToFirstFile(file); + + while (err == UNZ_OK) + { + char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; + err = unzGetCurrentFileInfo64(file,NULL, + szCurrentFileName,sizeof(szCurrentFileName)-1, + NULL,0,NULL,0); + if (err == UNZ_OK) + { + if (unzStringFileNameCompare(szCurrentFileName, + szFileName,iCaseSensitivity)==0) + return UNZ_OK; + err = unzGoToNextFile(file); + } + } + + /* We failed, so restore the state of the 'current file' to where we + * were. + */ + s->num_file = num_fileSaved ; + s->pos_in_central_dir = pos_in_central_dirSaved ; + s->cur_file_info = cur_file_infoSaved; + s->cur_file_info_internal = cur_file_info_internalSaved; + return err; +} + + +/* +/////////////////////////////////////////// +// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) +// I need random access +// +// Further optimization could be realized by adding an ability +// to cache the directory in memory. The goal being a single +// comprehensive file read to put the file I need in a memory. +*/ + +/* +typedef struct unz_file_pos_s +{ + ZPOS64_T pos_in_zip_directory; // offset in file + ZPOS64_T num_of_file; // # of file +} unz_file_pos; +*/ + +extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos) +{ + unz64_s* s; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + file_pos->pos_in_zip_directory = s->pos_in_central_dir; + file_pos->num_of_file = s->num_file; + + return UNZ_OK; +} + +extern int ZEXPORT unzGetFilePos( + unzFile file, + unz_file_pos* file_pos) +{ + unz64_file_pos file_pos64; + int err = unzGetFilePos64(file,&file_pos64); + if (err==UNZ_OK) + { + file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory; + file_pos->num_of_file = (uLong)file_pos64.num_of_file; + } + return err; +} + +extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos) +{ + unz64_s* s; + int err; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + + /* jump to the right spot */ + s->pos_in_central_dir = file_pos->pos_in_zip_directory; + s->num_file = file_pos->num_of_file; + + /* set the current file */ + err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + /* return results */ + s->current_file_ok = (err == UNZ_OK); + return err; +} + +extern int ZEXPORT unzGoToFilePos( + unzFile file, + unz_file_pos* file_pos) +{ + unz64_file_pos file_pos64; + if (file_pos == NULL) + return UNZ_PARAMERROR; + + file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory; + file_pos64.num_of_file = file_pos->num_of_file; + return unzGoToFilePos64(file,&file_pos64); +} + +/* +// Unzip Helper Functions - should be here? +/////////////////////////////////////////// +*/ + +/* + Read the local header of the current zipfile + Check the coherency of the local header and info in the end of central + directory about this file + store in *piSizeVar the size of extra info in local header + (filename and size of extra field data) +*/ +local int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVar, + ZPOS64_T * poffset_local_extrafield, + uInt * psize_local_extrafield) +{ + uLong uMagic,uData,uFlags; + uLong size_filename; + uLong size_extra_field; + int err=UNZ_OK; + + *piSizeVar = 0; + *poffset_local_extrafield = 0; + *psize_local_extrafield = 0; + + if (ZSEEK64(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + + s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + + if (err==UNZ_OK) + { + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x04034b50) + err=UNZ_BADZIPFILE; + } + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; +/* + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) + err=UNZ_BADZIPFILE; +*/ + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) + err=UNZ_BADZIPFILE; + + if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && +/* #ifdef HAVE_BZIP2 */ + (s->cur_file_info.compression_method!=Z_BZIP2ED) && +/* #endif */ + (s->cur_file_info.compression_method!=Z_DEFLATED)) + err=UNZ_BADZIPFILE; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ + err=UNZ_ERRNO; + else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ + err=UNZ_ERRNO; + else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) + err=UNZ_BADZIPFILE; + + *piSizeVar += (uInt)size_filename; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) + err=UNZ_ERRNO; + *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + + SIZEZIPLOCALHEADER + size_filename; + *psize_local_extrafield = (uInt)size_extra_field; + + *piSizeVar += (uInt)size_extra_field; + + return err; +} + +/* + Open for reading data the current file in the zipfile. + If there is no error and the file is opened, the return value is UNZ_OK. +*/ +extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, + int* level, int raw, const char* password) +{ + int err=UNZ_OK; + uInt iSizeVar; + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + ZPOS64_T offset_local_extrafield; /* offset of the local extra field */ + uInt size_local_extrafield; /* size of the local extra field */ +# ifndef NOUNCRYPT + char source[12]; +# else + if (password != NULL) + return UNZ_PARAMERROR; +# endif + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_PARAMERROR; + + if (s->pfile_in_zip_read != NULL) + unzCloseCurrentFile(file); + + if (unz64local_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) + return UNZ_BADZIPFILE; + + pfile_in_zip_read_info = (file_in_zip64_read_info_s*)ALLOC(sizeof(file_in_zip64_read_info_s)); + if (pfile_in_zip_read_info==NULL) + return UNZ_INTERNALERROR; + + pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); + pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; + pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; + pfile_in_zip_read_info->pos_local_extrafield=0; + pfile_in_zip_read_info->raw=raw; + + if (pfile_in_zip_read_info->read_buffer==NULL) + { + TRYFREE(pfile_in_zip_read_info); + return UNZ_INTERNALERROR; + } + + pfile_in_zip_read_info->stream_initialised=0; + + if (method!=NULL) + *method = (int)s->cur_file_info.compression_method; + + if (level!=NULL) + { + *level = 6; + switch (s->cur_file_info.flag & 0x06) + { + case 6 : *level = 1; break; + case 4 : *level = 2; break; + case 2 : *level = 9; break; + } + } + + if ((s->cur_file_info.compression_method!=0) && +/* #ifdef HAVE_BZIP2 */ + (s->cur_file_info.compression_method!=Z_BZIP2ED) && +/* #endif */ + (s->cur_file_info.compression_method!=Z_DEFLATED)) + + err=UNZ_BADZIPFILE; + + pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; + pfile_in_zip_read_info->crc32=0; + pfile_in_zip_read_info->total_out_64=0; + pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method; + pfile_in_zip_read_info->filestream=s->filestream; + pfile_in_zip_read_info->z_filefunc=s->z_filefunc; + pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; + + pfile_in_zip_read_info->stream.total_out = 0; + + if ((s->cur_file_info.compression_method==Z_BZIP2ED) && (!raw)) + { +#ifdef HAVE_BZIP2 + pfile_in_zip_read_info->bstream.bzalloc = (void *(*) (void *, int, int))0; + pfile_in_zip_read_info->bstream.bzfree = (free_func)0; + pfile_in_zip_read_info->bstream.opaque = (voidpf)0; + pfile_in_zip_read_info->bstream.state = (voidpf)0; + + pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; + pfile_in_zip_read_info->stream.zfree = (free_func)0; + pfile_in_zip_read_info->stream.opaque = (voidpf)0; + pfile_in_zip_read_info->stream.next_in = (voidpf)0; + pfile_in_zip_read_info->stream.avail_in = 0; + + err=BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0); + if (err == Z_OK) + pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED; + else + { + TRYFREE(pfile_in_zip_read_info); + return err; + } +#else + pfile_in_zip_read_info->raw=1; +#endif + } + else if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw)) + { + pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; + pfile_in_zip_read_info->stream.zfree = (free_func)0; + pfile_in_zip_read_info->stream.opaque = (voidpf)0; + pfile_in_zip_read_info->stream.next_in = 0; + pfile_in_zip_read_info->stream.avail_in = 0; + + err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); + if (err == Z_OK) + pfile_in_zip_read_info->stream_initialised=Z_DEFLATED; + else + { + TRYFREE(pfile_in_zip_read_info); + return err; + } + /* windowBits is passed < 0 to tell that there is no zlib header. + * Note that in this case inflate *requires* an extra "dummy" byte + * after the compressed stream in order to complete decompression and + * return Z_STREAM_END. + * In unzip, i don't wait absolutely Z_STREAM_END because I known the + * size of both compressed and uncompressed data + */ + } + pfile_in_zip_read_info->rest_read_compressed = + s->cur_file_info.compressed_size ; + pfile_in_zip_read_info->rest_read_uncompressed = + s->cur_file_info.uncompressed_size ; + + + pfile_in_zip_read_info->pos_in_zipfile = + s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + + iSizeVar; + + pfile_in_zip_read_info->stream.avail_in = (uInt)0; + + s->pfile_in_zip_read = pfile_in_zip_read_info; + s->encrypted = 0; + +# ifndef NOUNCRYPT + if (password != NULL) + { + int i; + s->pcrc_32_tab = get_crc_table(); + init_keys(password,s->keys,s->pcrc_32_tab); + if (ZSEEK64(s->z_filefunc, s->filestream, + s->pfile_in_zip_read->pos_in_zipfile + + s->pfile_in_zip_read->byte_before_the_zipfile, + SEEK_SET)!=0) + return UNZ_INTERNALERROR; + if(ZREAD64(s->z_filefunc, s->filestream,source, 12)<12) + return UNZ_INTERNALERROR; + + for (i = 0; i<12; i++) + zdecode(s->keys,s->pcrc_32_tab,source[i]); + + s->pfile_in_zip_read->pos_in_zipfile+=12; + s->encrypted=1; + } +# endif + + + return UNZ_OK; +} + +extern int ZEXPORT unzOpenCurrentFile (unzFile file) +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); +} + +extern int ZEXPORT unzOpenCurrentFilePassword (unzFile file, const char* password) +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, password); +} + +extern int ZEXPORT unzOpenCurrentFile2 (unzFile file, int* method, int* level, int raw) +{ + return unzOpenCurrentFile3(file, method, level, raw, NULL); +} + +/** Addition for GDAL : START */ + +extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64( unzFile file) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + s=(unz64_s*)file; + if (file==NULL) + return 0; //UNZ_PARAMERROR; + pfile_in_zip_read_info=s->pfile_in_zip_read; + if (pfile_in_zip_read_info==NULL) + return 0; //UNZ_PARAMERROR; + return pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile; +} + +/** Addition for GDAL : END */ + +/* + Read bytes from the current file. + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ +extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len) +{ + int err=UNZ_OK; + uInt iRead = 0; + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if (pfile_in_zip_read_info->read_buffer == NULL) + return UNZ_END_OF_LIST_OF_FILE; + if (len==0) + return 0; + + pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; + + pfile_in_zip_read_info->stream.avail_out = (uInt)len; + + if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && + (!(pfile_in_zip_read_info->raw))) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_uncompressed; + + if ((len>pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in) && + (pfile_in_zip_read_info->raw)) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in; + + while (pfile_in_zip_read_info->stream.avail_out>0) + { + if ((pfile_in_zip_read_info->stream.avail_in==0) && + (pfile_in_zip_read_info->rest_read_compressed>0)) + { + uInt uReadThis = UNZ_BUFSIZE; + if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; + if (uReadThis == 0) + return UNZ_EOF; + if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + if (ZREAD64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->read_buffer, + uReadThis)!=uReadThis) + return UNZ_ERRNO; + + +# ifndef NOUNCRYPT + if(s->encrypted) + { + uInt i; + for(i=0;iread_buffer[i] = + zdecode(s->keys,s->pcrc_32_tab, + pfile_in_zip_read_info->read_buffer[i]); + } +# endif + + + pfile_in_zip_read_info->pos_in_zipfile += uReadThis; + + pfile_in_zip_read_info->rest_read_compressed-=uReadThis; + + pfile_in_zip_read_info->stream.next_in = + (Bytef*)pfile_in_zip_read_info->read_buffer; + pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; + } + + if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) + { + uInt uDoCopy,i ; + + if ((pfile_in_zip_read_info->stream.avail_in == 0) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + return (iRead==0) ? UNZ_EOF : iRead; + + if (pfile_in_zip_read_info->stream.avail_out < + pfile_in_zip_read_info->stream.avail_in) + uDoCopy = pfile_in_zip_read_info->stream.avail_out ; + else + uDoCopy = pfile_in_zip_read_info->stream.avail_in ; + + for (i=0;istream.next_out+i) = + *(pfile_in_zip_read_info->stream.next_in+i); + + pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uDoCopy; + + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, + pfile_in_zip_read_info->stream.next_out, + uDoCopy); + pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; + pfile_in_zip_read_info->stream.avail_in -= uDoCopy; + pfile_in_zip_read_info->stream.avail_out -= uDoCopy; + pfile_in_zip_read_info->stream.next_out += uDoCopy; + pfile_in_zip_read_info->stream.next_in += uDoCopy; + pfile_in_zip_read_info->stream.total_out += uDoCopy; + iRead += uDoCopy; + } + else if (pfile_in_zip_read_info->compression_method==Z_BZIP2ED) + { +#ifdef HAVE_BZIP2 + uLong uTotalOutBefore,uTotalOutAfter; + const Bytef *bufBefore; + uLong uOutThis; + + pfile_in_zip_read_info->bstream.next_in = (char*)pfile_in_zip_read_info->stream.next_in; + pfile_in_zip_read_info->bstream.avail_in = pfile_in_zip_read_info->stream.avail_in; + pfile_in_zip_read_info->bstream.total_in_lo32 = pfile_in_zip_read_info->stream.total_in; + pfile_in_zip_read_info->bstream.total_in_hi32 = 0; + pfile_in_zip_read_info->bstream.next_out = (char*)pfile_in_zip_read_info->stream.next_out; + pfile_in_zip_read_info->bstream.avail_out = pfile_in_zip_read_info->stream.avail_out; + pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_info->stream.total_out; + pfile_in_zip_read_info->bstream.total_out_hi32 = 0; + + uTotalOutBefore = pfile_in_zip_read_info->bstream.total_out_lo32; + bufBefore = (const Bytef *)pfile_in_zip_read_info->bstream.next_out; + + err=BZ2_bzDecompress(&pfile_in_zip_read_info->bstream); + + uTotalOutAfter = pfile_in_zip_read_info->bstream.total_out_lo32; + uOutThis = uTotalOutAfter-uTotalOutBefore; + + pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis; + + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis)); + pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis; + iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); + + pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->bstream.next_in; + pfile_in_zip_read_info->stream.avail_in = pfile_in_zip_read_info->bstream.avail_in; + pfile_in_zip_read_info->stream.total_in = pfile_in_zip_read_info->bstream.total_in_lo32; + pfile_in_zip_read_info->stream.next_out = (Bytef*)pfile_in_zip_read_info->bstream.next_out; + pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->bstream.avail_out; + pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->bstream.total_out_lo32; + + if (err==BZ_STREAM_END) + return (iRead==0) ? UNZ_EOF : iRead; + if (err!=BZ_OK) + break; +#endif + } // end Z_BZIP2ED + else + { + ZPOS64_T uTotalOutBefore,uTotalOutAfter; + const Bytef *bufBefore; + ZPOS64_T uOutThis; + int flush=Z_SYNC_FLUSH; + + uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; + bufBefore = pfile_in_zip_read_info->stream.next_out; + + /* + if ((pfile_in_zip_read_info->rest_read_uncompressed == + pfile_in_zip_read_info->stream.avail_out) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + flush = Z_FINISH; + */ + err=inflate(&pfile_in_zip_read_info->stream,flush); + + if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) + err = Z_DATA_ERROR; + + uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; + uOutThis = uTotalOutAfter-uTotalOutBefore; + + pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis; + + pfile_in_zip_read_info->crc32 = + crc32(pfile_in_zip_read_info->crc32,bufBefore, + (uInt)(uOutThis)); + + pfile_in_zip_read_info->rest_read_uncompressed -= + uOutThis; + + iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); + + if (err==Z_STREAM_END) + return (iRead==0) ? UNZ_EOF : iRead; + if (err!=Z_OK) + break; + } + } + + if (err==Z_OK) + return iRead; + return err; +} + + +/* + Give the current position in uncompressed data +*/ +extern z_off_t ZEXPORT unztell (unzFile file) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + return (z_off_t)pfile_in_zip_read_info->stream.total_out; +} + +extern ZPOS64_T ZEXPORT unztell64 (unzFile file) +{ + + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return (ZPOS64_T)-1; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return (ZPOS64_T)-1; + + return pfile_in_zip_read_info->total_out_64; +} + + +/* + return 1 if the end of file was reached, 0 elsewhere +*/ +extern int ZEXPORT unzeof (unzFile file) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + if (pfile_in_zip_read_info->rest_read_uncompressed == 0) + return 1; + else + return 0; +} + + + +/* +Read extra field from the current file (opened by unzOpenCurrentFile) +This is the local-header version of the extra field (sometimes, there is +more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field that can be read + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ +extern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + uInt read_now; + ZPOS64_T size_to_read; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + size_to_read = (pfile_in_zip_read_info->size_local_extrafield - + pfile_in_zip_read_info->pos_local_extrafield); + + if (buf==NULL) + return (int)size_to_read; + + if (len>size_to_read) + read_now = (uInt)size_to_read; + else + read_now = (uInt)len ; + + if (read_now==0) + return 0; + + if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->offset_local_extrafield + + pfile_in_zip_read_info->pos_local_extrafield, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (ZREAD64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + buf,read_now)!=read_now) + return UNZ_ERRNO; + + return (int)read_now; +} + +/* + Close the file in zip opened with unzOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ +extern int ZEXPORT unzCloseCurrentFile (unzFile file) +{ + int err=UNZ_OK; + + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && + (!pfile_in_zip_read_info->raw)) + { + if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) + err=UNZ_CRCERROR; + } + + + TRYFREE(pfile_in_zip_read_info->read_buffer); + pfile_in_zip_read_info->read_buffer = NULL; + if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED) + inflateEnd(&pfile_in_zip_read_info->stream); +#ifdef HAVE_BZIP2 + else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED) + BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream); +#endif + + + pfile_in_zip_read_info->stream_initialised = 0; + TRYFREE(pfile_in_zip_read_info); + + s->pfile_in_zip_read=NULL; + + return err; +} + + +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ +extern int ZEXPORT unzGetGlobalComment (unzFile file, char * szComment, uLong uSizeBuf) +{ + unz64_s* s; + uLong uReadThis ; + if (file==NULL) + return (int)UNZ_PARAMERROR; + s=(unz64_s*)file; + + uReadThis = uSizeBuf; + if (uReadThis>s->gi.size_comment) + uReadThis = s->gi.size_comment; + + if (ZSEEK64(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (uReadThis>0) + { + *szComment='\0'; + if (ZREAD64(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) + return UNZ_ERRNO; + } + + if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) + *(szComment+s->gi.size_comment)='\0'; + return (int)uReadThis; +} + +/* Additions by RX '2004 */ +extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file) +{ + unz64_s* s; + + if (file==NULL) + return 0; //UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return 0; + if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) + if (s->num_file==s->gi.number_entry) + return 0; + return s->pos_in_central_dir; +} + +extern uLong ZEXPORT unzGetOffset (unzFile file) +{ + ZPOS64_T offset64; + + if (file==NULL) + return 0; //UNZ_PARAMERROR; + offset64 = unzGetOffset64(file); + return (uLong)offset64; +} + +extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos) +{ + unz64_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + + s->pos_in_central_dir = pos; + s->num_file = s->gi.number_entry; /* hack */ + err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos) +{ + return unzSetOffset64(file,pos); +} diff --git a/externe_kniznice/zlib/contrib/minizip/unzip.h b/externe_kniznice/zlib/contrib/minizip/unzip.h new file mode 100644 index 0000000..2104e39 --- /dev/null +++ b/externe_kniznice/zlib/contrib/minizip/unzip.h @@ -0,0 +1,437 @@ +/* unzip.h -- IO for uncompress .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + --------------------------------------------------------------------------------- + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + --------------------------------------------------------------------------------- + + Changes + + See header of unzip64.c + +*/ + +#ifndef _unz64_H +#define _unz64_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#ifndef _ZLIBIOAPI_H +#include "ioapi.h" +#endif + +#ifdef HAVE_BZIP2 +#include "bzlib.h" +#endif + +#define Z_BZIP2ED 12 + +#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagunzFile__ { int unused; } unzFile__; +typedef unzFile__ *unzFile; +#else +typedef voidp unzFile; +#endif + + +#define UNZ_OK (0) +#define UNZ_END_OF_LIST_OF_FILE (-100) +#define UNZ_ERRNO (Z_ERRNO) +#define UNZ_EOF (0) +#define UNZ_PARAMERROR (-102) +#define UNZ_BADZIPFILE (-103) +#define UNZ_INTERNALERROR (-104) +#define UNZ_CRCERROR (-105) + +/* tm_unz contain date/time info */ +typedef struct tm_unz_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_unz; + +/* unz_global_info structure contain global data about the ZIPfile + These data comes from the end of central dir */ +typedef struct unz_global_info64_s +{ + ZPOS64_T number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info64; + +typedef struct unz_global_info_s +{ + uLong number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info; + +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_info64_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + ZPOS64_T compressed_size; /* compressed size 8 bytes */ + ZPOS64_T uncompressed_size; /* uncompressed size 8 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info64; + +typedef struct unz_file_info_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + uLong compressed_size; /* compressed size 4 bytes */ + uLong uncompressed_size; /* uncompressed size 4 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info; + +extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, + const char* fileName2, + int iCaseSensitivity)); +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) +*/ + + +extern unzFile ZEXPORT unzOpen OF((const char *path)); +extern unzFile ZEXPORT unzOpen64 OF((const void *path)); +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer + "zlib/zlib113.zip". + If the zipfile cannot be opened (file don't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. + the "64" function take a const void* pointer, because the path is just the + value passed to the open64_file_func callback. + Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path + is a pointer to a wide unicode string (LPCTSTR is LPCWSTR), so const char* + does not describe the reality +*/ + + +extern unzFile ZEXPORT unzOpen2 OF((const char *path, + zlib_filefunc_def* pzlib_filefunc_def)); +/* + Open a Zip file, like unzOpen, but provide a set of file low level API + for read/write the zip file (see ioapi.h) +*/ + +extern unzFile ZEXPORT unzOpen2_64 OF((const void *path, + zlib_filefunc64_def* pzlib_filefunc_def)); +/* + Open a Zip file, like unz64Open, but provide a set of file low level API + for read/write the zip file (see ioapi.h) +*/ + +extern int ZEXPORT unzClose OF((unzFile file)); +/* + Close a ZipFile opened with unzOpen. + If there is files inside the .Zip opened with unzOpenCurrentFile (see later), + these files MUST be closed with unzCloseCurrentFile before call unzClose. + return UNZ_OK if there is no problem. */ + +extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, + unz_global_info *pglobal_info)); + +extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file, + unz_global_info64 *pglobal_info)); +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ + + +extern int ZEXPORT unzGetGlobalComment OF((unzFile file, + char *szComment, + uLong uSizeBuf)); +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ + + +/***************************************************************************/ +/* Unzip package allow you browse the directory of the zipfile */ + +extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ + +extern int ZEXPORT unzGoToNextFile OF((unzFile file)); +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ + +extern int ZEXPORT unzLocateFile OF((unzFile file, + const char *szFileName, + int iCaseSensitivity)); +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ + + +/* ****************************************** */ +/* Ryan supplied functions */ +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_pos_s +{ + uLong pos_in_zip_directory; /* offset in zip file directory */ + uLong num_of_file; /* # of file */ +} unz_file_pos; + +extern int ZEXPORT unzGetFilePos( + unzFile file, + unz_file_pos* file_pos); + +extern int ZEXPORT unzGoToFilePos( + unzFile file, + unz_file_pos* file_pos); + +typedef struct unz64_file_pos_s +{ + ZPOS64_T pos_in_zip_directory; /* offset in zip file directory */ + ZPOS64_T num_of_file; /* # of file */ +} unz64_file_pos; + +extern int ZEXPORT unzGetFilePos64( + unzFile file, + unz64_file_pos* file_pos); + +extern int ZEXPORT unzGoToFilePos64( + unzFile file, + const unz64_file_pos* file_pos); + +/* ****************************************** */ + +extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file, + unz_file_info64 *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + +extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, + unz_file_info *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); +/* + Get Info about the current file + if pfile_info!=NULL, the *pfile_info structure will contain somes info about + the current file + if szFileName!=NULL, the filemane string will be copied in szFileName + (fileNameBufferSize is the size of the buffer) + if extraField!=NULL, the extra field information will be copied in extraField + (extraFieldBufferSize is the size of the buffer). + This is the Central-header version of the extra field + if szComment!=NULL, the comment string of the file will be copied in szComment + (commentBufferSize is the size of the buffer) +*/ + + +/** Addition for GDAL : START */ + +extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file)); + +/** Addition for GDAL : END */ + + +/***************************************************************************/ +/* for reading the content of the current zipfile, you can open it, read data + from it, and close it (you can close it before reading all the file) + */ + +extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); +/* + Open for reading data the current file in the zipfile. + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, + const char* password)); +/* + Open for reading data the current file in the zipfile. + password is a crypting password + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, + int* method, + int* level, + int raw)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + +extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, + int* method, + int* level, + int raw, + const char* password)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + + +extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); +/* + Close the file in zip opened with unzOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ + +extern int ZEXPORT unzReadCurrentFile OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read bytes from the current file (opened by unzOpenCurrentFile) + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ + +extern z_off_t ZEXPORT unztell OF((unzFile file)); + +extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file)); +/* + Give the current position in uncompressed data +*/ + +extern int ZEXPORT unzeof OF((unzFile file)); +/* + return 1 if the end of file was reached, 0 elsewhere +*/ + +extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ + +/***************************************************************************/ + +/* Get the current file offset */ +extern ZPOS64_T ZEXPORT unzGetOffset64 (unzFile file); +extern uLong ZEXPORT unzGetOffset (unzFile file); + +/* Set the current file offset */ +extern int ZEXPORT unzSetOffset64 (unzFile file, ZPOS64_T pos); +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); + + + +#ifdef __cplusplus +} +#endif + +#endif /* _unz64_H */ diff --git a/externe_kniznice/zlib/contrib/minizip/zip.c b/externe_kniznice/zlib/contrib/minizip/zip.c new file mode 100644 index 0000000..44e88a9 --- /dev/null +++ b/externe_kniznice/zlib/contrib/minizip/zip.c @@ -0,0 +1,2007 @@ +/* zip.c -- IO on .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + Changes + Oct-2009 - Mathias Svensson - Remove old C style function prototypes + Oct-2009 - Mathias Svensson - Added Zip64 Support when creating new file archives + Oct-2009 - Mathias Svensson - Did some code cleanup and refactoring to get better overview of some functions. + Oct-2009 - Mathias Svensson - Added zipRemoveExtraInfoBlock to strip extra field data from its ZIP64 data + It is used when recreting zip archive with RAW when deleting items from a zip. + ZIP64 data is automatically added to items that needs it, and existing ZIP64 data need to be removed. + Oct-2009 - Mathias Svensson - Added support for BZIP2 as compression mode (bzip2 lib is required) + Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer + +*/ + + +#include +#include +#include +#include +#include "zlib.h" +#include "zip.h" + +#ifdef STDC +# include +# include +# include +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include +#endif + + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +#ifndef VERSIONMADEBY +# define VERSIONMADEBY (0x0) /* platform depedent */ +#endif + +#ifndef Z_BUFSIZE +#define Z_BUFSIZE (64*1024) //(16384) +#endif + +#ifndef Z_MAXFILENAMEINZIP +#define Z_MAXFILENAMEINZIP (256) +#endif + +#ifndef ALLOC +# define ALLOC(size) (malloc(size)) +#endif +#ifndef TRYFREE +# define TRYFREE(p) {if (p) free(p);} +#endif + +/* +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) +*/ + +/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ + + +// NOT sure that this work on ALL platform +#define MAKEULONG64(a, b) ((ZPOS64_T)(((unsigned long)(a)) | ((ZPOS64_T)((unsigned long)(b))) << 32)) + +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif + +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif + +#ifndef DEF_MEM_LEVEL +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +#endif +const char zip_copyright[] =" zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; + + +#define SIZEDATA_INDATABLOCK (4096-(4*4)) + +#define LOCALHEADERMAGIC (0x04034b50) +#define CENTRALHEADERMAGIC (0x02014b50) +#define ENDHEADERMAGIC (0x06054b50) +#define ZIP64ENDHEADERMAGIC (0x6064b50) +#define ZIP64ENDLOCHEADERMAGIC (0x7064b50) + +#define FLAG_LOCALHEADER_OFFSET (0x06) +#define CRC_LOCALHEADER_OFFSET (0x0e) + +#define SIZECENTRALHEADER (0x2e) /* 46 */ + +typedef struct linkedlist_datablock_internal_s +{ + struct linkedlist_datablock_internal_s* next_datablock; + uLong avail_in_this_block; + uLong filled_in_this_block; + uLong unused; /* for future use and alignment */ + unsigned char data[SIZEDATA_INDATABLOCK]; +} linkedlist_datablock_internal; + +typedef struct linkedlist_data_s +{ + linkedlist_datablock_internal* first_block; + linkedlist_datablock_internal* last_block; +} linkedlist_data; + + +typedef struct +{ + z_stream stream; /* zLib stream structure for inflate */ +#ifdef HAVE_BZIP2 + bz_stream bstream; /* bzLib stream structure for bziped */ +#endif + + int stream_initialised; /* 1 is stream is initialised */ + uInt pos_in_buffered_data; /* last written byte in buffered_data */ + + ZPOS64_T pos_local_header; /* offset of the local header of the file + currenty writing */ + char* central_header; /* central header data for the current file */ + uLong size_centralExtra; + uLong size_centralheader; /* size of the central header for cur file */ + uLong size_centralExtraFree; /* Extra bytes allocated to the centralheader but that are not used */ + uLong flag; /* flag of the file currently writing */ + + int method; /* compression method of file currenty wr.*/ + int raw; /* 1 for directly writing raw data */ + Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ + uLong dosDate; + uLong crc32; + int encrypt; + int zip64; /* Add ZIP64 extened information in the extra field */ + ZPOS64_T pos_zip64extrainfo; + ZPOS64_T totalCompressedData; + ZPOS64_T totalUncompressedData; +#ifndef NOCRYPT + unsigned long keys[3]; /* keys defining the pseudo-random sequence */ + const z_crc_t* pcrc_32_tab; + int crypt_header_size; +#endif +} curfile64_info; + +typedef struct +{ + zlib_filefunc64_32_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + linkedlist_data central_dir;/* datablock with central dir in construction*/ + int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ + curfile64_info ci; /* info on the file curretly writing */ + + ZPOS64_T begin_pos; /* position of the beginning of the zipfile */ + ZPOS64_T add_position_when_writing_offset; + ZPOS64_T number_entry; + +#ifndef NO_ADDFILEINEXISTINGZIP + char *globalcomment; +#endif + +} zip64_internal; + + +#ifndef NOCRYPT +#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED +#include "crypt.h" +#endif + +local linkedlist_datablock_internal* allocate_new_datablock() +{ + linkedlist_datablock_internal* ldi; + ldi = (linkedlist_datablock_internal*) + ALLOC(sizeof(linkedlist_datablock_internal)); + if (ldi!=NULL) + { + ldi->next_datablock = NULL ; + ldi->filled_in_this_block = 0 ; + ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ; + } + return ldi; +} + +local void free_datablock(linkedlist_datablock_internal* ldi) +{ + while (ldi!=NULL) + { + linkedlist_datablock_internal* ldinext = ldi->next_datablock; + TRYFREE(ldi); + ldi = ldinext; + } +} + +local void init_linkedlist(linkedlist_data* ll) +{ + ll->first_block = ll->last_block = NULL; +} + +local void free_linkedlist(linkedlist_data* ll) +{ + free_datablock(ll->first_block); + ll->first_block = ll->last_block = NULL; +} + + +local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len) +{ + linkedlist_datablock_internal* ldi; + const unsigned char* from_copy; + + if (ll==NULL) + return ZIP_INTERNALERROR; + + if (ll->last_block == NULL) + { + ll->first_block = ll->last_block = allocate_new_datablock(); + if (ll->first_block == NULL) + return ZIP_INTERNALERROR; + } + + ldi = ll->last_block; + from_copy = (unsigned char*)buf; + + while (len>0) + { + uInt copy_this; + uInt i; + unsigned char* to_copy; + + if (ldi->avail_in_this_block==0) + { + ldi->next_datablock = allocate_new_datablock(); + if (ldi->next_datablock == NULL) + return ZIP_INTERNALERROR; + ldi = ldi->next_datablock ; + ll->last_block = ldi; + } + + if (ldi->avail_in_this_block < len) + copy_this = (uInt)ldi->avail_in_this_block; + else + copy_this = (uInt)len; + + to_copy = &(ldi->data[ldi->filled_in_this_block]); + + for (i=0;ifilled_in_this_block += copy_this; + ldi->avail_in_this_block -= copy_this; + from_copy += copy_this ; + len -= copy_this; + } + return ZIP_OK; +} + + + +/****************************************************************************/ + +#ifndef NO_ADDFILEINEXISTINGZIP +/* =========================================================================== + Inputs a long in LSB order to the given file + nbByte == 1, 2 ,4 or 8 (byte, short or long, ZPOS64_T) +*/ + +local int zip64local_putValue OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte)); +local int zip64local_putValue (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte) +{ + unsigned char buf[8]; + int n; + for (n = 0; n < nbByte; n++) + { + buf[n] = (unsigned char)(x & 0xff); + x >>= 8; + } + if (x != 0) + { /* data overflow - hack for ZIP64 (X Roche) */ + for (n = 0; n < nbByte; n++) + { + buf[n] = 0xff; + } + } + + if (ZWRITE64(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte) + return ZIP_ERRNO; + else + return ZIP_OK; +} + +local void zip64local_putValue_inmemory OF((void* dest, ZPOS64_T x, int nbByte)); +local void zip64local_putValue_inmemory (void* dest, ZPOS64_T x, int nbByte) +{ + unsigned char* buf=(unsigned char*)dest; + int n; + for (n = 0; n < nbByte; n++) { + buf[n] = (unsigned char)(x & 0xff); + x >>= 8; + } + + if (x != 0) + { /* data overflow - hack for ZIP64 */ + for (n = 0; n < nbByte; n++) + { + buf[n] = 0xff; + } + } +} + +/****************************************************************************/ + + +local uLong zip64local_TmzDateToDosDate(const tm_zip* ptm) +{ + uLong year = (uLong)ptm->tm_year; + if (year>=1980) + year-=1980; + else if (year>=80) + year-=80; + return + (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) | + ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); +} + + +/****************************************************************************/ + +local int zip64local_getByte OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi)); + +local int zip64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def,voidpf filestream,int* pi) +{ + unsigned char c; + int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); + if (err==1) + { + *pi = (int)c; + return ZIP_OK; + } + else + { + if (ZERROR64(*pzlib_filefunc_def,filestream)) + return ZIP_ERRNO; + else + return ZIP_EOF; + } +} + + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets +*/ +local int zip64local_getShort OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); + +local int zip64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) +{ + uLong x ; + int i = 0; + int err; + + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int zip64local_getLong OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); + +local int zip64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) +{ + uLong x ; + int i = 0; + int err; + + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<16; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<24; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int zip64local_getLong64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)); + + +local int zip64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX) +{ + ZPOS64_T x; + int i = 0; + int err; + + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (ZPOS64_T)i; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<8; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<16; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<24; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<32; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<40; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<48; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<56; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + + return err; +} + +#ifndef BUFREADCOMMENT +#define BUFREADCOMMENT (0x400) +#endif +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local ZPOS64_T zip64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); + +local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} + +/* +Locate the End of Zip64 Central directory locator and from there find the CD of a zipfile (at the end, just before +the global comment) +*/ +local ZPOS64_T zip64local_SearchCentralDir64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); + +local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + uLong uL; + ZPOS64_T relativeOffset; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + { + // Signature "0x07064b50" Zip64 end of central directory locater + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07)) + { + uPosFound = uReadPos+i; + break; + } + } + + if (uPosFound!=0) + break; + } + + TRYFREE(buf); + if (uPosFound == 0) + return 0; + + /* Zip64 end of central directory locator */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature, already checked */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + + /* number of the disk with the start of the zip64 end of central directory */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + if (uL != 0) + return 0; + + /* relative offset of the zip64 end of central directory record */ + if (zip64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=ZIP_OK) + return 0; + + /* total number of disks */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + if (uL != 1) + return 0; + + /* Goto Zip64 end of central directory record */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + + if (uL != 0x06064b50) // signature of 'Zip64 end of central directory' + return 0; + + return relativeOffset; +} + +int LoadCentralDirectoryRecord(zip64_internal* pziinit) +{ + int err=ZIP_OK; + ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + + ZPOS64_T size_central_dir; /* size of the central directory */ + ZPOS64_T offset_central_dir; /* offset of start of central directory */ + ZPOS64_T central_pos; + uLong uL; + + uLong number_disk; /* number of the current dist, used for + spaning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the the disk with central dir, used + for spaning ZIP, unsupported, always 0*/ + ZPOS64_T number_entry; + ZPOS64_T number_entry_CD; /* total number of entries in + the central dir + (same than number_entry on nospan) */ + uLong VersionMadeBy; + uLong VersionNeeded; + uLong size_comment; + + int hasZIP64Record = 0; + + // check first if we find a ZIP64 record + central_pos = zip64local_SearchCentralDir64(&pziinit->z_filefunc,pziinit->filestream); + if(central_pos > 0) + { + hasZIP64Record = 1; + } + else if(central_pos == 0) + { + central_pos = zip64local_SearchCentralDir(&pziinit->z_filefunc,pziinit->filestream); + } + +/* disable to allow appending to empty ZIP archive + if (central_pos==0) + err=ZIP_ERRNO; +*/ + + if(hasZIP64Record) + { + ZPOS64_T sizeEndOfCentralDirectory; + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0) + err=ZIP_ERRNO; + + /* the signature, already checked */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&uL)!=ZIP_OK) + err=ZIP_ERRNO; + + /* size of zip64 end of central directory record */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream, &sizeEndOfCentralDirectory)!=ZIP_OK) + err=ZIP_ERRNO; + + /* version made by */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &VersionMadeBy)!=ZIP_OK) + err=ZIP_ERRNO; + + /* version needed to extract */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &VersionNeeded)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of this disk */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&number_disk)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of the disk with the start of the central directory */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&number_disk_with_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central directory on this disk */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream, &number_entry)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central directory */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&number_entry_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + if ((number_entry_CD!=number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) + err=ZIP_BADZIPFILE; + + /* size of the central directory */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&size_central_dir)!=ZIP_OK) + err=ZIP_ERRNO; + + /* offset of start of central directory with respect to the + starting disk number */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&offset_central_dir)!=ZIP_OK) + err=ZIP_ERRNO; + + // TODO.. + // read the comment from the standard central header. + size_comment = 0; + } + else + { + // Read End of central Directory info + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=ZIP_ERRNO; + + /* the signature, already checked */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&uL)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of this disk */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream,&number_disk)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of the disk with the start of the central directory */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream,&number_disk_with_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central dir on this disk */ + number_entry = 0; + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + number_entry = uL; + + /* total number of entries in the central dir */ + number_entry_CD = 0; + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + number_entry_CD = uL; + + if ((number_entry_CD!=number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) + err=ZIP_BADZIPFILE; + + /* size of the central directory */ + size_central_dir = 0; + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + size_central_dir = uL; + + /* offset of start of central directory with respect to the starting disk number */ + offset_central_dir = 0; + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + offset_central_dir = uL; + + + /* zipfile global comment length */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &size_comment)!=ZIP_OK) + err=ZIP_ERRNO; + } + + if ((central_posz_filefunc, pziinit->filestream); + return ZIP_ERRNO; + } + + if (size_comment>0) + { + pziinit->globalcomment = (char*)ALLOC(size_comment+1); + if (pziinit->globalcomment) + { + size_comment = ZREAD64(pziinit->z_filefunc, pziinit->filestream, pziinit->globalcomment,size_comment); + pziinit->globalcomment[size_comment]=0; + } + } + + byte_before_the_zipfile = central_pos - (offset_central_dir+size_central_dir); + pziinit->add_position_when_writing_offset = byte_before_the_zipfile; + + { + ZPOS64_T size_central_dir_to_read = size_central_dir; + size_t buf_size = SIZEDATA_INDATABLOCK; + void* buf_read = (void*)ALLOC(buf_size); + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, offset_central_dir + byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0) + err=ZIP_ERRNO; + + while ((size_central_dir_to_read>0) && (err==ZIP_OK)) + { + ZPOS64_T read_this = SIZEDATA_INDATABLOCK; + if (read_this > size_central_dir_to_read) + read_this = size_central_dir_to_read; + + if (ZREAD64(pziinit->z_filefunc, pziinit->filestream,buf_read,(uLong)read_this) != read_this) + err=ZIP_ERRNO; + + if (err==ZIP_OK) + err = add_data_in_datablock(&pziinit->central_dir,buf_read, (uLong)read_this); + + size_central_dir_to_read-=read_this; + } + TRYFREE(buf_read); + } + pziinit->begin_pos = byte_before_the_zipfile; + pziinit->number_entry = number_entry_CD; + + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET) != 0) + err=ZIP_ERRNO; + + return err; +} + + +#endif /* !NO_ADDFILEINEXISTINGZIP*/ + + +/************************************************************/ +extern zipFile ZEXPORT zipOpen3 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_32_def* pzlib_filefunc64_32_def) +{ + zip64_internal ziinit; + zip64_internal* zi; + int err=ZIP_OK; + + ziinit.z_filefunc.zseek32_file = NULL; + ziinit.z_filefunc.ztell32_file = NULL; + if (pzlib_filefunc64_32_def==NULL) + fill_fopen64_filefunc(&ziinit.z_filefunc.zfile_func64); + else + ziinit.z_filefunc = *pzlib_filefunc64_32_def; + + ziinit.filestream = ZOPEN64(ziinit.z_filefunc, + pathname, + (append == APPEND_STATUS_CREATE) ? + (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) : + (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING)); + + if (ziinit.filestream == NULL) + return NULL; + + if (append == APPEND_STATUS_CREATEAFTER) + ZSEEK64(ziinit.z_filefunc,ziinit.filestream,0,SEEK_END); + + ziinit.begin_pos = ZTELL64(ziinit.z_filefunc,ziinit.filestream); + ziinit.in_opened_file_inzip = 0; + ziinit.ci.stream_initialised = 0; + ziinit.number_entry = 0; + ziinit.add_position_when_writing_offset = 0; + init_linkedlist(&(ziinit.central_dir)); + + + + zi = (zip64_internal*)ALLOC(sizeof(zip64_internal)); + if (zi==NULL) + { + ZCLOSE64(ziinit.z_filefunc,ziinit.filestream); + return NULL; + } + + /* now we add file in a zipfile */ +# ifndef NO_ADDFILEINEXISTINGZIP + ziinit.globalcomment = NULL; + if (append == APPEND_STATUS_ADDINZIP) + { + // Read and Cache Central Directory Records + err = LoadCentralDirectoryRecord(&ziinit); + } + + if (globalcomment) + { + *globalcomment = ziinit.globalcomment; + } +# endif /* !NO_ADDFILEINEXISTINGZIP*/ + + if (err != ZIP_OK) + { +# ifndef NO_ADDFILEINEXISTINGZIP + TRYFREE(ziinit.globalcomment); +# endif /* !NO_ADDFILEINEXISTINGZIP*/ + TRYFREE(zi); + return NULL; + } + else + { + *zi = ziinit; + return (zipFile)zi; + } +} + +extern zipFile ZEXPORT zipOpen2 (const char *pathname, int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc32_def) +{ + if (pzlib_filefunc32_def != NULL) + { + zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; + fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill,pzlib_filefunc32_def); + return zipOpen3(pathname, append, globalcomment, &zlib_filefunc64_32_def_fill); + } + else + return zipOpen3(pathname, append, globalcomment, NULL); +} + +extern zipFile ZEXPORT zipOpen2_64 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def) +{ + if (pzlib_filefunc_def != NULL) + { + zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; + zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def; + zlib_filefunc64_32_def_fill.ztell32_file = NULL; + zlib_filefunc64_32_def_fill.zseek32_file = NULL; + return zipOpen3(pathname, append, globalcomment, &zlib_filefunc64_32_def_fill); + } + else + return zipOpen3(pathname, append, globalcomment, NULL); +} + + + +extern zipFile ZEXPORT zipOpen (const char* pathname, int append) +{ + return zipOpen3((const void*)pathname,append,NULL,NULL); +} + +extern zipFile ZEXPORT zipOpen64 (const void* pathname, int append) +{ + return zipOpen3(pathname,append,NULL,NULL); +} + +int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_extrafield_local, const void* extrafield_local) +{ + /* write the local header */ + int err; + uInt size_filename = (uInt)strlen(filename); + uInt size_extrafield = size_extrafield_local; + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC, 4); + + if (err==ZIP_OK) + { + if(zi->ci.zip64) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2);/* version needed to extract */ + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */ + } + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2); + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2); + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4); + + // CRC / Compressed size / Uncompressed size will be filled in later and rewritten later + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */ + if (err==ZIP_OK) + { + if(zi->ci.zip64) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xFFFFFFFF,4); /* compressed size, unknown */ + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */ + } + if (err==ZIP_OK) + { + if(zi->ci.zip64) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xFFFFFFFF,4); /* uncompressed size, unknown */ + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */ + } + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2); + + if(zi->ci.zip64) + { + size_extrafield += 20; + } + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield,2); + + if ((err==ZIP_OK) && (size_filename > 0)) + { + if (ZWRITE64(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename) + err = ZIP_ERRNO; + } + + if ((err==ZIP_OK) && (size_extrafield_local > 0)) + { + if (ZWRITE64(zi->z_filefunc, zi->filestream, extrafield_local, size_extrafield_local) != size_extrafield_local) + err = ZIP_ERRNO; + } + + + if ((err==ZIP_OK) && (zi->ci.zip64)) + { + // write the Zip64 extended info + short HeaderID = 1; + short DataSize = 16; + ZPOS64_T CompressedSize = 0; + ZPOS64_T UncompressedSize = 0; + + // Remember position of Zip64 extended info for the local file header. (needed when we update size after done with file) + zi->ci.pos_zip64extrainfo = ZTELL64(zi->z_filefunc,zi->filestream); + + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)HeaderID,2); + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)DataSize,2); + + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)UncompressedSize,8); + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)CompressedSize,8); + } + + return err; +} + +/* + NOTE. + When writing RAW the ZIP64 extended information in extrafield_local and extrafield_global needs to be stripped + before calling this function it can be done with zipRemoveExtraInfoBlock + + It is not done here because then we need to realloc a new buffer since parameters are 'const' and I want to minimize + unnecessary allocations. + */ +extern int ZEXPORT zipOpenNewFileInZip4_64 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, + uLong versionMadeBy, uLong flagBase, int zip64) +{ + zip64_internal* zi; + uInt size_filename; + uInt size_comment; + uInt i; + int err = ZIP_OK; + +# ifdef NOCRYPT + (crcForCrypting); + if (password != NULL) + return ZIP_PARAMERROR; +# endif + + if (file == NULL) + return ZIP_PARAMERROR; + +#ifdef HAVE_BZIP2 + if ((method!=0) && (method!=Z_DEFLATED) && (method!=Z_BZIP2ED)) + return ZIP_PARAMERROR; +#else + if ((method!=0) && (method!=Z_DEFLATED)) + return ZIP_PARAMERROR; +#endif + + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 1) + { + err = zipCloseFileInZip (file); + if (err != ZIP_OK) + return err; + } + + if (filename==NULL) + filename="-"; + + if (comment==NULL) + size_comment = 0; + else + size_comment = (uInt)strlen(comment); + + size_filename = (uInt)strlen(filename); + + if (zipfi == NULL) + zi->ci.dosDate = 0; + else + { + if (zipfi->dosDate != 0) + zi->ci.dosDate = zipfi->dosDate; + else + zi->ci.dosDate = zip64local_TmzDateToDosDate(&zipfi->tmz_date); + } + + zi->ci.flag = flagBase; + if ((level==8) || (level==9)) + zi->ci.flag |= 2; + if (level==2) + zi->ci.flag |= 4; + if (level==1) + zi->ci.flag |= 6; + if (password != NULL) + zi->ci.flag |= 1; + + zi->ci.crc32 = 0; + zi->ci.method = method; + zi->ci.encrypt = 0; + zi->ci.stream_initialised = 0; + zi->ci.pos_in_buffered_data = 0; + zi->ci.raw = raw; + zi->ci.pos_local_header = ZTELL64(zi->z_filefunc,zi->filestream); + + zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + size_extrafield_global + size_comment; + zi->ci.size_centralExtraFree = 32; // Extra space we have reserved in case we need to add ZIP64 extra info data + + zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader + zi->ci.size_centralExtraFree); + + zi->ci.size_centralExtra = size_extrafield_global; + zip64local_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4); + /* version info */ + zip64local_putValue_inmemory(zi->ci.central_header+4,(uLong)versionMadeBy,2); + zip64local_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2); + zip64local_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2); + zip64local_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2); + zip64local_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4); + zip64local_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/ + zip64local_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/ + zip64local_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/ + zip64local_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2); + zip64local_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2); + zip64local_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2); + zip64local_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/ + + if (zipfi==NULL) + zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2); + else + zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2); + + if (zipfi==NULL) + zip64local_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4); + else + zip64local_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4); + + if(zi->ci.pos_local_header >= 0xffffffff) + zip64local_putValue_inmemory(zi->ci.central_header+42,(uLong)0xffffffff,4); + else + zip64local_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header - zi->add_position_when_writing_offset,4); + + for (i=0;ici.central_header+SIZECENTRALHEADER+i) = *(filename+i); + + for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+i) = + *(((const char*)extrafield_global)+i); + + for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+ + size_extrafield_global+i) = *(comment+i); + if (zi->ci.central_header == NULL) + return ZIP_INTERNALERROR; + + zi->ci.zip64 = zip64; + zi->ci.totalCompressedData = 0; + zi->ci.totalUncompressedData = 0; + zi->ci.pos_zip64extrainfo = 0; + + err = Write_LocalFileHeader(zi, filename, size_extrafield_local, extrafield_local); + +#ifdef HAVE_BZIP2 + zi->ci.bstream.avail_in = (uInt)0; + zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; + zi->ci.bstream.total_in_hi32 = 0; + zi->ci.bstream.total_in_lo32 = 0; + zi->ci.bstream.total_out_hi32 = 0; + zi->ci.bstream.total_out_lo32 = 0; +#endif + + zi->ci.stream.avail_in = (uInt)0; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + zi->ci.stream.total_in = 0; + zi->ci.stream.total_out = 0; + zi->ci.stream.data_type = Z_BINARY; + +#ifdef HAVE_BZIP2 + if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED || zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) +#else + if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) +#endif + { + if(zi->ci.method == Z_DEFLATED) + { + zi->ci.stream.zalloc = (alloc_func)0; + zi->ci.stream.zfree = (free_func)0; + zi->ci.stream.opaque = (voidpf)0; + + if (windowBits>0) + windowBits = -windowBits; + + err = deflateInit2(&zi->ci.stream, level, Z_DEFLATED, windowBits, memLevel, strategy); + + if (err==Z_OK) + zi->ci.stream_initialised = Z_DEFLATED; + } + else if(zi->ci.method == Z_BZIP2ED) + { +#ifdef HAVE_BZIP2 + // Init BZip stuff here + zi->ci.bstream.bzalloc = 0; + zi->ci.bstream.bzfree = 0; + zi->ci.bstream.opaque = (voidpf)0; + + err = BZ2_bzCompressInit(&zi->ci.bstream, level, 0,35); + if(err == BZ_OK) + zi->ci.stream_initialised = Z_BZIP2ED; +#endif + } + + } + +# ifndef NOCRYPT + zi->ci.crypt_header_size = 0; + if ((err==Z_OK) && (password != NULL)) + { + unsigned char bufHead[RAND_HEAD_LEN]; + unsigned int sizeHead; + zi->ci.encrypt = 1; + zi->ci.pcrc_32_tab = get_crc_table(); + /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/ + + sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting); + zi->ci.crypt_header_size = sizeHead; + + if (ZWRITE64(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead) + err = ZIP_ERRNO; + } +# endif + + if (err==Z_OK) + zi->in_opened_file_inzip = 1; + return err; +} + +extern int ZEXPORT zipOpenNewFileInZip4 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, + uLong versionMadeBy, uLong flagBase) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, versionMadeBy, flagBase, 0); +} + +extern int ZEXPORT zipOpenNewFileInZip3 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, VERSIONMADEBY, 0, 0); +} + +extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, int zip64) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, VERSIONMADEBY, 0, zip64); +} + +extern int ZEXPORT zipOpenNewFileInZip2(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, 0); +} + +extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, int zip64) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, zip64); +} + +extern int ZEXPORT zipOpenNewFileInZip64 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void*extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int zip64) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, 0, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, zip64); +} + +extern int ZEXPORT zipOpenNewFileInZip (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void*extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, 0, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, 0); +} + +local int zip64FlushWriteBuffer(zip64_internal* zi) +{ + int err=ZIP_OK; + + if (zi->ci.encrypt != 0) + { +#ifndef NOCRYPT + uInt i; + int t; + for (i=0;ici.pos_in_buffered_data;i++) + zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, zi->ci.buffered_data[i],t); +#endif + } + + if (ZWRITE64(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data) != zi->ci.pos_in_buffered_data) + err = ZIP_ERRNO; + + zi->ci.totalCompressedData += zi->ci.pos_in_buffered_data; + +#ifdef HAVE_BZIP2 + if(zi->ci.method == Z_BZIP2ED) + { + zi->ci.totalUncompressedData += zi->ci.bstream.total_in_lo32; + zi->ci.bstream.total_in_lo32 = 0; + zi->ci.bstream.total_in_hi32 = 0; + } + else +#endif + { + zi->ci.totalUncompressedData += zi->ci.stream.total_in; + zi->ci.stream.total_in = 0; + } + + + zi->ci.pos_in_buffered_data = 0; + + return err; +} + +extern int ZEXPORT zipWriteInFileInZip (zipFile file,const void* buf,unsigned int len) +{ + zip64_internal* zi; + int err=ZIP_OK; + + if (file == NULL) + return ZIP_PARAMERROR; + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 0) + return ZIP_PARAMERROR; + + zi->ci.crc32 = crc32(zi->ci.crc32,buf,(uInt)len); + +#ifdef HAVE_BZIP2 + if(zi->ci.method == Z_BZIP2ED && (!zi->ci.raw)) + { + zi->ci.bstream.next_in = (void*)buf; + zi->ci.bstream.avail_in = len; + err = BZ_RUN_OK; + + while ((err==BZ_RUN_OK) && (zi->ci.bstream.avail_in>0)) + { + if (zi->ci.bstream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; + } + + + if(err != BZ_RUN_OK) + break; + + if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) + { + uLong uTotalOutBefore_lo = zi->ci.bstream.total_out_lo32; +// uLong uTotalOutBefore_hi = zi->ci.bstream.total_out_hi32; + err=BZ2_bzCompress(&zi->ci.bstream, BZ_RUN); + + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore_lo) ; + } + } + + if(err == BZ_RUN_OK) + err = ZIP_OK; + } + else +#endif + { + zi->ci.stream.next_in = (Bytef*)buf; + zi->ci.stream.avail_in = len; + + while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0)) + { + if (zi->ci.stream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + } + + + if(err != ZIP_OK) + break; + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + uLong uTotalOutBefore = zi->ci.stream.total_out; + err=deflate(&zi->ci.stream, Z_NO_FLUSH); + if(uTotalOutBefore > zi->ci.stream.total_out) + { + int bBreak = 0; + bBreak++; + } + + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; + } + else + { + uInt copy_this,i; + if (zi->ci.stream.avail_in < zi->ci.stream.avail_out) + copy_this = zi->ci.stream.avail_in; + else + copy_this = zi->ci.stream.avail_out; + + for (i = 0; i < copy_this; i++) + *(((char*)zi->ci.stream.next_out)+i) = + *(((const char*)zi->ci.stream.next_in)+i); + { + zi->ci.stream.avail_in -= copy_this; + zi->ci.stream.avail_out-= copy_this; + zi->ci.stream.next_in+= copy_this; + zi->ci.stream.next_out+= copy_this; + zi->ci.stream.total_in+= copy_this; + zi->ci.stream.total_out+= copy_this; + zi->ci.pos_in_buffered_data += copy_this; + } + } + }// while(...) + } + + return err; +} + +extern int ZEXPORT zipCloseFileInZipRaw (zipFile file, uLong uncompressed_size, uLong crc32) +{ + return zipCloseFileInZipRaw64 (file, uncompressed_size, crc32); +} + +extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_size, uLong crc32) +{ + zip64_internal* zi; + ZPOS64_T compressed_size; + uLong invalidValue = 0xffffffff; + short datasize = 0; + int err=ZIP_OK; + + if (file == NULL) + return ZIP_PARAMERROR; + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 0) + return ZIP_PARAMERROR; + zi->ci.stream.avail_in = 0; + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + while (err==ZIP_OK) + { + uLong uTotalOutBefore; + if (zi->ci.stream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + } + uTotalOutBefore = zi->ci.stream.total_out; + err=deflate(&zi->ci.stream, Z_FINISH); + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; + } + } + else if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) + { +#ifdef HAVE_BZIP2 + err = BZ_FINISH_OK; + while (err==BZ_FINISH_OK) + { + uLong uTotalOutBefore; + if (zi->ci.bstream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; + } + uTotalOutBefore = zi->ci.bstream.total_out_lo32; + err=BZ2_bzCompress(&zi->ci.bstream, BZ_FINISH); + if(err == BZ_STREAM_END) + err = Z_STREAM_END; + + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore); + } + + if(err == BZ_FINISH_OK) + err = ZIP_OK; +#endif + } + + if (err==Z_STREAM_END) + err=ZIP_OK; /* this is normal */ + + if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK)) + { + if (zip64FlushWriteBuffer(zi)==ZIP_ERRNO) + err = ZIP_ERRNO; + } + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + int tmp_err = deflateEnd(&zi->ci.stream); + if (err == ZIP_OK) + err = tmp_err; + zi->ci.stream_initialised = 0; + } +#ifdef HAVE_BZIP2 + else if((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) + { + int tmperr = BZ2_bzCompressEnd(&zi->ci.bstream); + if (err==ZIP_OK) + err = tmperr; + zi->ci.stream_initialised = 0; + } +#endif + + if (!zi->ci.raw) + { + crc32 = (uLong)zi->ci.crc32; + uncompressed_size = zi->ci.totalUncompressedData; + } + compressed_size = zi->ci.totalCompressedData; + +# ifndef NOCRYPT + compressed_size += zi->ci.crypt_header_size; +# endif + + // update Current Item crc and sizes, + if(compressed_size >= 0xffffffff || uncompressed_size >= 0xffffffff || zi->ci.pos_local_header >= 0xffffffff) + { + /*version Made by*/ + zip64local_putValue_inmemory(zi->ci.central_header+4,(uLong)45,2); + /*version needed*/ + zip64local_putValue_inmemory(zi->ci.central_header+6,(uLong)45,2); + + } + + zip64local_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/ + + + if(compressed_size >= 0xffffffff) + zip64local_putValue_inmemory(zi->ci.central_header+20, invalidValue,4); /*compr size*/ + else + zip64local_putValue_inmemory(zi->ci.central_header+20, compressed_size,4); /*compr size*/ + + /// set internal file attributes field + if (zi->ci.stream.data_type == Z_ASCII) + zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2); + + if(uncompressed_size >= 0xffffffff) + zip64local_putValue_inmemory(zi->ci.central_header+24, invalidValue,4); /*uncompr size*/ + else + zip64local_putValue_inmemory(zi->ci.central_header+24, uncompressed_size,4); /*uncompr size*/ + + // Add ZIP64 extra info field for uncompressed size + if(uncompressed_size >= 0xffffffff) + datasize += 8; + + // Add ZIP64 extra info field for compressed size + if(compressed_size >= 0xffffffff) + datasize += 8; + + // Add ZIP64 extra info field for relative offset to local file header of current file + if(zi->ci.pos_local_header >= 0xffffffff) + datasize += 8; + + if(datasize > 0) + { + char* p = NULL; + + if((uLong)(datasize + 4) > zi->ci.size_centralExtraFree) + { + // we can not write more data to the buffer that we have room for. + return ZIP_BADZIPFILE; + } + + p = zi->ci.central_header + zi->ci.size_centralheader; + + // Add Extra Information Header for 'ZIP64 information' + zip64local_putValue_inmemory(p, 0x0001, 2); // HeaderID + p += 2; + zip64local_putValue_inmemory(p, datasize, 2); // DataSize + p += 2; + + if(uncompressed_size >= 0xffffffff) + { + zip64local_putValue_inmemory(p, uncompressed_size, 8); + p += 8; + } + + if(compressed_size >= 0xffffffff) + { + zip64local_putValue_inmemory(p, compressed_size, 8); + p += 8; + } + + if(zi->ci.pos_local_header >= 0xffffffff) + { + zip64local_putValue_inmemory(p, zi->ci.pos_local_header, 8); + p += 8; + } + + // Update how much extra free space we got in the memory buffer + // and increase the centralheader size so the new ZIP64 fields are included + // ( 4 below is the size of HeaderID and DataSize field ) + zi->ci.size_centralExtraFree -= datasize + 4; + zi->ci.size_centralheader += datasize + 4; + + // Update the extra info size field + zi->ci.size_centralExtra += datasize + 4; + zip64local_putValue_inmemory(zi->ci.central_header+30,(uLong)zi->ci.size_centralExtra,2); + } + + if (err==ZIP_OK) + err = add_data_in_datablock(&zi->central_dir, zi->ci.central_header, (uLong)zi->ci.size_centralheader); + + free(zi->ci.central_header); + + if (err==ZIP_OK) + { + // Update the LocalFileHeader with the new values. + + ZPOS64_T cur_pos_inzip = ZTELL64(zi->z_filefunc,zi->filestream); + + if (ZSEEK64(zi->z_filefunc,zi->filestream, zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */ + + if(uncompressed_size >= 0xffffffff || compressed_size >= 0xffffffff ) + { + if(zi->ci.pos_zip64extrainfo > 0) + { + // Update the size in the ZIP64 extended field. + if (ZSEEK64(zi->z_filefunc,zi->filestream, zi->ci.pos_zip64extrainfo + 4,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + + if (err==ZIP_OK) /* compressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, uncompressed_size, 8); + + if (err==ZIP_OK) /* uncompressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, compressed_size, 8); + } + else + err = ZIP_BADZIPFILE; // Caller passed zip64 = 0, so no room for zip64 info -> fatal + } + else + { + if (err==ZIP_OK) /* compressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4); + + if (err==ZIP_OK) /* uncompressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4); + } + + if (ZSEEK64(zi->z_filefunc,zi->filestream, cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + } + + zi->number_entry ++; + zi->in_opened_file_inzip = 0; + + return err; +} + +extern int ZEXPORT zipCloseFileInZip (zipFile file) +{ + return zipCloseFileInZipRaw (file,0,0); +} + +int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip) +{ + int err = ZIP_OK; + ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writing_offset; + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ZIP64ENDLOCHEADERMAGIC,4); + + /*num disks*/ + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); + + /*relative offset*/ + if (err==ZIP_OK) /* Relative offset to the Zip64EndOfCentralDirectory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, pos,8); + + /*total disks*/ /* Do not support spawning of disk so always say 1 here*/ + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)1,4); + + return err; +} + +int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) +{ + int err = ZIP_OK; + + uLong Zip64DataSize = 44; + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ZIP64ENDHEADERMAGIC,4); + + if (err==ZIP_OK) /* size of this 'zip64 end of central directory' */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(ZPOS64_T)Zip64DataSize,8); // why ZPOS64_T of this ? + + if (err==ZIP_OK) /* version made by */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2); + + if (err==ZIP_OK) /* version needed */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2); + + if (err==ZIP_OK) /* number of this disk */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); + + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); + + if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8); + + if (err==ZIP_OK) /* total number of entries in the central dir */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8); + + if (err==ZIP_OK) /* size of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(ZPOS64_T)size_centraldir,8); + + if (err==ZIP_OK) /* offset of start of central directory with respect to the starting disk number */ + { + ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writing_offset; + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (ZPOS64_T)pos,8); + } + return err; +} +int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) +{ + int err = ZIP_OK; + + /*signature*/ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4); + + if (err==ZIP_OK) /* number of this disk */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); + + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); + + if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ + { + { + if(zi->number_entry >= 0xFFFF) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xffff,2); // use value in ZIP64 record + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); + } + } + + if (err==ZIP_OK) /* total number of entries in the central dir */ + { + if(zi->number_entry >= 0xFFFF) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xffff,2); // use value in ZIP64 record + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); + } + + if (err==ZIP_OK) /* size of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4); + + if (err==ZIP_OK) /* offset of start of central directory with respect to the starting disk number */ + { + ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writing_offset; + if(pos >= 0xffffffff) + { + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (uLong)0xffffffff,4); + } + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (uLong)(centraldir_pos_inzip - zi->add_position_when_writing_offset),4); + } + + return err; +} + +int Write_GlobalComment(zip64_internal* zi, const char* global_comment) +{ + int err = ZIP_OK; + uInt size_global_comment = 0; + + if(global_comment != NULL) + size_global_comment = (uInt)strlen(global_comment); + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2); + + if (err == ZIP_OK && size_global_comment > 0) + { + if (ZWRITE64(zi->z_filefunc,zi->filestream, global_comment, size_global_comment) != size_global_comment) + err = ZIP_ERRNO; + } + return err; +} + +extern int ZEXPORT zipClose (zipFile file, const char* global_comment) +{ + zip64_internal* zi; + int err = 0; + uLong size_centraldir = 0; + ZPOS64_T centraldir_pos_inzip; + ZPOS64_T pos; + + if (file == NULL) + return ZIP_PARAMERROR; + + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 1) + { + err = zipCloseFileInZip (file); + } + +#ifndef NO_ADDFILEINEXISTINGZIP + if (global_comment==NULL) + global_comment = zi->globalcomment; +#endif + + centraldir_pos_inzip = ZTELL64(zi->z_filefunc,zi->filestream); + + if (err==ZIP_OK) + { + linkedlist_datablock_internal* ldi = zi->central_dir.first_block; + while (ldi!=NULL) + { + if ((err==ZIP_OK) && (ldi->filled_in_this_block>0)) + { + if (ZWRITE64(zi->z_filefunc,zi->filestream, ldi->data, ldi->filled_in_this_block) != ldi->filled_in_this_block) + err = ZIP_ERRNO; + } + + size_centraldir += ldi->filled_in_this_block; + ldi = ldi->next_datablock; + } + } + free_linkedlist(&(zi->central_dir)); + + pos = centraldir_pos_inzip - zi->add_position_when_writing_offset; + if(pos >= 0xffffffff || zi->number_entry > 0xFFFF) + { + ZPOS64_T Zip64EOCDpos = ZTELL64(zi->z_filefunc,zi->filestream); + Write_Zip64EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip); + + Write_Zip64EndOfCentralDirectoryLocator(zi, Zip64EOCDpos); + } + + if (err==ZIP_OK) + err = Write_EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip); + + if(err == ZIP_OK) + err = Write_GlobalComment(zi, global_comment); + + if (ZCLOSE64(zi->z_filefunc,zi->filestream) != 0) + if (err == ZIP_OK) + err = ZIP_ERRNO; + +#ifndef NO_ADDFILEINEXISTINGZIP + TRYFREE(zi->globalcomment); +#endif + TRYFREE(zi); + + return err; +} + +extern int ZEXPORT zipRemoveExtraInfoBlock (char* pData, int* dataLen, short sHeader) +{ + char* p = pData; + int size = 0; + char* pNewHeader; + char* pTmp; + short header; + short dataSize; + + int retVal = ZIP_OK; + + if(pData == NULL || *dataLen < 4) + return ZIP_PARAMERROR; + + pNewHeader = (char*)ALLOC(*dataLen); + pTmp = pNewHeader; + + while(p < (pData + *dataLen)) + { + header = *(short*)p; + dataSize = *(((short*)p)+1); + + if( header == sHeader ) // Header found. + { + p += dataSize + 4; // skip it. do not copy to temp buffer + } + else + { + // Extra Info block should not be removed, So copy it to the temp buffer. + memcpy(pTmp, p, dataSize + 4); + p += dataSize + 4; + size += dataSize + 4; + } + + } + + if(size < *dataLen) + { + // clean old extra info block. + memset(pData,0, *dataLen); + + // copy the new extra info block over the old + if(size > 0) + memcpy(pData, pNewHeader, size); + + // set the new extra info size + *dataLen = size; + + retVal = ZIP_OK; + } + else + retVal = ZIP_ERRNO; + + TRYFREE(pNewHeader); + + return retVal; +} diff --git a/externe_kniznice/zlib/contrib/minizip/zip.h b/externe_kniznice/zlib/contrib/minizip/zip.h new file mode 100644 index 0000000..8aaebb6 --- /dev/null +++ b/externe_kniznice/zlib/contrib/minizip/zip.h @@ -0,0 +1,362 @@ +/* zip.h -- IO on .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + --------------------------------------------------------------------------- + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + --------------------------------------------------------------------------- + + Changes + + See header of zip.h + +*/ + +#ifndef _zip12_H +#define _zip12_H + +#ifdef __cplusplus +extern "C" { +#endif + +//#define HAVE_BZIP2 + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#ifndef _ZLIBIOAPI_H +#include "ioapi.h" +#endif + +#ifdef HAVE_BZIP2 +#include "bzlib.h" +#endif + +#define Z_BZIP2ED 12 + +#if defined(STRICTZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagzipFile__ { int unused; } zipFile__; +typedef zipFile__ *zipFile; +#else +typedef voidp zipFile; +#endif + +#define ZIP_OK (0) +#define ZIP_EOF (0) +#define ZIP_ERRNO (Z_ERRNO) +#define ZIP_PARAMERROR (-102) +#define ZIP_BADZIPFILE (-103) +#define ZIP_INTERNALERROR (-104) + +#ifndef DEF_MEM_LEVEL +# if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +# else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +# endif +#endif +/* default memLevel */ + +/* tm_zip contain date/time info */ +typedef struct tm_zip_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_zip; + +typedef struct +{ + tm_zip tmz_date; /* date in understandable format */ + uLong dosDate; /* if dos_date == 0, tmu_date is used */ +/* uLong flag; */ /* general purpose bit flag 2 bytes */ + + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ +} zip_fileinfo; + +typedef const char* zipcharpc; + + +#define APPEND_STATUS_CREATE (0) +#define APPEND_STATUS_CREATEAFTER (1) +#define APPEND_STATUS_ADDINZIP (2) + +extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append)); +extern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append)); +/* + Create a zipfile. + pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on + an Unix computer "zlib/zlib113.zip". + if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip + will be created at the end of the file. + (useful if the file contain a self extractor code) + if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will + add files in existing zip (be sure you don't add file that doesn't exist) + If the zipfile cannot be opened, the return value is NULL. + Else, the return value is a zipFile Handle, usable with other function + of this zip package. +*/ + +/* Note : there is no delete function into a zipfile. + If you want delete file into a zipfile, you must open a zipfile, and create another + Of couse, you can use RAW reading and writing to copy the file you did not want delte +*/ + +extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc_def* pzlib_filefunc_def)); + +extern zipFile ZEXPORT zipOpen2_64 OF((const void *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc64_def* pzlib_filefunc_def)); + +extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level)); + +extern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int zip64)); + +/* + Open a file in the ZIP for writing. + filename : the filename in zip (if NULL, '-' without quote will be used + *zipfi contain supplemental information + if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local + contains the extrafield data the the local header + if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global + contains the extrafield data the the local header + if comment != NULL, comment contain the comment string + method contain the compression method (0 for store, Z_DEFLATED for deflate) + level contain the level of compression (can be Z_DEFAULT_COMPRESSION) + zip64 is set to 1 if a zip64 extended information block should be added to the local file header. + this MUST be '1' if the uncompressed size is >= 0xffffffff. + +*/ + + +extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw)); + + +extern int ZEXPORT zipOpenNewFileInZip2_64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int zip64)); +/* + Same than zipOpenNewFileInZip, except if raw=1, we write raw file + */ + +extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting)); + +extern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + int zip64 + )); + +/* + Same than zipOpenNewFileInZip2, except + windowBits,memLevel,,strategy : see parameter strategy in deflateInit2 + password : crypting password (NULL for no crypting) + crcForCrypting : crc of file to compress (needed for crypting) + */ + +extern int ZEXPORT zipOpenNewFileInZip4 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + uLong versionMadeBy, + uLong flagBase + )); + + +extern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + uLong versionMadeBy, + uLong flagBase, + int zip64 + )); +/* + Same than zipOpenNewFileInZip4, except + versionMadeBy : value for Version made by field + flag : value for flag field (compression level info will be added) + */ + + +extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, + const void* buf, + unsigned len)); +/* + Write data in the zipfile +*/ + +extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); +/* + Close the current file in the zipfile +*/ + +extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, + uLong uncompressed_size, + uLong crc32)); + +extern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file, + ZPOS64_T uncompressed_size, + uLong crc32)); + +/* + Close the current file in the zipfile, for file opened with + parameter raw=1 in zipOpenNewFileInZip2 + uncompressed_size and crc32 are value for the uncompressed size +*/ + +extern int ZEXPORT zipClose OF((zipFile file, + const char* global_comment)); +/* + Close the zipfile +*/ + + +extern int ZEXPORT zipRemoveExtraInfoBlock OF((char* pData, int* dataLen, short sHeader)); +/* + zipRemoveExtraInfoBlock - Added by Mathias Svensson + + Remove extra information block from a extra information data for the local file header or central directory header + + It is needed to remove ZIP64 extra information blocks when before data is written if using RAW mode. + + 0x0001 is the signature header for the ZIP64 extra information blocks + + usage. + Remove ZIP64 Extra information from a central director extra field data + zipRemoveExtraInfoBlock(pCenDirExtraFieldData, &nCenDirExtraFieldDataLen, 0x0001); + + Remove ZIP64 Extra information from a Local File Header extra field data + zipRemoveExtraInfoBlock(pLocalHeaderExtraFieldData, &nLocalHeaderExtraFieldDataLen, 0x0001); +*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _zip64_H */ diff --git a/externe_kniznice/zlib/contrib/pascal/example.pas b/externe_kniznice/zlib/contrib/pascal/example.pas new file mode 100644 index 0000000..5518b36 --- /dev/null +++ b/externe_kniznice/zlib/contrib/pascal/example.pas @@ -0,0 +1,599 @@ +(* example.c -- usage example of the zlib compression library + * Copyright (C) 1995-2003 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Pascal translation + * Copyright (C) 1998 by Jacques Nomssi Nzali. + * For conditions of distribution and use, see copyright notice in readme.txt + * + * Adaptation to the zlibpas interface + * Copyright (C) 2003 by Cosmin Truta. + * For conditions of distribution and use, see copyright notice in readme.txt + *) + +program example; + +{$DEFINE TEST_COMPRESS} +{DO NOT $DEFINE TEST_GZIO} +{$DEFINE TEST_DEFLATE} +{$DEFINE TEST_INFLATE} +{$DEFINE TEST_FLUSH} +{$DEFINE TEST_SYNC} +{$DEFINE TEST_DICT} + +uses SysUtils, zlibpas; + +const TESTFILE = 'foo.gz'; + +(* "hello world" would be more standard, but the repeated "hello" + * stresses the compression code better, sorry... + *) +const hello: PChar = 'hello, hello!'; + +const dictionary: PChar = 'hello'; + +var dictId: LongInt; (* Adler32 value of the dictionary *) + +procedure CHECK_ERR(err: Integer; msg: String); +begin + if err <> Z_OK then + begin + WriteLn(msg, ' error: ', err); + Halt(1); + end; +end; + +procedure EXIT_ERR(const msg: String); +begin + WriteLn('Error: ', msg); + Halt(1); +end; + +(* =========================================================================== + * Test compress and uncompress + *) +{$IFDEF TEST_COMPRESS} +procedure test_compress(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var err: Integer; + len: LongInt; +begin + len := StrLen(hello)+1; + + err := compress(compr, comprLen, hello, len); + CHECK_ERR(err, 'compress'); + + StrCopy(PChar(uncompr), 'garbage'); + + err := uncompress(uncompr, uncomprLen, compr, comprLen); + CHECK_ERR(err, 'uncompress'); + + if StrComp(PChar(uncompr), hello) <> 0 then + EXIT_ERR('bad uncompress') + else + WriteLn('uncompress(): ', PChar(uncompr)); +end; +{$ENDIF} + +(* =========================================================================== + * Test read/write of .gz files + *) +{$IFDEF TEST_GZIO} +procedure test_gzio(const fname: PChar; (* compressed file name *) + uncompr: Pointer; + uncomprLen: LongInt); +var err: Integer; + len: Integer; + zfile: gzFile; + pos: LongInt; +begin + len := StrLen(hello)+1; + + zfile := gzopen(fname, 'wb'); + if zfile = NIL then + begin + WriteLn('gzopen error'); + Halt(1); + end; + gzputc(zfile, 'h'); + if gzputs(zfile, 'ello') <> 4 then + begin + WriteLn('gzputs err: ', gzerror(zfile, err)); + Halt(1); + end; + {$IFDEF GZ_FORMAT_STRING} + if gzprintf(zfile, ', %s!', 'hello') <> 8 then + begin + WriteLn('gzprintf err: ', gzerror(zfile, err)); + Halt(1); + end; + {$ELSE} + if gzputs(zfile, ', hello!') <> 8 then + begin + WriteLn('gzputs err: ', gzerror(zfile, err)); + Halt(1); + end; + {$ENDIF} + gzseek(zfile, 1, SEEK_CUR); (* add one zero byte *) + gzclose(zfile); + + zfile := gzopen(fname, 'rb'); + if zfile = NIL then + begin + WriteLn('gzopen error'); + Halt(1); + end; + + StrCopy(PChar(uncompr), 'garbage'); + + if gzread(zfile, uncompr, uncomprLen) <> len then + begin + WriteLn('gzread err: ', gzerror(zfile, err)); + Halt(1); + end; + if StrComp(PChar(uncompr), hello) <> 0 then + begin + WriteLn('bad gzread: ', PChar(uncompr)); + Halt(1); + end + else + WriteLn('gzread(): ', PChar(uncompr)); + + pos := gzseek(zfile, -8, SEEK_CUR); + if (pos <> 6) or (gztell(zfile) <> pos) then + begin + WriteLn('gzseek error, pos=', pos, ', gztell=', gztell(zfile)); + Halt(1); + end; + + if gzgetc(zfile) <> ' ' then + begin + WriteLn('gzgetc error'); + Halt(1); + end; + + if gzungetc(' ', zfile) <> ' ' then + begin + WriteLn('gzungetc error'); + Halt(1); + end; + + gzgets(zfile, PChar(uncompr), uncomprLen); + uncomprLen := StrLen(PChar(uncompr)); + if uncomprLen <> 7 then (* " hello!" *) + begin + WriteLn('gzgets err after gzseek: ', gzerror(zfile, err)); + Halt(1); + end; + if StrComp(PChar(uncompr), hello + 6) <> 0 then + begin + WriteLn('bad gzgets after gzseek'); + Halt(1); + end + else + WriteLn('gzgets() after gzseek: ', PChar(uncompr)); + + gzclose(zfile); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with small buffers + *) +{$IFDEF TEST_DEFLATE} +procedure test_deflate(compr: Pointer; comprLen: LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; + len: LongInt; +begin + len := StrLen(hello)+1; + + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, 'deflateInit'); + + c_stream.next_in := hello; + c_stream.next_out := compr; + + while (c_stream.total_in <> len) and + (c_stream.total_out < comprLen) do + begin + c_stream.avail_out := 1; { force small buffers } + c_stream.avail_in := 1; + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + end; + + (* Finish the stream, still forcing small buffers: *) + while TRUE do + begin + c_stream.avail_out := 1; + err := deflate(c_stream, Z_FINISH); + if err = Z_STREAM_END then + break; + CHECK_ERR(err, 'deflate'); + end; + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); +end; +{$ENDIF} + +(* =========================================================================== + * Test inflate with small buffers + *) +{$IFDEF TEST_INFLATE} +procedure test_inflate(compr: Pointer; comprLen : LongInt; + uncompr: Pointer; uncomprLen : LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := 0; + d_stream.next_out := uncompr; + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + while (d_stream.total_out < uncomprLen) and + (d_stream.total_in < comprLen) do + begin + d_stream.avail_out := 1; (* force small buffers *) + d_stream.avail_in := 1; + err := inflate(d_stream, Z_NO_FLUSH); + if err = Z_STREAM_END then + break; + CHECK_ERR(err, 'inflate'); + end; + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + if StrComp(PChar(uncompr), hello) <> 0 then + EXIT_ERR('bad inflate') + else + WriteLn('inflate(): ', PChar(uncompr)); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with large buffers and dynamic change of compression level + *) +{$IFDEF TEST_DEFLATE} +procedure test_large_deflate(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; +begin + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_BEST_SPEED); + CHECK_ERR(err, 'deflateInit'); + + c_stream.next_out := compr; + c_stream.avail_out := Integer(comprLen); + + (* At this point, uncompr is still mostly zeroes, so it should compress + * very well: + *) + c_stream.next_in := uncompr; + c_stream.avail_in := Integer(uncomprLen); + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + if c_stream.avail_in <> 0 then + EXIT_ERR('deflate not greedy'); + + (* Feed in already compressed data and switch to no compression: *) + deflateParams(c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); + c_stream.next_in := compr; + c_stream.avail_in := Integer(comprLen div 2); + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + + (* Switch back to compressing mode: *) + deflateParams(c_stream, Z_BEST_COMPRESSION, Z_FILTERED); + c_stream.next_in := uncompr; + c_stream.avail_in := Integer(uncomprLen); + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + + err := deflate(c_stream, Z_FINISH); + if err <> Z_STREAM_END then + EXIT_ERR('deflate should report Z_STREAM_END'); + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); +end; +{$ENDIF} + +(* =========================================================================== + * Test inflate with large buffers + *) +{$IFDEF TEST_INFLATE} +procedure test_large_inflate(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := Integer(comprLen); + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + while TRUE do + begin + d_stream.next_out := uncompr; (* discard the output *) + d_stream.avail_out := Integer(uncomprLen); + err := inflate(d_stream, Z_NO_FLUSH); + if err = Z_STREAM_END then + break; + CHECK_ERR(err, 'large inflate'); + end; + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + if d_stream.total_out <> 2 * uncomprLen + comprLen div 2 then + begin + WriteLn('bad large inflate: ', d_stream.total_out); + Halt(1); + end + else + WriteLn('large_inflate(): OK'); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with full flush + *) +{$IFDEF TEST_FLUSH} +procedure test_flush(compr: Pointer; var comprLen : LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; + len: Integer; +begin + len := StrLen(hello)+1; + + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, 'deflateInit'); + + c_stream.next_in := hello; + c_stream.next_out := compr; + c_stream.avail_in := 3; + c_stream.avail_out := Integer(comprLen); + err := deflate(c_stream, Z_FULL_FLUSH); + CHECK_ERR(err, 'deflate'); + + Inc(PByteArray(compr)^[3]); (* force an error in first compressed block *) + c_stream.avail_in := len - 3; + + err := deflate(c_stream, Z_FINISH); + if err <> Z_STREAM_END then + CHECK_ERR(err, 'deflate'); + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); + + comprLen := c_stream.total_out; +end; +{$ENDIF} + +(* =========================================================================== + * Test inflateSync() + *) +{$IFDEF TEST_SYNC} +procedure test_sync(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen : LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := 2; (* just read the zlib header *) + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + d_stream.next_out := uncompr; + d_stream.avail_out := Integer(uncomprLen); + + inflate(d_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'inflate'); + + d_stream.avail_in := Integer(comprLen-2); (* read all compressed data *) + err := inflateSync(d_stream); (* but skip the damaged part *) + CHECK_ERR(err, 'inflateSync'); + + err := inflate(d_stream, Z_FINISH); + if err <> Z_DATA_ERROR then + EXIT_ERR('inflate should report DATA_ERROR'); + (* Because of incorrect adler32 *) + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + WriteLn('after inflateSync(): hel', PChar(uncompr)); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with preset dictionary + *) +{$IFDEF TEST_DICT} +procedure test_dict_deflate(compr: Pointer; comprLen: LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; +begin + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_BEST_COMPRESSION); + CHECK_ERR(err, 'deflateInit'); + + err := deflateSetDictionary(c_stream, dictionary, StrLen(dictionary)); + CHECK_ERR(err, 'deflateSetDictionary'); + + dictId := c_stream.adler; + c_stream.next_out := compr; + c_stream.avail_out := Integer(comprLen); + + c_stream.next_in := hello; + c_stream.avail_in := StrLen(hello)+1; + + err := deflate(c_stream, Z_FINISH); + if err <> Z_STREAM_END then + EXIT_ERR('deflate should report Z_STREAM_END'); + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); +end; +{$ENDIF} + +(* =========================================================================== + * Test inflate with a preset dictionary + *) +{$IFDEF TEST_DICT} +procedure test_dict_inflate(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := Integer(comprLen); + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + d_stream.next_out := uncompr; + d_stream.avail_out := Integer(uncomprLen); + + while TRUE do + begin + err := inflate(d_stream, Z_NO_FLUSH); + if err = Z_STREAM_END then + break; + if err = Z_NEED_DICT then + begin + if d_stream.adler <> dictId then + EXIT_ERR('unexpected dictionary'); + err := inflateSetDictionary(d_stream, dictionary, StrLen(dictionary)); + end; + CHECK_ERR(err, 'inflate with dict'); + end; + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + if StrComp(PChar(uncompr), hello) <> 0 then + EXIT_ERR('bad inflate with dict') + else + WriteLn('inflate with dictionary: ', PChar(uncompr)); +end; +{$ENDIF} + +var compr, uncompr: Pointer; + comprLen, uncomprLen: LongInt; + +begin + if zlibVersion^ <> ZLIB_VERSION[1] then + EXIT_ERR('Incompatible zlib version'); + + WriteLn('zlib version: ', zlibVersion); + WriteLn('zlib compile flags: ', Format('0x%x', [zlibCompileFlags])); + + comprLen := 10000 * SizeOf(Integer); (* don't overflow on MSDOS *) + uncomprLen := comprLen; + GetMem(compr, comprLen); + GetMem(uncompr, uncomprLen); + if (compr = NIL) or (uncompr = NIL) then + EXIT_ERR('Out of memory'); + (* compr and uncompr are cleared to avoid reading uninitialized + * data and to ensure that uncompr compresses well. + *) + FillChar(compr^, comprLen, 0); + FillChar(uncompr^, uncomprLen, 0); + + {$IFDEF TEST_COMPRESS} + WriteLn('** Testing compress'); + test_compress(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_GZIO} + WriteLn('** Testing gzio'); + if ParamCount >= 1 then + test_gzio(ParamStr(1), uncompr, uncomprLen) + else + test_gzio(TESTFILE, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_DEFLATE} + WriteLn('** Testing deflate with small buffers'); + test_deflate(compr, comprLen); + {$ENDIF} + {$IFDEF TEST_INFLATE} + WriteLn('** Testing inflate with small buffers'); + test_inflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_DEFLATE} + WriteLn('** Testing deflate with large buffers'); + test_large_deflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + {$IFDEF TEST_INFLATE} + WriteLn('** Testing inflate with large buffers'); + test_large_inflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_FLUSH} + WriteLn('** Testing deflate with full flush'); + test_flush(compr, comprLen); + {$ENDIF} + {$IFDEF TEST_SYNC} + WriteLn('** Testing inflateSync'); + test_sync(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + comprLen := uncomprLen; + + {$IFDEF TEST_DICT} + WriteLn('** Testing deflate and inflate with preset dictionary'); + test_dict_deflate(compr, comprLen); + test_dict_inflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + FreeMem(compr, comprLen); + FreeMem(uncompr, uncomprLen); +end. diff --git a/externe_kniznice/zlib/contrib/pascal/readme.txt b/externe_kniznice/zlib/contrib/pascal/readme.txt new file mode 100644 index 0000000..60e87c8 --- /dev/null +++ b/externe_kniznice/zlib/contrib/pascal/readme.txt @@ -0,0 +1,76 @@ + +This directory contains a Pascal (Delphi, Kylix) interface to the +zlib data compression library. + + +Directory listing +================= + +zlibd32.mak makefile for Borland C++ +example.pas usage example of zlib +zlibpas.pas the Pascal interface to zlib +readme.txt this file + + +Compatibility notes +=================== + +- Although the name "zlib" would have been more normal for the + zlibpas unit, this name is already taken by Borland's ZLib unit. + This is somehow unfortunate, because that unit is not a genuine + interface to the full-fledged zlib functionality, but a suite of + class wrappers around zlib streams. Other essential features, + such as checksums, are missing. + It would have been more appropriate for that unit to have a name + like "ZStreams", or something similar. + +- The C and zlib-supplied types int, uInt, long, uLong, etc. are + translated directly into Pascal types of similar sizes (Integer, + LongInt, etc.), to avoid namespace pollution. In particular, + there is no conversion of unsigned int into a Pascal unsigned + integer. The Word type is non-portable and has the same size + (16 bits) both in a 16-bit and in a 32-bit environment, unlike + Integer. Even if there is a 32-bit Cardinal type, there is no + real need for unsigned int in zlib under a 32-bit environment. + +- Except for the callbacks, the zlib function interfaces are + assuming the calling convention normally used in Pascal + (__pascal for DOS and Windows16, __fastcall for Windows32). + Since the cdecl keyword is used, the old Turbo Pascal does + not work with this interface. + +- The gz* function interfaces are not translated, to avoid + interfacing problems with the C runtime library. Besides, + gzprintf(gzFile file, const char *format, ...) + cannot be translated into Pascal. + + +Legal issues +============ + +The zlibpas interface is: + Copyright (C) 1995-2003 Jean-loup Gailly and Mark Adler. + Copyright (C) 1998 by Bob Dellaca. + Copyright (C) 2003 by Cosmin Truta. + +The example program is: + Copyright (C) 1995-2003 by Jean-loup Gailly. + Copyright (C) 1998,1999,2000 by Jacques Nomssi Nzali. + Copyright (C) 2003 by Cosmin Truta. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + diff --git a/externe_kniznice/zlib/contrib/pascal/zlibd32.mak b/externe_kniznice/zlib/contrib/pascal/zlibd32.mak new file mode 100644 index 0000000..9bb00b7 --- /dev/null +++ b/externe_kniznice/zlib/contrib/pascal/zlibd32.mak @@ -0,0 +1,99 @@ +# Makefile for zlib +# For use with Delphi and C++ Builder under Win32 +# Updated for zlib 1.2.x by Cosmin Truta + +# ------------ Borland C++ ------------ + +# This project uses the Delphi (fastcall/register) calling convention: +LOC = -DZEXPORT=__fastcall -DZEXPORTVA=__cdecl + +CC = bcc32 +LD = bcc32 +AR = tlib +# do not use "-pr" in CFLAGS +CFLAGS = -a -d -k- -O2 $(LOC) +LDFLAGS = + + +# variables +ZLIB_LIB = zlib.lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj +OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: test/example.c zlib.h zconf.h + +minigzip.obj: test/minigzip.c zlib.h zconf.h + + +# For the sake of the old Borland make, +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + + +# testing +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + + +# cleanup +clean: + -del *.obj + -del *.exe + -del *.lib + -del *.tds + -del zlib.bak + -del foo.gz + diff --git a/externe_kniznice/zlib/contrib/pascal/zlibpas.pas b/externe_kniznice/zlib/contrib/pascal/zlibpas.pas new file mode 100644 index 0000000..a0dff11 --- /dev/null +++ b/externe_kniznice/zlib/contrib/pascal/zlibpas.pas @@ -0,0 +1,276 @@ +(* zlibpas -- Pascal interface to the zlib data compression library + * + * Copyright (C) 2003 Cosmin Truta. + * Derived from original sources by Bob Dellaca. + * For conditions of distribution and use, see copyright notice in readme.txt + *) + +unit zlibpas; + +interface + +const + ZLIB_VERSION = '1.2.11'; + ZLIB_VERNUM = $12a0; + +type + alloc_func = function(opaque: Pointer; items, size: Integer): Pointer; + cdecl; + free_func = procedure(opaque, address: Pointer); + cdecl; + + in_func = function(opaque: Pointer; var buf: PByte): Integer; + cdecl; + out_func = function(opaque: Pointer; buf: PByte; size: Integer): Integer; + cdecl; + + z_streamp = ^z_stream; + z_stream = packed record + next_in: PChar; (* next input byte *) + avail_in: Integer; (* number of bytes available at next_in *) + total_in: LongInt; (* total nb of input bytes read so far *) + + next_out: PChar; (* next output byte should be put there *) + avail_out: Integer; (* remaining free space at next_out *) + total_out: LongInt; (* total nb of bytes output so far *) + + msg: PChar; (* last error message, NULL if no error *) + state: Pointer; (* not visible by applications *) + + zalloc: alloc_func; (* used to allocate the internal state *) + zfree: free_func; (* used to free the internal state *) + opaque: Pointer; (* private data object passed to zalloc and zfree *) + + data_type: Integer; (* best guess about the data type: ascii or binary *) + adler: LongInt; (* adler32 value of the uncompressed data *) + reserved: LongInt; (* reserved for future use *) + end; + + gz_headerp = ^gz_header; + gz_header = packed record + text: Integer; (* true if compressed data believed to be text *) + time: LongInt; (* modification time *) + xflags: Integer; (* extra flags (not used when writing a gzip file) *) + os: Integer; (* operating system *) + extra: PChar; (* pointer to extra field or Z_NULL if none *) + extra_len: Integer; (* extra field length (valid if extra != Z_NULL) *) + extra_max: Integer; (* space at extra (only when reading header) *) + name: PChar; (* pointer to zero-terminated file name or Z_NULL *) + name_max: Integer; (* space at name (only when reading header) *) + comment: PChar; (* pointer to zero-terminated comment or Z_NULL *) + comm_max: Integer; (* space at comment (only when reading header) *) + hcrc: Integer; (* true if there was or will be a header crc *) + done: Integer; (* true when done reading gzip header *) + end; + +(* constants *) +const + Z_NO_FLUSH = 0; + Z_PARTIAL_FLUSH = 1; + Z_SYNC_FLUSH = 2; + Z_FULL_FLUSH = 3; + Z_FINISH = 4; + Z_BLOCK = 5; + Z_TREES = 6; + + Z_OK = 0; + Z_STREAM_END = 1; + Z_NEED_DICT = 2; + Z_ERRNO = -1; + Z_STREAM_ERROR = -2; + Z_DATA_ERROR = -3; + Z_MEM_ERROR = -4; + Z_BUF_ERROR = -5; + Z_VERSION_ERROR = -6; + + Z_NO_COMPRESSION = 0; + Z_BEST_SPEED = 1; + Z_BEST_COMPRESSION = 9; + Z_DEFAULT_COMPRESSION = -1; + + Z_FILTERED = 1; + Z_HUFFMAN_ONLY = 2; + Z_RLE = 3; + Z_FIXED = 4; + Z_DEFAULT_STRATEGY = 0; + + Z_BINARY = 0; + Z_TEXT = 1; + Z_ASCII = 1; + Z_UNKNOWN = 2; + + Z_DEFLATED = 8; + +(* basic functions *) +function zlibVersion: PChar; +function deflateInit(var strm: z_stream; level: Integer): Integer; +function deflate(var strm: z_stream; flush: Integer): Integer; +function deflateEnd(var strm: z_stream): Integer; +function inflateInit(var strm: z_stream): Integer; +function inflate(var strm: z_stream; flush: Integer): Integer; +function inflateEnd(var strm: z_stream): Integer; + +(* advanced functions *) +function deflateInit2(var strm: z_stream; level, method, windowBits, + memLevel, strategy: Integer): Integer; +function deflateSetDictionary(var strm: z_stream; const dictionary: PChar; + dictLength: Integer): Integer; +function deflateCopy(var dest, source: z_stream): Integer; +function deflateReset(var strm: z_stream): Integer; +function deflateParams(var strm: z_stream; level, strategy: Integer): Integer; +function deflateTune(var strm: z_stream; good_length, max_lazy, nice_length, max_chain: Integer): Integer; +function deflateBound(var strm: z_stream; sourceLen: LongInt): LongInt; +function deflatePending(var strm: z_stream; var pending: Integer; var bits: Integer): Integer; +function deflatePrime(var strm: z_stream; bits, value: Integer): Integer; +function deflateSetHeader(var strm: z_stream; head: gz_header): Integer; +function inflateInit2(var strm: z_stream; windowBits: Integer): Integer; +function inflateSetDictionary(var strm: z_stream; const dictionary: PChar; + dictLength: Integer): Integer; +function inflateSync(var strm: z_stream): Integer; +function inflateCopy(var dest, source: z_stream): Integer; +function inflateReset(var strm: z_stream): Integer; +function inflateReset2(var strm: z_stream; windowBits: Integer): Integer; +function inflatePrime(var strm: z_stream; bits, value: Integer): Integer; +function inflateMark(var strm: z_stream): LongInt; +function inflateGetHeader(var strm: z_stream; var head: gz_header): Integer; +function inflateBackInit(var strm: z_stream; + windowBits: Integer; window: PChar): Integer; +function inflateBack(var strm: z_stream; in_fn: in_func; in_desc: Pointer; + out_fn: out_func; out_desc: Pointer): Integer; +function inflateBackEnd(var strm: z_stream): Integer; +function zlibCompileFlags: LongInt; + +(* utility functions *) +function compress(dest: PChar; var destLen: LongInt; + const source: PChar; sourceLen: LongInt): Integer; +function compress2(dest: PChar; var destLen: LongInt; + const source: PChar; sourceLen: LongInt; + level: Integer): Integer; +function compressBound(sourceLen: LongInt): LongInt; +function uncompress(dest: PChar; var destLen: LongInt; + const source: PChar; sourceLen: LongInt): Integer; + +(* checksum functions *) +function adler32(adler: LongInt; const buf: PChar; len: Integer): LongInt; +function adler32_combine(adler1, adler2, len2: LongInt): LongInt; +function crc32(crc: LongInt; const buf: PChar; len: Integer): LongInt; +function crc32_combine(crc1, crc2, len2: LongInt): LongInt; + +(* various hacks, don't look :) *) +function deflateInit_(var strm: z_stream; level: Integer; + const version: PChar; stream_size: Integer): Integer; +function inflateInit_(var strm: z_stream; const version: PChar; + stream_size: Integer): Integer; +function deflateInit2_(var strm: z_stream; + level, method, windowBits, memLevel, strategy: Integer; + const version: PChar; stream_size: Integer): Integer; +function inflateInit2_(var strm: z_stream; windowBits: Integer; + const version: PChar; stream_size: Integer): Integer; +function inflateBackInit_(var strm: z_stream; + windowBits: Integer; window: PChar; + const version: PChar; stream_size: Integer): Integer; + + +implementation + +{$L adler32.obj} +{$L compress.obj} +{$L crc32.obj} +{$L deflate.obj} +{$L infback.obj} +{$L inffast.obj} +{$L inflate.obj} +{$L inftrees.obj} +{$L trees.obj} +{$L uncompr.obj} +{$L zutil.obj} + +function adler32; external; +function adler32_combine; external; +function compress; external; +function compress2; external; +function compressBound; external; +function crc32; external; +function crc32_combine; external; +function deflate; external; +function deflateBound; external; +function deflateCopy; external; +function deflateEnd; external; +function deflateInit_; external; +function deflateInit2_; external; +function deflateParams; external; +function deflatePending; external; +function deflatePrime; external; +function deflateReset; external; +function deflateSetDictionary; external; +function deflateSetHeader; external; +function deflateTune; external; +function inflate; external; +function inflateBack; external; +function inflateBackEnd; external; +function inflateBackInit_; external; +function inflateCopy; external; +function inflateEnd; external; +function inflateGetHeader; external; +function inflateInit_; external; +function inflateInit2_; external; +function inflateMark; external; +function inflatePrime; external; +function inflateReset; external; +function inflateReset2; external; +function inflateSetDictionary; external; +function inflateSync; external; +function uncompress; external; +function zlibCompileFlags; external; +function zlibVersion; external; + +function deflateInit(var strm: z_stream; level: Integer): Integer; +begin + Result := deflateInit_(strm, level, ZLIB_VERSION, sizeof(z_stream)); +end; + +function deflateInit2(var strm: z_stream; level, method, windowBits, memLevel, + strategy: Integer): Integer; +begin + Result := deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + ZLIB_VERSION, sizeof(z_stream)); +end; + +function inflateInit(var strm: z_stream): Integer; +begin + Result := inflateInit_(strm, ZLIB_VERSION, sizeof(z_stream)); +end; + +function inflateInit2(var strm: z_stream; windowBits: Integer): Integer; +begin + Result := inflateInit2_(strm, windowBits, ZLIB_VERSION, sizeof(z_stream)); +end; + +function inflateBackInit(var strm: z_stream; + windowBits: Integer; window: PChar): Integer; +begin + Result := inflateBackInit_(strm, windowBits, window, + ZLIB_VERSION, sizeof(z_stream)); +end; + +function _malloc(Size: Integer): Pointer; cdecl; +begin + GetMem(Result, Size); +end; + +procedure _free(Block: Pointer); cdecl; +begin + FreeMem(Block); +end; + +procedure _memset(P: Pointer; B: Byte; count: Integer); cdecl; +begin + FillChar(P^, count, B); +end; + +procedure _memcpy(dest, source: Pointer; count: Integer); cdecl; +begin + Move(source^, dest^, count); +end; + +end. diff --git a/externe_kniznice/zlib/contrib/puff/Makefile b/externe_kniznice/zlib/contrib/puff/Makefile new file mode 100644 index 0000000..0e2594c --- /dev/null +++ b/externe_kniznice/zlib/contrib/puff/Makefile @@ -0,0 +1,42 @@ +CFLAGS=-O + +puff: puff.o pufftest.o + +puff.o: puff.h + +pufftest.o: puff.h + +test: puff + puff zeros.raw + +puft: puff.c puff.h pufftest.o + cc -fprofile-arcs -ftest-coverage -o puft puff.c pufftest.o + +# puff full coverage test (should say 100%) +cov: puft + @rm -f *.gcov *.gcda + @puft -w zeros.raw 2>&1 | cat > /dev/null + @echo '04' | xxd -r -p | puft 2> /dev/null || test $$? -eq 2 + @echo '00' | xxd -r -p | puft 2> /dev/null || test $$? -eq 2 + @echo '00 00 00 00 00' | xxd -r -p | puft 2> /dev/null || test $$? -eq 254 + @echo '00 01 00 fe ff' | xxd -r -p | puft 2> /dev/null || test $$? -eq 2 + @echo '01 01 00 fe ff 0a' | xxd -r -p | puft -f 2>&1 | cat > /dev/null + @echo '02 7e ff ff' | xxd -r -p | puft 2> /dev/null || test $$? -eq 246 + @echo '02' | xxd -r -p | puft 2> /dev/null || test $$? -eq 2 + @echo '04 80 49 92 24 49 92 24 0f b4 ff ff c3 04' | xxd -r -p | puft 2> /dev/null || test $$? -eq 2 + @echo '04 80 49 92 24 49 92 24 71 ff ff 93 11 00' | xxd -r -p | puft 2> /dev/null || test $$? -eq 249 + @echo '04 c0 81 08 00 00 00 00 20 7f eb 0b 00 00' | xxd -r -p | puft 2> /dev/null || test $$? -eq 246 + @echo '0b 00 00' | xxd -r -p | puft -f 2>&1 | cat > /dev/null + @echo '1a 07' | xxd -r -p | puft 2> /dev/null || test $$? -eq 246 + @echo '0c c0 81 00 00 00 00 00 90 ff 6b 04' | xxd -r -p | puft 2> /dev/null || test $$? -eq 245 + @puft -f zeros.raw 2>&1 | cat > /dev/null + @echo 'fc 00 00' | xxd -r -p | puft 2> /dev/null || test $$? -eq 253 + @echo '04 00 fe ff' | xxd -r -p | puft 2> /dev/null || test $$? -eq 252 + @echo '04 00 24 49' | xxd -r -p | puft 2> /dev/null || test $$? -eq 251 + @echo '04 80 49 92 24 49 92 24 0f b4 ff ff c3 84' | xxd -r -p | puft 2> /dev/null || test $$? -eq 248 + @echo '04 00 24 e9 ff ff' | xxd -r -p | puft 2> /dev/null || test $$? -eq 250 + @echo '04 00 24 e9 ff 6d' | xxd -r -p | puft 2> /dev/null || test $$? -eq 247 + @gcov -n puff.c + +clean: + rm -f puff puft *.o *.gc* diff --git a/externe_kniznice/zlib/contrib/puff/README b/externe_kniznice/zlib/contrib/puff/README new file mode 100644 index 0000000..bbc4cb5 --- /dev/null +++ b/externe_kniznice/zlib/contrib/puff/README @@ -0,0 +1,63 @@ +Puff -- A Simple Inflate +3 Mar 2003 +Mark Adler +madler@alumni.caltech.edu + +What this is -- + +puff.c provides the routine puff() to decompress the deflate data format. It +does so more slowly than zlib, but the code is about one-fifth the size of the +inflate code in zlib, and written to be very easy to read. + +Why I wrote this -- + +puff.c was written to document the deflate format unambiguously, by virtue of +being working C code. It is meant to supplement RFC 1951, which formally +describes the deflate format. I have received many questions on details of the +deflate format, and I hope that reading this code will answer those questions. +puff.c is heavily commented with details of the deflate format, especially +those little nooks and cranies of the format that might not be obvious from a +specification. + +puff.c may also be useful in applications where code size or memory usage is a +very limited resource, and speed is not as important. + +How to use it -- + +Well, most likely you should just be reading puff.c and using zlib for actual +applications, but if you must ... + +Include puff.h in your code, which provides this prototype: + +int puff(unsigned char *dest, /* pointer to destination pointer */ + unsigned long *destlen, /* amount of output space */ + unsigned char *source, /* pointer to source data pointer */ + unsigned long *sourcelen); /* amount of input available */ + +Then you can call puff() to decompress a deflate stream that is in memory in +its entirety at source, to a sufficiently sized block of memory for the +decompressed data at dest. puff() is the only external symbol in puff.c The +only C library functions that puff.c needs are setjmp() and longjmp(), which +are used to simplify error checking in the code to improve readabilty. puff.c +does no memory allocation, and uses less than 2K bytes off of the stack. + +If destlen is not enough space for the uncompressed data, then inflate will +return an error without writing more than destlen bytes. Note that this means +that in order to decompress the deflate data successfully, you need to know +the size of the uncompressed data ahead of time. + +If needed, puff() can determine the size of the uncompressed data with no +output space. This is done by passing dest equal to (unsigned char *)0. Then +the initial value of *destlen is ignored and *destlen is set to the length of +the uncompressed data. So if the size of the uncompressed data is not known, +then two passes of puff() can be used--first to determine the size, and second +to do the actual inflation after allocating the appropriate memory. Not +pretty, but it works. (This is one of the reasons you should be using zlib.) + +The deflate format is self-terminating. If the deflate stream does not end +in *sourcelen bytes, puff() will return an error without reading at or past +endsource. + +On return, *sourcelen is updated to the amount of input data consumed, and +*destlen is updated to the size of the uncompressed data. See the comments +in puff.c for the possible return codes for puff(). diff --git a/externe_kniznice/zlib/contrib/puff/puff.c b/externe_kniznice/zlib/contrib/puff/puff.c new file mode 100644 index 0000000..c6c90d7 --- /dev/null +++ b/externe_kniznice/zlib/contrib/puff/puff.c @@ -0,0 +1,840 @@ +/* + * puff.c + * Copyright (C) 2002-2013 Mark Adler + * For conditions of distribution and use, see copyright notice in puff.h + * version 2.3, 21 Jan 2013 + * + * puff.c is a simple inflate written to be an unambiguous way to specify the + * deflate format. It is not written for speed but rather simplicity. As a + * side benefit, this code might actually be useful when small code is more + * important than speed, such as bootstrap applications. For typical deflate + * data, zlib's inflate() is about four times as fast as puff(). zlib's + * inflate compiles to around 20K on my machine, whereas puff.c compiles to + * around 4K on my machine (a PowerPC using GNU cc). If the faster decode() + * function here is used, then puff() is only twice as slow as zlib's + * inflate(). + * + * All dynamically allocated memory comes from the stack. The stack required + * is less than 2K bytes. This code is compatible with 16-bit int's and + * assumes that long's are at least 32 bits. puff.c uses the short data type, + * assumed to be 16 bits, for arrays in order to conserve memory. The code + * works whether integers are stored big endian or little endian. + * + * In the comments below are "Format notes" that describe the inflate process + * and document some of the less obvious aspects of the format. This source + * code is meant to supplement RFC 1951, which formally describes the deflate + * format: + * + * http://www.zlib.org/rfc-deflate.html + */ + +/* + * Change history: + * + * 1.0 10 Feb 2002 - First version + * 1.1 17 Feb 2002 - Clarifications of some comments and notes + * - Update puff() dest and source pointers on negative + * errors to facilitate debugging deflators + * - Remove longest from struct huffman -- not needed + * - Simplify offs[] index in construct() + * - Add input size and checking, using longjmp() to + * maintain easy readability + * - Use short data type for large arrays + * - Use pointers instead of long to specify source and + * destination sizes to avoid arbitrary 4 GB limits + * 1.2 17 Mar 2002 - Add faster version of decode(), doubles speed (!), + * but leave simple version for readabilty + * - Make sure invalid distances detected if pointers + * are 16 bits + * - Fix fixed codes table error + * - Provide a scanning mode for determining size of + * uncompressed data + * 1.3 20 Mar 2002 - Go back to lengths for puff() parameters [Gailly] + * - Add a puff.h file for the interface + * - Add braces in puff() for else do [Gailly] + * - Use indexes instead of pointers for readability + * 1.4 31 Mar 2002 - Simplify construct() code set check + * - Fix some comments + * - Add FIXLCODES #define + * 1.5 6 Apr 2002 - Minor comment fixes + * 1.6 7 Aug 2002 - Minor format changes + * 1.7 3 Mar 2003 - Added test code for distribution + * - Added zlib-like license + * 1.8 9 Jan 2004 - Added some comments on no distance codes case + * 1.9 21 Feb 2008 - Fix bug on 16-bit integer architectures [Pohland] + * - Catch missing end-of-block symbol error + * 2.0 25 Jul 2008 - Add #define to permit distance too far back + * - Add option in TEST code for puff to write the data + * - Add option in TEST code to skip input bytes + * - Allow TEST code to read from piped stdin + * 2.1 4 Apr 2010 - Avoid variable initialization for happier compilers + * - Avoid unsigned comparisons for even happier compilers + * 2.2 25 Apr 2010 - Fix bug in variable initializations [Oberhumer] + * - Add const where appropriate [Oberhumer] + * - Split if's and ?'s for coverage testing + * - Break out test code to separate file + * - Move NIL to puff.h + * - Allow incomplete code only if single code length is 1 + * - Add full code coverage test to Makefile + * 2.3 21 Jan 2013 - Check for invalid code length codes in dynamic blocks + */ + +#include /* for setjmp(), longjmp(), and jmp_buf */ +#include "puff.h" /* prototype for puff() */ + +#define local static /* for local function definitions */ + +/* + * Maximums for allocations and loops. It is not useful to change these -- + * they are fixed by the deflate format. + */ +#define MAXBITS 15 /* maximum bits in a code */ +#define MAXLCODES 286 /* maximum number of literal/length codes */ +#define MAXDCODES 30 /* maximum number of distance codes */ +#define MAXCODES (MAXLCODES+MAXDCODES) /* maximum codes lengths to read */ +#define FIXLCODES 288 /* number of fixed literal/length codes */ + +/* input and output state */ +struct state { + /* output state */ + unsigned char *out; /* output buffer */ + unsigned long outlen; /* available space at out */ + unsigned long outcnt; /* bytes written to out so far */ + + /* input state */ + const unsigned char *in; /* input buffer */ + unsigned long inlen; /* available input at in */ + unsigned long incnt; /* bytes read so far */ + int bitbuf; /* bit buffer */ + int bitcnt; /* number of bits in bit buffer */ + + /* input limit error return state for bits() and decode() */ + jmp_buf env; +}; + +/* + * Return need bits from the input stream. This always leaves less than + * eight bits in the buffer. bits() works properly for need == 0. + * + * Format notes: + * + * - Bits are stored in bytes from the least significant bit to the most + * significant bit. Therefore bits are dropped from the bottom of the bit + * buffer, using shift right, and new bytes are appended to the top of the + * bit buffer, using shift left. + */ +local int bits(struct state *s, int need) +{ + long val; /* bit accumulator (can use up to 20 bits) */ + + /* load at least need bits into val */ + val = s->bitbuf; + while (s->bitcnt < need) { + if (s->incnt == s->inlen) + longjmp(s->env, 1); /* out of input */ + val |= (long)(s->in[s->incnt++]) << s->bitcnt; /* load eight bits */ + s->bitcnt += 8; + } + + /* drop need bits and update buffer, always zero to seven bits left */ + s->bitbuf = (int)(val >> need); + s->bitcnt -= need; + + /* return need bits, zeroing the bits above that */ + return (int)(val & ((1L << need) - 1)); +} + +/* + * Process a stored block. + * + * Format notes: + * + * - After the two-bit stored block type (00), the stored block length and + * stored bytes are byte-aligned for fast copying. Therefore any leftover + * bits in the byte that has the last bit of the type, as many as seven, are + * discarded. The value of the discarded bits are not defined and should not + * be checked against any expectation. + * + * - The second inverted copy of the stored block length does not have to be + * checked, but it's probably a good idea to do so anyway. + * + * - A stored block can have zero length. This is sometimes used to byte-align + * subsets of the compressed data for random access or partial recovery. + */ +local int stored(struct state *s) +{ + unsigned len; /* length of stored block */ + + /* discard leftover bits from current byte (assumes s->bitcnt < 8) */ + s->bitbuf = 0; + s->bitcnt = 0; + + /* get length and check against its one's complement */ + if (s->incnt + 4 > s->inlen) + return 2; /* not enough input */ + len = s->in[s->incnt++]; + len |= s->in[s->incnt++] << 8; + if (s->in[s->incnt++] != (~len & 0xff) || + s->in[s->incnt++] != ((~len >> 8) & 0xff)) + return -2; /* didn't match complement! */ + + /* copy len bytes from in to out */ + if (s->incnt + len > s->inlen) + return 2; /* not enough input */ + if (s->out != NIL) { + if (s->outcnt + len > s->outlen) + return 1; /* not enough output space */ + while (len--) + s->out[s->outcnt++] = s->in[s->incnt++]; + } + else { /* just scanning */ + s->outcnt += len; + s->incnt += len; + } + + /* done with a valid stored block */ + return 0; +} + +/* + * Huffman code decoding tables. count[1..MAXBITS] is the number of symbols of + * each length, which for a canonical code are stepped through in order. + * symbol[] are the symbol values in canonical order, where the number of + * entries is the sum of the counts in count[]. The decoding process can be + * seen in the function decode() below. + */ +struct huffman { + short *count; /* number of symbols of each length */ + short *symbol; /* canonically ordered symbols */ +}; + +/* + * Decode a code from the stream s using huffman table h. Return the symbol or + * a negative value if there is an error. If all of the lengths are zero, i.e. + * an empty code, or if the code is incomplete and an invalid code is received, + * then -10 is returned after reading MAXBITS bits. + * + * Format notes: + * + * - The codes as stored in the compressed data are bit-reversed relative to + * a simple integer ordering of codes of the same lengths. Hence below the + * bits are pulled from the compressed data one at a time and used to + * build the code value reversed from what is in the stream in order to + * permit simple integer comparisons for decoding. A table-based decoding + * scheme (as used in zlib) does not need to do this reversal. + * + * - The first code for the shortest length is all zeros. Subsequent codes of + * the same length are simply integer increments of the previous code. When + * moving up a length, a zero bit is appended to the code. For a complete + * code, the last code of the longest length will be all ones. + * + * - Incomplete codes are handled by this decoder, since they are permitted + * in the deflate format. See the format notes for fixed() and dynamic(). + */ +#ifdef SLOW +local int decode(struct state *s, const struct huffman *h) +{ + int len; /* current number of bits in code */ + int code; /* len bits being decoded */ + int first; /* first code of length len */ + int count; /* number of codes of length len */ + int index; /* index of first code of length len in symbol table */ + + code = first = index = 0; + for (len = 1; len <= MAXBITS; len++) { + code |= bits(s, 1); /* get next bit */ + count = h->count[len]; + if (code - count < first) /* if length len, return symbol */ + return h->symbol[index + (code - first)]; + index += count; /* else update for next length */ + first += count; + first <<= 1; + code <<= 1; + } + return -10; /* ran out of codes */ +} + +/* + * A faster version of decode() for real applications of this code. It's not + * as readable, but it makes puff() twice as fast. And it only makes the code + * a few percent larger. + */ +#else /* !SLOW */ +local int decode(struct state *s, const struct huffman *h) +{ + int len; /* current number of bits in code */ + int code; /* len bits being decoded */ + int first; /* first code of length len */ + int count; /* number of codes of length len */ + int index; /* index of first code of length len in symbol table */ + int bitbuf; /* bits from stream */ + int left; /* bits left in next or left to process */ + short *next; /* next number of codes */ + + bitbuf = s->bitbuf; + left = s->bitcnt; + code = first = index = 0; + len = 1; + next = h->count + 1; + while (1) { + while (left--) { + code |= bitbuf & 1; + bitbuf >>= 1; + count = *next++; + if (code - count < first) { /* if length len, return symbol */ + s->bitbuf = bitbuf; + s->bitcnt = (s->bitcnt - len) & 7; + return h->symbol[index + (code - first)]; + } + index += count; /* else update for next length */ + first += count; + first <<= 1; + code <<= 1; + len++; + } + left = (MAXBITS+1) - len; + if (left == 0) + break; + if (s->incnt == s->inlen) + longjmp(s->env, 1); /* out of input */ + bitbuf = s->in[s->incnt++]; + if (left > 8) + left = 8; + } + return -10; /* ran out of codes */ +} +#endif /* SLOW */ + +/* + * Given the list of code lengths length[0..n-1] representing a canonical + * Huffman code for n symbols, construct the tables required to decode those + * codes. Those tables are the number of codes of each length, and the symbols + * sorted by length, retaining their original order within each length. The + * return value is zero for a complete code set, negative for an over- + * subscribed code set, and positive for an incomplete code set. The tables + * can be used if the return value is zero or positive, but they cannot be used + * if the return value is negative. If the return value is zero, it is not + * possible for decode() using that table to return an error--any stream of + * enough bits will resolve to a symbol. If the return value is positive, then + * it is possible for decode() using that table to return an error for received + * codes past the end of the incomplete lengths. + * + * Not used by decode(), but used for error checking, h->count[0] is the number + * of the n symbols not in the code. So n - h->count[0] is the number of + * codes. This is useful for checking for incomplete codes that have more than + * one symbol, which is an error in a dynamic block. + * + * Assumption: for all i in 0..n-1, 0 <= length[i] <= MAXBITS + * This is assured by the construction of the length arrays in dynamic() and + * fixed() and is not verified by construct(). + * + * Format notes: + * + * - Permitted and expected examples of incomplete codes are one of the fixed + * codes and any code with a single symbol which in deflate is coded as one + * bit instead of zero bits. See the format notes for fixed() and dynamic(). + * + * - Within a given code length, the symbols are kept in ascending order for + * the code bits definition. + */ +local int construct(struct huffman *h, const short *length, int n) +{ + int symbol; /* current symbol when stepping through length[] */ + int len; /* current length when stepping through h->count[] */ + int left; /* number of possible codes left of current length */ + short offs[MAXBITS+1]; /* offsets in symbol table for each length */ + + /* count number of codes of each length */ + for (len = 0; len <= MAXBITS; len++) + h->count[len] = 0; + for (symbol = 0; symbol < n; symbol++) + (h->count[length[symbol]])++; /* assumes lengths are within bounds */ + if (h->count[0] == n) /* no codes! */ + return 0; /* complete, but decode() will fail */ + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; /* one possible code of zero length */ + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; /* one more bit, double codes left */ + left -= h->count[len]; /* deduct count from possible codes */ + if (left < 0) + return left; /* over-subscribed--return negative */ + } /* left > 0 means incomplete */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + h->count[len]; + + /* + * put symbols in table sorted by length, by symbol order within each + * length + */ + for (symbol = 0; symbol < n; symbol++) + if (length[symbol] != 0) + h->symbol[offs[length[symbol]]++] = symbol; + + /* return zero for complete set, positive for incomplete set */ + return left; +} + +/* + * Decode literal/length and distance codes until an end-of-block code. + * + * Format notes: + * + * - Compressed data that is after the block type if fixed or after the code + * description if dynamic is a combination of literals and length/distance + * pairs terminated by and end-of-block code. Literals are simply Huffman + * coded bytes. A length/distance pair is a coded length followed by a + * coded distance to represent a string that occurs earlier in the + * uncompressed data that occurs again at the current location. + * + * - Literals, lengths, and the end-of-block code are combined into a single + * code of up to 286 symbols. They are 256 literals (0..255), 29 length + * symbols (257..285), and the end-of-block symbol (256). + * + * - There are 256 possible lengths (3..258), and so 29 symbols are not enough + * to represent all of those. Lengths 3..10 and 258 are in fact represented + * by just a length symbol. Lengths 11..257 are represented as a symbol and + * some number of extra bits that are added as an integer to the base length + * of the length symbol. The number of extra bits is determined by the base + * length symbol. These are in the static arrays below, lens[] for the base + * lengths and lext[] for the corresponding number of extra bits. + * + * - The reason that 258 gets its own symbol is that the longest length is used + * often in highly redundant files. Note that 258 can also be coded as the + * base value 227 plus the maximum extra value of 31. While a good deflate + * should never do this, it is not an error, and should be decoded properly. + * + * - If a length is decoded, including its extra bits if any, then it is + * followed a distance code. There are up to 30 distance symbols. Again + * there are many more possible distances (1..32768), so extra bits are added + * to a base value represented by the symbol. The distances 1..4 get their + * own symbol, but the rest require extra bits. The base distances and + * corresponding number of extra bits are below in the static arrays dist[] + * and dext[]. + * + * - Literal bytes are simply written to the output. A length/distance pair is + * an instruction to copy previously uncompressed bytes to the output. The + * copy is from distance bytes back in the output stream, copying for length + * bytes. + * + * - Distances pointing before the beginning of the output data are not + * permitted. + * + * - Overlapped copies, where the length is greater than the distance, are + * allowed and common. For example, a distance of one and a length of 258 + * simply copies the last byte 258 times. A distance of four and a length of + * twelve copies the last four bytes three times. A simple forward copy + * ignoring whether the length is greater than the distance or not implements + * this correctly. You should not use memcpy() since its behavior is not + * defined for overlapped arrays. You should not use memmove() or bcopy() + * since though their behavior -is- defined for overlapping arrays, it is + * defined to do the wrong thing in this case. + */ +local int codes(struct state *s, + const struct huffman *lencode, + const struct huffman *distcode) +{ + int symbol; /* decoded symbol */ + int len; /* length for copy */ + unsigned dist; /* distance for copy */ + static const short lens[29] = { /* Size base for length codes 257..285 */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258}; + static const short lext[29] = { /* Extra bits for length codes 257..285 */ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, + 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0}; + static const short dists[30] = { /* Offset base for distance codes 0..29 */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577}; + static const short dext[30] = { /* Extra bits for distance codes 0..29 */ + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, + 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, + 12, 12, 13, 13}; + + /* decode literals and length/distance pairs */ + do { + symbol = decode(s, lencode); + if (symbol < 0) + return symbol; /* invalid symbol */ + if (symbol < 256) { /* literal: symbol is the byte */ + /* write out the literal */ + if (s->out != NIL) { + if (s->outcnt == s->outlen) + return 1; + s->out[s->outcnt] = symbol; + } + s->outcnt++; + } + else if (symbol > 256) { /* length */ + /* get and compute length */ + symbol -= 257; + if (symbol >= 29) + return -10; /* invalid fixed code */ + len = lens[symbol] + bits(s, lext[symbol]); + + /* get and check distance */ + symbol = decode(s, distcode); + if (symbol < 0) + return symbol; /* invalid symbol */ + dist = dists[symbol] + bits(s, dext[symbol]); +#ifndef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + if (dist > s->outcnt) + return -11; /* distance too far back */ +#endif + + /* copy length bytes from distance bytes back */ + if (s->out != NIL) { + if (s->outcnt + len > s->outlen) + return 1; + while (len--) { + s->out[s->outcnt] = +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + dist > s->outcnt ? + 0 : +#endif + s->out[s->outcnt - dist]; + s->outcnt++; + } + } + else + s->outcnt += len; + } + } while (symbol != 256); /* end of block symbol */ + + /* done with a valid fixed or dynamic block */ + return 0; +} + +/* + * Process a fixed codes block. + * + * Format notes: + * + * - This block type can be useful for compressing small amounts of data for + * which the size of the code descriptions in a dynamic block exceeds the + * benefit of custom codes for that block. For fixed codes, no bits are + * spent on code descriptions. Instead the code lengths for literal/length + * codes and distance codes are fixed. The specific lengths for each symbol + * can be seen in the "for" loops below. + * + * - The literal/length code is complete, but has two symbols that are invalid + * and should result in an error if received. This cannot be implemented + * simply as an incomplete code since those two symbols are in the "middle" + * of the code. They are eight bits long and the longest literal/length\ + * code is nine bits. Therefore the code must be constructed with those + * symbols, and the invalid symbols must be detected after decoding. + * + * - The fixed distance codes also have two invalid symbols that should result + * in an error if received. Since all of the distance codes are the same + * length, this can be implemented as an incomplete code. Then the invalid + * codes are detected while decoding. + */ +local int fixed(struct state *s) +{ + static int virgin = 1; + static short lencnt[MAXBITS+1], lensym[FIXLCODES]; + static short distcnt[MAXBITS+1], distsym[MAXDCODES]; + static struct huffman lencode, distcode; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + int symbol; + short lengths[FIXLCODES]; + + /* construct lencode and distcode */ + lencode.count = lencnt; + lencode.symbol = lensym; + distcode.count = distcnt; + distcode.symbol = distsym; + + /* literal/length table */ + for (symbol = 0; symbol < 144; symbol++) + lengths[symbol] = 8; + for (; symbol < 256; symbol++) + lengths[symbol] = 9; + for (; symbol < 280; symbol++) + lengths[symbol] = 7; + for (; symbol < FIXLCODES; symbol++) + lengths[symbol] = 8; + construct(&lencode, lengths, FIXLCODES); + + /* distance table */ + for (symbol = 0; symbol < MAXDCODES; symbol++) + lengths[symbol] = 5; + construct(&distcode, lengths, MAXDCODES); + + /* do this just once */ + virgin = 0; + } + + /* decode data until end-of-block code */ + return codes(s, &lencode, &distcode); +} + +/* + * Process a dynamic codes block. + * + * Format notes: + * + * - A dynamic block starts with a description of the literal/length and + * distance codes for that block. New dynamic blocks allow the compressor to + * rapidly adapt to changing data with new codes optimized for that data. + * + * - The codes used by the deflate format are "canonical", which means that + * the actual bits of the codes are generated in an unambiguous way simply + * from the number of bits in each code. Therefore the code descriptions + * are simply a list of code lengths for each symbol. + * + * - The code lengths are stored in order for the symbols, so lengths are + * provided for each of the literal/length symbols, and for each of the + * distance symbols. + * + * - If a symbol is not used in the block, this is represented by a zero as + * as the code length. This does not mean a zero-length code, but rather + * that no code should be created for this symbol. There is no way in the + * deflate format to represent a zero-length code. + * + * - The maximum number of bits in a code is 15, so the possible lengths for + * any code are 1..15. + * + * - The fact that a length of zero is not permitted for a code has an + * interesting consequence. Normally if only one symbol is used for a given + * code, then in fact that code could be represented with zero bits. However + * in deflate, that code has to be at least one bit. So for example, if + * only a single distance base symbol appears in a block, then it will be + * represented by a single code of length one, in particular one 0 bit. This + * is an incomplete code, since if a 1 bit is received, it has no meaning, + * and should result in an error. So incomplete distance codes of one symbol + * should be permitted, and the receipt of invalid codes should be handled. + * + * - It is also possible to have a single literal/length code, but that code + * must be the end-of-block code, since every dynamic block has one. This + * is not the most efficient way to create an empty block (an empty fixed + * block is fewer bits), but it is allowed by the format. So incomplete + * literal/length codes of one symbol should also be permitted. + * + * - If there are only literal codes and no lengths, then there are no distance + * codes. This is represented by one distance code with zero bits. + * + * - The list of up to 286 length/literal lengths and up to 30 distance lengths + * are themselves compressed using Huffman codes and run-length encoding. In + * the list of code lengths, a 0 symbol means no code, a 1..15 symbol means + * that length, and the symbols 16, 17, and 18 are run-length instructions. + * Each of 16, 17, and 18 are follwed by extra bits to define the length of + * the run. 16 copies the last length 3 to 6 times. 17 represents 3 to 10 + * zero lengths, and 18 represents 11 to 138 zero lengths. Unused symbols + * are common, hence the special coding for zero lengths. + * + * - The symbols for 0..18 are Huffman coded, and so that code must be + * described first. This is simply a sequence of up to 19 three-bit values + * representing no code (0) or the code length for that symbol (1..7). + * + * - A dynamic block starts with three fixed-size counts from which is computed + * the number of literal/length code lengths, the number of distance code + * lengths, and the number of code length code lengths (ok, you come up with + * a better name!) in the code descriptions. For the literal/length and + * distance codes, lengths after those provided are considered zero, i.e. no + * code. The code length code lengths are received in a permuted order (see + * the order[] array below) to make a short code length code length list more + * likely. As it turns out, very short and very long codes are less likely + * to be seen in a dynamic code description, hence what may appear initially + * to be a peculiar ordering. + * + * - Given the number of literal/length code lengths (nlen) and distance code + * lengths (ndist), then they are treated as one long list of nlen + ndist + * code lengths. Therefore run-length coding can and often does cross the + * boundary between the two sets of lengths. + * + * - So to summarize, the code description at the start of a dynamic block is + * three counts for the number of code lengths for the literal/length codes, + * the distance codes, and the code length codes. This is followed by the + * code length code lengths, three bits each. This is used to construct the + * code length code which is used to read the remainder of the lengths. Then + * the literal/length code lengths and distance lengths are read as a single + * set of lengths using the code length codes. Codes are constructed from + * the resulting two sets of lengths, and then finally you can start + * decoding actual compressed data in the block. + * + * - For reference, a "typical" size for the code description in a dynamic + * block is around 80 bytes. + */ +local int dynamic(struct state *s) +{ + int nlen, ndist, ncode; /* number of lengths in descriptor */ + int index; /* index of lengths[] */ + int err; /* construct() return value */ + short lengths[MAXCODES]; /* descriptor code lengths */ + short lencnt[MAXBITS+1], lensym[MAXLCODES]; /* lencode memory */ + short distcnt[MAXBITS+1], distsym[MAXDCODES]; /* distcode memory */ + struct huffman lencode, distcode; /* length and distance codes */ + static const short order[19] = /* permutation of code length codes */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + /* construct lencode and distcode */ + lencode.count = lencnt; + lencode.symbol = lensym; + distcode.count = distcnt; + distcode.symbol = distsym; + + /* get number of lengths in each table, check lengths */ + nlen = bits(s, 5) + 257; + ndist = bits(s, 5) + 1; + ncode = bits(s, 4) + 4; + if (nlen > MAXLCODES || ndist > MAXDCODES) + return -3; /* bad counts */ + + /* read code length code lengths (really), missing lengths are zero */ + for (index = 0; index < ncode; index++) + lengths[order[index]] = bits(s, 3); + for (; index < 19; index++) + lengths[order[index]] = 0; + + /* build huffman table for code lengths codes (use lencode temporarily) */ + err = construct(&lencode, lengths, 19); + if (err != 0) /* require complete code set here */ + return -4; + + /* read length/literal and distance code length tables */ + index = 0; + while (index < nlen + ndist) { + int symbol; /* decoded value */ + int len; /* last length to repeat */ + + symbol = decode(s, &lencode); + if (symbol < 0) + return symbol; /* invalid symbol */ + if (symbol < 16) /* length in 0..15 */ + lengths[index++] = symbol; + else { /* repeat instruction */ + len = 0; /* assume repeating zeros */ + if (symbol == 16) { /* repeat last length 3..6 times */ + if (index == 0) + return -5; /* no last length! */ + len = lengths[index - 1]; /* last length */ + symbol = 3 + bits(s, 2); + } + else if (symbol == 17) /* repeat zero 3..10 times */ + symbol = 3 + bits(s, 3); + else /* == 18, repeat zero 11..138 times */ + symbol = 11 + bits(s, 7); + if (index + symbol > nlen + ndist) + return -6; /* too many lengths! */ + while (symbol--) /* repeat last or zero symbol times */ + lengths[index++] = len; + } + } + + /* check for end-of-block code -- there better be one! */ + if (lengths[256] == 0) + return -9; + + /* build huffman table for literal/length codes */ + err = construct(&lencode, lengths, nlen); + if (err && (err < 0 || nlen != lencode.count[0] + lencode.count[1])) + return -7; /* incomplete code ok only for single length 1 code */ + + /* build huffman table for distance codes */ + err = construct(&distcode, lengths + nlen, ndist); + if (err && (err < 0 || ndist != distcode.count[0] + distcode.count[1])) + return -8; /* incomplete code ok only for single length 1 code */ + + /* decode data until end-of-block code */ + return codes(s, &lencode, &distcode); +} + +/* + * Inflate source to dest. On return, destlen and sourcelen are updated to the + * size of the uncompressed data and the size of the deflate data respectively. + * On success, the return value of puff() is zero. If there is an error in the + * source data, i.e. it is not in the deflate format, then a negative value is + * returned. If there is not enough input available or there is not enough + * output space, then a positive error is returned. In that case, destlen and + * sourcelen are not updated to facilitate retrying from the beginning with the + * provision of more input data or more output space. In the case of invalid + * inflate data (a negative error), the dest and source pointers are updated to + * facilitate the debugging of deflators. + * + * puff() also has a mode to determine the size of the uncompressed output with + * no output written. For this dest must be (unsigned char *)0. In this case, + * the input value of *destlen is ignored, and on return *destlen is set to the + * size of the uncompressed output. + * + * The return codes are: + * + * 2: available inflate data did not terminate + * 1: output space exhausted before completing inflate + * 0: successful inflate + * -1: invalid block type (type == 3) + * -2: stored block length did not match one's complement + * -3: dynamic block code description: too many length or distance codes + * -4: dynamic block code description: code lengths codes incomplete + * -5: dynamic block code description: repeat lengths with no first length + * -6: dynamic block code description: repeat more than specified lengths + * -7: dynamic block code description: invalid literal/length code lengths + * -8: dynamic block code description: invalid distance code lengths + * -9: dynamic block code description: missing end-of-block code + * -10: invalid literal/length or distance code in fixed or dynamic block + * -11: distance is too far back in fixed or dynamic block + * + * Format notes: + * + * - Three bits are read for each block to determine the kind of block and + * whether or not it is the last block. Then the block is decoded and the + * process repeated if it was not the last block. + * + * - The leftover bits in the last byte of the deflate data after the last + * block (if it was a fixed or dynamic block) are undefined and have no + * expected values to check. + */ +int puff(unsigned char *dest, /* pointer to destination pointer */ + unsigned long *destlen, /* amount of output space */ + const unsigned char *source, /* pointer to source data pointer */ + unsigned long *sourcelen) /* amount of input available */ +{ + struct state s; /* input/output state */ + int last, type; /* block information */ + int err; /* return value */ + + /* initialize output state */ + s.out = dest; + s.outlen = *destlen; /* ignored if dest is NIL */ + s.outcnt = 0; + + /* initialize input state */ + s.in = source; + s.inlen = *sourcelen; + s.incnt = 0; + s.bitbuf = 0; + s.bitcnt = 0; + + /* return if bits() or decode() tries to read past available input */ + if (setjmp(s.env) != 0) /* if came back here via longjmp() */ + err = 2; /* then skip do-loop, return error */ + else { + /* process blocks until last block or error */ + do { + last = bits(&s, 1); /* one if last block */ + type = bits(&s, 2); /* block type 0..3 */ + err = type == 0 ? + stored(&s) : + (type == 1 ? + fixed(&s) : + (type == 2 ? + dynamic(&s) : + -1)); /* type == 3, invalid */ + if (err != 0) + break; /* return with error */ + } while (!last); + } + + /* update the lengths and return */ + if (err <= 0) { + *destlen = s.outcnt; + *sourcelen = s.incnt; + } + return err; +} diff --git a/externe_kniznice/zlib/contrib/puff/puff.h b/externe_kniznice/zlib/contrib/puff/puff.h new file mode 100644 index 0000000..e23a245 --- /dev/null +++ b/externe_kniznice/zlib/contrib/puff/puff.h @@ -0,0 +1,35 @@ +/* puff.h + Copyright (C) 2002-2013 Mark Adler, all rights reserved + version 2.3, 21 Jan 2013 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + + +/* + * See puff.c for purpose and usage. + */ +#ifndef NIL +# define NIL ((unsigned char *)0) /* for no output option */ +#endif + +int puff(unsigned char *dest, /* pointer to destination pointer */ + unsigned long *destlen, /* amount of output space */ + const unsigned char *source, /* pointer to source data pointer */ + unsigned long *sourcelen); /* amount of input available */ diff --git a/externe_kniznice/zlib/contrib/puff/pufftest.c b/externe_kniznice/zlib/contrib/puff/pufftest.c new file mode 100644 index 0000000..7764814 --- /dev/null +++ b/externe_kniznice/zlib/contrib/puff/pufftest.c @@ -0,0 +1,165 @@ +/* + * pufftest.c + * Copyright (C) 2002-2013 Mark Adler + * For conditions of distribution and use, see copyright notice in puff.h + * version 2.3, 21 Jan 2013 + */ + +/* Example of how to use puff(). + + Usage: puff [-w] [-f] [-nnn] file + ... | puff [-w] [-f] [-nnn] + + where file is the input file with deflate data, nnn is the number of bytes + of input to skip before inflating (e.g. to skip a zlib or gzip header), and + -w is used to write the decompressed data to stdout. -f is for coverage + testing, and causes pufftest to fail with not enough output space (-f does + a write like -w, so -w is not required). */ + +#include +#include +#include "puff.h" + +#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) +# include +# include +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +#define local static + +/* Return size times approximately the cube root of 2, keeping the result as 1, + 3, or 5 times a power of 2 -- the result is always > size, until the result + is the maximum value of an unsigned long, where it remains. This is useful + to keep reallocations less than ~33% over the actual data. */ +local size_t bythirds(size_t size) +{ + int n; + size_t m; + + m = size; + for (n = 0; m; n++) + m >>= 1; + if (n < 3) + return size + 1; + n -= 3; + m = size >> n; + m += m == 6 ? 2 : 1; + m <<= n; + return m > size ? m : (size_t)(-1); +} + +/* Read the input file *name, or stdin if name is NULL, into allocated memory. + Reallocate to larger buffers until the entire file is read in. Return a + pointer to the allocated data, or NULL if there was a memory allocation + failure. *len is the number of bytes of data read from the input file (even + if load() returns NULL). If the input file was empty or could not be opened + or read, *len is zero. */ +local void *load(const char *name, size_t *len) +{ + size_t size; + void *buf, *swap; + FILE *in; + + *len = 0; + buf = malloc(size = 4096); + if (buf == NULL) + return NULL; + in = name == NULL ? stdin : fopen(name, "rb"); + if (in != NULL) { + for (;;) { + *len += fread((char *)buf + *len, 1, size - *len, in); + if (*len < size) break; + size = bythirds(size); + if (size == *len || (swap = realloc(buf, size)) == NULL) { + free(buf); + buf = NULL; + break; + } + buf = swap; + } + fclose(in); + } + return buf; +} + +int main(int argc, char **argv) +{ + int ret, put = 0, fail = 0; + unsigned skip = 0; + char *arg, *name = NULL; + unsigned char *source = NULL, *dest; + size_t len = 0; + unsigned long sourcelen, destlen; + + /* process arguments */ + while (arg = *++argv, --argc) + if (arg[0] == '-') { + if (arg[1] == 'w' && arg[2] == 0) + put = 1; + else if (arg[1] == 'f' && arg[2] == 0) + fail = 1, put = 1; + else if (arg[1] >= '0' && arg[1] <= '9') + skip = (unsigned)atoi(arg + 1); + else { + fprintf(stderr, "invalid option %s\n", arg); + return 3; + } + } + else if (name != NULL) { + fprintf(stderr, "only one file name allowed\n"); + return 3; + } + else + name = arg; + source = load(name, &len); + if (source == NULL) { + fprintf(stderr, "memory allocation failure\n"); + return 4; + } + if (len == 0) { + fprintf(stderr, "could not read %s, or it was empty\n", + name == NULL ? "" : name); + free(source); + return 3; + } + if (skip >= len) { + fprintf(stderr, "skip request of %d leaves no input\n", skip); + free(source); + return 3; + } + + /* test inflate data with offset skip */ + len -= skip; + sourcelen = (unsigned long)len; + ret = puff(NIL, &destlen, source + skip, &sourcelen); + if (ret) + fprintf(stderr, "puff() failed with return code %d\n", ret); + else { + fprintf(stderr, "puff() succeeded uncompressing %lu bytes\n", destlen); + if (sourcelen < len) fprintf(stderr, "%lu compressed bytes unused\n", + len - sourcelen); + } + + /* if requested, inflate again and write decompressd data to stdout */ + if (put && ret == 0) { + if (fail) + destlen >>= 1; + dest = malloc(destlen); + if (dest == NULL) { + fprintf(stderr, "memory allocation failure\n"); + free(source); + return 4; + } + puff(dest, &destlen, source + skip, &sourcelen); + SET_BINARY_MODE(stdout); + fwrite(dest, 1, destlen, stdout); + free(dest); + } + + /* clean up */ + free(source); + return ret; +} diff --git a/externe_kniznice/zlib/contrib/puff/zeros.raw b/externe_kniznice/zlib/contrib/puff/zeros.raw new file mode 100644 index 0000000000000000000000000000000000000000..0a90e76b300205a44a0ecbf613e64aaaef2e51e7 GIT binary patch literal 2517 zcmYdFkYHV$AkxzmXu#!mP=i#?5{3o^3jqcYc(h*%Opg+yAut*OqaiT#LSPd+y9&tF zP5<`ixi4UXdB8xJfs^6ee;AkH?VUytyFsD;HLIJ(gg5bUnNh}Q2#kinXb22!2pr%5 E0JRq+;s5{u literal 0 HcmV?d00001 diff --git a/externe_kniznice/zlib/contrib/testzlib/testzlib.c b/externe_kniznice/zlib/contrib/testzlib/testzlib.c new file mode 100644 index 0000000..8626c92 --- /dev/null +++ b/externe_kniznice/zlib/contrib/testzlib/testzlib.c @@ -0,0 +1,275 @@ +#include +#include +#include + +#include "zlib.h" + + +void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B) +{ + R->HighPart = A.HighPart - B.HighPart; + if (A.LowPart >= B.LowPart) + R->LowPart = A.LowPart - B.LowPart; + else + { + R->LowPart = A.LowPart - B.LowPart; + R->HighPart --; + } +} + +#ifdef _M_X64 +// see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc +unsigned __int64 __rdtsc(void); +void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) +{ + // printf("rdtsc = %I64x\n",__rdtsc()); + pbeginTime64->QuadPart=__rdtsc(); +} + +LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) +{ + LARGE_INTEGER LIres; + unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart)); + LIres.QuadPart=res; + // printf("rdtsc = %I64x\n",__rdtsc()); + return LIres; +} +#else +#ifdef _M_IX86 +void myGetRDTSC32(LARGE_INTEGER * pbeginTime64) +{ + DWORD dwEdx,dwEax; + _asm + { + rdtsc + mov dwEax,eax + mov dwEdx,edx + } + pbeginTime64->LowPart=dwEax; + pbeginTime64->HighPart=dwEdx; +} + +void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) +{ + myGetRDTSC32(pbeginTime64); +} + +LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) +{ + LARGE_INTEGER LIres,endTime64; + myGetRDTSC32(&endTime64); + + LIres.LowPart=LIres.HighPart=0; + MyDoMinus64(&LIres,endTime64,beginTime64); + return LIres; +} +#else +void myGetRDTSC32(LARGE_INTEGER * pbeginTime64) +{ +} + +void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) +{ +} + +LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) +{ + LARGE_INTEGER lr; + lr.QuadPart=0; + return lr; +} +#endif +#endif + +void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf) +{ + if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64))) + { + pbeginTime64->LowPart = GetTickCount(); + pbeginTime64->HighPart = 0; + } +} + +DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) +{ + LARGE_INTEGER endTime64,ticksPerSecond,ticks; + DWORDLONG ticksShifted,tickSecShifted; + DWORD dwLog=16+0; + DWORD dwRet; + if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64))) + dwRet = (GetTickCount() - beginTime64.LowPart)*1; + else + { + MyDoMinus64(&ticks,endTime64,beginTime64); + QueryPerformanceFrequency(&ticksPerSecond); + + + { + ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog); + tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog); + + } + + dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted)); + dwRet *=1; + } + return dwRet; +} + +int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr) +{ + FILE* stream; + unsigned char* ptr; + int retVal=1; + stream=fopen(filename, "rb"); + if (stream==NULL) + return 0; + + fseek(stream,0,SEEK_END); + + *plFileSize=ftell(stream); + fseek(stream,0,SEEK_SET); + ptr=malloc((*plFileSize)+1); + if (ptr==NULL) + retVal=0; + else + { + if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize)) + retVal=0; + } + fclose(stream); + *pFilePtr=ptr; + return retVal; +} + +int main(int argc, char *argv[]) +{ + int BlockSizeCompress=0x8000; + int BlockSizeUncompress=0x8000; + int cprLevel=Z_DEFAULT_COMPRESSION ; + long lFileSize; + unsigned char* FilePtr; + long lBufferSizeCpr; + long lBufferSizeUncpr; + long lCompressedSize=0; + unsigned char* CprPtr; + unsigned char* UncprPtr; + long lSizeCpr,lSizeUncpr; + DWORD dwGetTick,dwMsecQP; + LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc; + + if (argc<=1) + { + printf("run TestZlib [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n"); + return 0; + } + + if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0) + { + printf("error reading %s\n",argv[1]); + return 1; + } + else printf("file %s read, %u bytes\n",argv[1],lFileSize); + + if (argc>=3) + BlockSizeCompress=atol(argv[2]); + + if (argc>=4) + BlockSizeUncompress=atol(argv[3]); + + if (argc>=5) + cprLevel=(int)atol(argv[4]); + + lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200; + lBufferSizeUncpr = lBufferSizeCpr; + + CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress); + + BeginCountPerfCounter(&li_qp,TRUE); + dwGetTick=GetTickCount(); + BeginCountRdtsc(&li_rdtsc); + { + z_stream zcpr; + int ret=Z_OK; + long lOrigToDo = lFileSize; + long lOrigDone = 0; + int step=0; + memset(&zcpr,0,sizeof(z_stream)); + deflateInit(&zcpr,cprLevel); + + zcpr.next_in = FilePtr; + zcpr.next_out = CprPtr; + + + do + { + long all_read_before = zcpr.total_in; + zcpr.avail_in = min(lOrigToDo,BlockSizeCompress); + zcpr.avail_out = BlockSizeCompress; + ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH); + lOrigDone += (zcpr.total_in-all_read_before); + lOrigToDo -= (zcpr.total_in-all_read_before); + step++; + } while (ret==Z_OK); + + lSizeCpr=zcpr.total_out; + deflateEnd(&zcpr); + dwGetTick=GetTickCount()-dwGetTick; + dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE); + dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE); + printf("total compress size = %u, in %u step\n",lSizeCpr,step); + printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.); + printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.); + printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart); + } + + CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr); + UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress); + + BeginCountPerfCounter(&li_qp,TRUE); + dwGetTick=GetTickCount(); + BeginCountRdtsc(&li_rdtsc); + { + z_stream zcpr; + int ret=Z_OK; + long lOrigToDo = lSizeCpr; + long lOrigDone = 0; + int step=0; + memset(&zcpr,0,sizeof(z_stream)); + inflateInit(&zcpr); + + zcpr.next_in = CprPtr; + zcpr.next_out = UncprPtr; + + + do + { + long all_read_before = zcpr.total_in; + zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress); + zcpr.avail_out = BlockSizeUncompress; + ret=inflate(&zcpr,Z_SYNC_FLUSH); + lOrigDone += (zcpr.total_in-all_read_before); + lOrigToDo -= (zcpr.total_in-all_read_before); + step++; + } while (ret==Z_OK); + + lSizeUncpr=zcpr.total_out; + inflateEnd(&zcpr); + dwGetTick=GetTickCount()-dwGetTick; + dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE); + dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE); + printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step); + printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.); + printf("uncpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.); + printf("uncpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart); + } + + if (lSizeUncpr==lFileSize) + { + if (memcmp(FilePtr,UncprPtr,lFileSize)==0) + printf("compare ok\n"); + + } + + return 0; +} diff --git a/externe_kniznice/zlib/contrib/testzlib/testzlib.txt b/externe_kniznice/zlib/contrib/testzlib/testzlib.txt new file mode 100644 index 0000000..e508bb2 --- /dev/null +++ b/externe_kniznice/zlib/contrib/testzlib/testzlib.txt @@ -0,0 +1,10 @@ +To build testzLib with Visual Studio 2005: + +copy to a directory file from : +- root of zLib tree +- contrib/testzlib +- contrib/masmx86 +- contrib/masmx64 +- contrib/vstudio/vc7 + +and open testzlib8.sln \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/untgz/Makefile b/externe_kniznice/zlib/contrib/untgz/Makefile new file mode 100644 index 0000000..b54266f --- /dev/null +++ b/externe_kniznice/zlib/contrib/untgz/Makefile @@ -0,0 +1,14 @@ +CC=cc +CFLAGS=-g + +untgz: untgz.o ../../libz.a + $(CC) $(CFLAGS) -o untgz untgz.o -L../.. -lz + +untgz.o: untgz.c ../../zlib.h + $(CC) $(CFLAGS) -c -I../.. untgz.c + +../../libz.a: + cd ../..; ./configure; make + +clean: + rm -f untgz untgz.o *~ diff --git a/externe_kniznice/zlib/contrib/untgz/Makefile.msc b/externe_kniznice/zlib/contrib/untgz/Makefile.msc new file mode 100644 index 0000000..77b8602 --- /dev/null +++ b/externe_kniznice/zlib/contrib/untgz/Makefile.msc @@ -0,0 +1,17 @@ +CC=cl +CFLAGS=-MD + +untgz.exe: untgz.obj ..\..\zlib.lib + $(CC) $(CFLAGS) untgz.obj ..\..\zlib.lib + +untgz.obj: untgz.c ..\..\zlib.h + $(CC) $(CFLAGS) -c -I..\.. untgz.c + +..\..\zlib.lib: + cd ..\.. + $(MAKE) -f win32\makefile.msc + cd contrib\untgz + +clean: + -del untgz.obj + -del untgz.exe diff --git a/externe_kniznice/zlib/contrib/untgz/untgz.c b/externe_kniznice/zlib/contrib/untgz/untgz.c new file mode 100644 index 0000000..2c391e5 --- /dev/null +++ b/externe_kniznice/zlib/contrib/untgz/untgz.c @@ -0,0 +1,674 @@ +/* + * untgz.c -- Display contents and extract files from a gzip'd TAR file + * + * written by Pedro A. Aranda Gutierrez + * adaptation to Unix by Jean-loup Gailly + * various fixes by Cosmin Truta + */ + +#include +#include +#include +#include +#include + +#include "zlib.h" + +#ifdef unix +# include +#else +# include +# include +#endif + +#ifdef WIN32 +#include +# ifndef F_OK +# define F_OK 0 +# endif +# define mkdir(dirname,mode) _mkdir(dirname) +# ifdef _MSC_VER +# define access(path,mode) _access(path,mode) +# define chmod(path,mode) _chmod(path,mode) +# define strdup(str) _strdup(str) +# endif +#else +# include +#endif + + +/* values used in typeflag field */ + +#define REGTYPE '0' /* regular file */ +#define AREGTYPE '\0' /* regular file */ +#define LNKTYPE '1' /* link */ +#define SYMTYPE '2' /* reserved */ +#define CHRTYPE '3' /* character special */ +#define BLKTYPE '4' /* block special */ +#define DIRTYPE '5' /* directory */ +#define FIFOTYPE '6' /* FIFO special */ +#define CONTTYPE '7' /* reserved */ + +/* GNU tar extensions */ + +#define GNUTYPE_DUMPDIR 'D' /* file names from dumped directory */ +#define GNUTYPE_LONGLINK 'K' /* long link name */ +#define GNUTYPE_LONGNAME 'L' /* long file name */ +#define GNUTYPE_MULTIVOL 'M' /* continuation of file from another volume */ +#define GNUTYPE_NAMES 'N' /* file name that does not fit into main hdr */ +#define GNUTYPE_SPARSE 'S' /* sparse file */ +#define GNUTYPE_VOLHDR 'V' /* tape/volume header */ + + +/* tar header */ + +#define BLOCKSIZE 512 +#define SHORTNAMESIZE 100 + +struct tar_header +{ /* byte offset */ + char name[100]; /* 0 */ + char mode[8]; /* 100 */ + char uid[8]; /* 108 */ + char gid[8]; /* 116 */ + char size[12]; /* 124 */ + char mtime[12]; /* 136 */ + char chksum[8]; /* 148 */ + char typeflag; /* 156 */ + char linkname[100]; /* 157 */ + char magic[6]; /* 257 */ + char version[2]; /* 263 */ + char uname[32]; /* 265 */ + char gname[32]; /* 297 */ + char devmajor[8]; /* 329 */ + char devminor[8]; /* 337 */ + char prefix[155]; /* 345 */ + /* 500 */ +}; + +union tar_buffer +{ + char buffer[BLOCKSIZE]; + struct tar_header header; +}; + +struct attr_item +{ + struct attr_item *next; + char *fname; + int mode; + time_t time; +}; + +enum { TGZ_EXTRACT, TGZ_LIST, TGZ_INVALID }; + +char *TGZfname OF((const char *)); +void TGZnotfound OF((const char *)); + +int getoct OF((char *, int)); +char *strtime OF((time_t *)); +int setfiletime OF((char *, time_t)); +void push_attr OF((struct attr_item **, char *, int, time_t)); +void restore_attr OF((struct attr_item **)); + +int ExprMatch OF((char *, char *)); + +int makedir OF((char *)); +int matchname OF((int, int, char **, char *)); + +void error OF((const char *)); +int tar OF((gzFile, int, int, int, char **)); + +void help OF((int)); +int main OF((int, char **)); + +char *prog; + +const char *TGZsuffix[] = { "\0", ".tar", ".tar.gz", ".taz", ".tgz", NULL }; + +/* return the file name of the TGZ archive */ +/* or NULL if it does not exist */ + +char *TGZfname (const char *arcname) +{ + static char buffer[1024]; + int origlen,i; + + strcpy(buffer,arcname); + origlen = strlen(buffer); + + for (i=0; TGZsuffix[i]; i++) + { + strcpy(buffer+origlen,TGZsuffix[i]); + if (access(buffer,F_OK) == 0) + return buffer; + } + return NULL; +} + + +/* error message for the filename */ + +void TGZnotfound (const char *arcname) +{ + int i; + + fprintf(stderr,"%s: Couldn't find ",prog); + for (i=0;TGZsuffix[i];i++) + fprintf(stderr,(TGZsuffix[i+1]) ? "%s%s, " : "or %s%s\n", + arcname, + TGZsuffix[i]); + exit(1); +} + + +/* convert octal digits to int */ +/* on error return -1 */ + +int getoct (char *p,int width) +{ + int result = 0; + char c; + + while (width--) + { + c = *p++; + if (c == 0) + break; + if (c == ' ') + continue; + if (c < '0' || c > '7') + return -1; + result = result * 8 + (c - '0'); + } + return result; +} + + +/* convert time_t to string */ +/* use the "YYYY/MM/DD hh:mm:ss" format */ + +char *strtime (time_t *t) +{ + struct tm *local; + static char result[32]; + + local = localtime(t); + sprintf(result,"%4d/%02d/%02d %02d:%02d:%02d", + local->tm_year+1900, local->tm_mon+1, local->tm_mday, + local->tm_hour, local->tm_min, local->tm_sec); + return result; +} + + +/* set file time */ + +int setfiletime (char *fname,time_t ftime) +{ +#ifdef WIN32 + static int isWinNT = -1; + SYSTEMTIME st; + FILETIME locft, modft; + struct tm *loctm; + HANDLE hFile; + int result; + + loctm = localtime(&ftime); + if (loctm == NULL) + return -1; + + st.wYear = (WORD)loctm->tm_year + 1900; + st.wMonth = (WORD)loctm->tm_mon + 1; + st.wDayOfWeek = (WORD)loctm->tm_wday; + st.wDay = (WORD)loctm->tm_mday; + st.wHour = (WORD)loctm->tm_hour; + st.wMinute = (WORD)loctm->tm_min; + st.wSecond = (WORD)loctm->tm_sec; + st.wMilliseconds = 0; + if (!SystemTimeToFileTime(&st, &locft) || + !LocalFileTimeToFileTime(&locft, &modft)) + return -1; + + if (isWinNT < 0) + isWinNT = (GetVersion() < 0x80000000) ? 1 : 0; + hFile = CreateFile(fname, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, + (isWinNT ? FILE_FLAG_BACKUP_SEMANTICS : 0), + NULL); + if (hFile == INVALID_HANDLE_VALUE) + return -1; + result = SetFileTime(hFile, NULL, NULL, &modft) ? 0 : -1; + CloseHandle(hFile); + return result; +#else + struct utimbuf settime; + + settime.actime = settime.modtime = ftime; + return utime(fname,&settime); +#endif +} + + +/* push file attributes */ + +void push_attr(struct attr_item **list,char *fname,int mode,time_t time) +{ + struct attr_item *item; + + item = (struct attr_item *)malloc(sizeof(struct attr_item)); + if (item == NULL) + error("Out of memory"); + item->fname = strdup(fname); + item->mode = mode; + item->time = time; + item->next = *list; + *list = item; +} + + +/* restore file attributes */ + +void restore_attr(struct attr_item **list) +{ + struct attr_item *item, *prev; + + for (item = *list; item != NULL; ) + { + setfiletime(item->fname,item->time); + chmod(item->fname,item->mode); + prev = item; + item = item->next; + free(prev); + } + *list = NULL; +} + + +/* match regular expression */ + +#define ISSPECIAL(c) (((c) == '*') || ((c) == '/')) + +int ExprMatch (char *string,char *expr) +{ + while (1) + { + if (ISSPECIAL(*expr)) + { + if (*expr == '/') + { + if (*string != '\\' && *string != '/') + return 0; + string ++; expr++; + } + else if (*expr == '*') + { + if (*expr ++ == 0) + return 1; + while (*++string != *expr) + if (*string == 0) + return 0; + } + } + else + { + if (*string != *expr) + return 0; + if (*expr++ == 0) + return 1; + string++; + } + } +} + + +/* recursive mkdir */ +/* abort on ENOENT; ignore other errors like "directory already exists" */ +/* return 1 if OK */ +/* 0 on error */ + +int makedir (char *newdir) +{ + char *buffer = strdup(newdir); + char *p; + int len = strlen(buffer); + + if (len <= 0) { + free(buffer); + return 0; + } + if (buffer[len-1] == '/') { + buffer[len-1] = '\0'; + } + if (mkdir(buffer, 0755) == 0) + { + free(buffer); + return 1; + } + + p = buffer+1; + while (1) + { + char hold; + + while(*p && *p != '\\' && *p != '/') + p++; + hold = *p; + *p = 0; + if ((mkdir(buffer, 0755) == -1) && (errno == ENOENT)) + { + fprintf(stderr,"%s: Couldn't create directory %s\n",prog,buffer); + free(buffer); + return 0; + } + if (hold == 0) + break; + *p++ = hold; + } + free(buffer); + return 1; +} + + +int matchname (int arg,int argc,char **argv,char *fname) +{ + if (arg == argc) /* no arguments given (untgz tgzarchive) */ + return 1; + + while (arg < argc) + if (ExprMatch(fname,argv[arg++])) + return 1; + + return 0; /* ignore this for the moment being */ +} + + +/* tar file list or extract */ + +int tar (gzFile in,int action,int arg,int argc,char **argv) +{ + union tar_buffer buffer; + int len; + int err; + int getheader = 1; + int remaining = 0; + FILE *outfile = NULL; + char fname[BLOCKSIZE]; + int tarmode; + time_t tartime; + struct attr_item *attributes = NULL; + + if (action == TGZ_LIST) + printf(" date time size file\n" + " ---------- -------- --------- -------------------------------------\n"); + while (1) + { + len = gzread(in, &buffer, BLOCKSIZE); + if (len < 0) + error(gzerror(in, &err)); + /* + * Always expect complete blocks to process + * the tar information. + */ + if (len != BLOCKSIZE) + { + action = TGZ_INVALID; /* force error exit */ + remaining = 0; /* force I/O cleanup */ + } + + /* + * If we have to get a tar header + */ + if (getheader >= 1) + { + /* + * if we met the end of the tar + * or the end-of-tar block, + * we are done + */ + if (len == 0 || buffer.header.name[0] == 0) + break; + + tarmode = getoct(buffer.header.mode,8); + tartime = (time_t)getoct(buffer.header.mtime,12); + if (tarmode == -1 || tartime == (time_t)-1) + { + buffer.header.name[0] = 0; + action = TGZ_INVALID; + } + + if (getheader == 1) + { + strncpy(fname,buffer.header.name,SHORTNAMESIZE); + if (fname[SHORTNAMESIZE-1] != 0) + fname[SHORTNAMESIZE] = 0; + } + else + { + /* + * The file name is longer than SHORTNAMESIZE + */ + if (strncmp(fname,buffer.header.name,SHORTNAMESIZE-1) != 0) + error("bad long name"); + getheader = 1; + } + + /* + * Act according to the type flag + */ + switch (buffer.header.typeflag) + { + case DIRTYPE: + if (action == TGZ_LIST) + printf(" %s %s\n",strtime(&tartime),fname); + if (action == TGZ_EXTRACT) + { + makedir(fname); + push_attr(&attributes,fname,tarmode,tartime); + } + break; + case REGTYPE: + case AREGTYPE: + remaining = getoct(buffer.header.size,12); + if (remaining == -1) + { + action = TGZ_INVALID; + break; + } + if (action == TGZ_LIST) + printf(" %s %9d %s\n",strtime(&tartime),remaining,fname); + else if (action == TGZ_EXTRACT) + { + if (matchname(arg,argc,argv,fname)) + { + outfile = fopen(fname,"wb"); + if (outfile == NULL) { + /* try creating directory */ + char *p = strrchr(fname, '/'); + if (p != NULL) { + *p = '\0'; + makedir(fname); + *p = '/'; + outfile = fopen(fname,"wb"); + } + } + if (outfile != NULL) + printf("Extracting %s\n",fname); + else + fprintf(stderr, "%s: Couldn't create %s",prog,fname); + } + else + outfile = NULL; + } + getheader = 0; + break; + case GNUTYPE_LONGLINK: + case GNUTYPE_LONGNAME: + remaining = getoct(buffer.header.size,12); + if (remaining < 0 || remaining >= BLOCKSIZE) + { + action = TGZ_INVALID; + break; + } + len = gzread(in, fname, BLOCKSIZE); + if (len < 0) + error(gzerror(in, &err)); + if (fname[BLOCKSIZE-1] != 0 || (int)strlen(fname) > remaining) + { + action = TGZ_INVALID; + break; + } + getheader = 2; + break; + default: + if (action == TGZ_LIST) + printf(" %s <---> %s\n",strtime(&tartime),fname); + break; + } + } + else + { + unsigned int bytes = (remaining > BLOCKSIZE) ? BLOCKSIZE : remaining; + + if (outfile != NULL) + { + if (fwrite(&buffer,sizeof(char),bytes,outfile) != bytes) + { + fprintf(stderr, + "%s: Error writing %s -- skipping\n",prog,fname); + fclose(outfile); + outfile = NULL; + remove(fname); + } + } + remaining -= bytes; + } + + if (remaining == 0) + { + getheader = 1; + if (outfile != NULL) + { + fclose(outfile); + outfile = NULL; + if (action != TGZ_INVALID) + push_attr(&attributes,fname,tarmode,tartime); + } + } + + /* + * Abandon if errors are found + */ + if (action == TGZ_INVALID) + { + error("broken archive"); + break; + } + } + + /* + * Restore file modes and time stamps + */ + restore_attr(&attributes); + + if (gzclose(in) != Z_OK) + error("failed gzclose"); + + return 0; +} + + +/* ============================================================ */ + +void help(int exitval) +{ + printf("untgz version 0.2.1\n" + " using zlib version %s\n\n", + zlibVersion()); + printf("Usage: untgz file.tgz extract all files\n" + " untgz file.tgz fname ... extract selected files\n" + " untgz -l file.tgz list archive contents\n" + " untgz -h display this help\n"); + exit(exitval); +} + +void error(const char *msg) +{ + fprintf(stderr, "%s: %s\n", prog, msg); + exit(1); +} + + +/* ============================================================ */ + +#if defined(WIN32) && defined(__GNUC__) +int _CRT_glob = 0; /* disable argument globbing in MinGW */ +#endif + +int main(int argc,char **argv) +{ + int action = TGZ_EXTRACT; + int arg = 1; + char *TGZfile; + gzFile *f; + + prog = strrchr(argv[0],'\\'); + if (prog == NULL) + { + prog = strrchr(argv[0],'/'); + if (prog == NULL) + { + prog = strrchr(argv[0],':'); + if (prog == NULL) + prog = argv[0]; + else + prog++; + } + else + prog++; + } + else + prog++; + + if (argc == 1) + help(0); + + if (strcmp(argv[arg],"-l") == 0) + { + action = TGZ_LIST; + if (argc == ++arg) + help(0); + } + else if (strcmp(argv[arg],"-h") == 0) + { + help(0); + } + + if ((TGZfile = TGZfname(argv[arg])) == NULL) + TGZnotfound(argv[arg]); + + ++arg; + if ((action == TGZ_LIST) && (arg != argc)) + help(1); + +/* + * Process the TGZ file + */ + switch(action) + { + case TGZ_LIST: + case TGZ_EXTRACT: + f = gzopen(TGZfile,"rb"); + if (f == NULL) + { + fprintf(stderr,"%s: Couldn't gzopen %s\n",prog,TGZfile); + return 1; + } + exit(tar(f, action, arg, argc, argv)); + break; + + default: + error("Unknown option"); + exit(1); + } + + return 0; +} diff --git a/externe_kniznice/zlib/contrib/vstudio/readme.txt b/externe_kniznice/zlib/contrib/vstudio/readme.txt new file mode 100644 index 0000000..48cccc0 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/readme.txt @@ -0,0 +1,78 @@ +Building instructions for the DLL versions of Zlib 1.2.11 +======================================================== + +This directory contains projects that build zlib and minizip using +Microsoft Visual C++ 9.0/10.0. + +You don't need to build these projects yourself. You can download the +binaries from: + http://www.winimage.com/zLibDll + +More information can be found at this site. + + + + + +Build instructions for Visual Studio 2008 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Compile assembly code (with Visual Studio Command Prompt) by running: + bld_ml64.bat (in contrib\masmx64) + bld_ml32.bat (in contrib\masmx86) +- Open contrib\vstudio\vc9\zlibvc.sln with Microsoft Visual C++ 2008 +- Or run: vcbuild /rebuild contrib\vstudio\vc9\zlibvc.sln "Release|Win32" + +Build instructions for Visual Studio 2010 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc10\zlibvc.sln with Microsoft Visual C++ 2010 + +Build instructions for Visual Studio 2012 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc11\zlibvc.sln with Microsoft Visual C++ 2012 + +Build instructions for Visual Studio 2013 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc12\zlibvc.sln with Microsoft Visual C++ 2013 + +Build instructions for Visual Studio 2015 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc14\zlibvc.sln with Microsoft Visual C++ 2015 + + +Important +--------- +- To use zlibwapi.dll in your application, you must define the + macro ZLIB_WINAPI when compiling your application's source files. + + +Additional notes +---------------- +- This DLL, named zlibwapi.dll, is compatible to the old zlib.dll built + by Gilles Vollant from the zlib 1.1.x sources, and distributed at + http://www.winimage.com/zLibDll + It uses the WINAPI calling convention for the exported functions, and + includes the minizip functionality. If your application needs that + particular build of zlib.dll, you can rename zlibwapi.dll to zlib.dll. + +- The new DLL was renamed because there exist several incompatible + versions of zlib.dll on the Internet. + +- There is also an official DLL build of zlib, named zlib1.dll. This one + is exporting the functions using the CDECL convention. See the file + win32\DLL_FAQ.txt found in this zlib distribution. + +- There used to be a ZLIB_DLL macro in zlib 1.1.x, but now this symbol + has a slightly different effect. To avoid compatibility problems, do + not define it here. + + +Gilles Vollant +info@winimage.com + +Visual Studio 2013 and 2015 Projects from Sean Hunt +seandhunt_7@yahoo.com diff --git a/externe_kniznice/zlib/contrib/vstudio/vc10/miniunz.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc10/miniunz.vcxproj new file mode 100644 index 0000000..1b36242 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc10/miniunz.vcxproj @@ -0,0 +1,310 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694382A} + Win32Proj + + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + true + false + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + false + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + true + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + true + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + false + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebug + false + + + $(IntDir) + Level3 + EditAndContinue + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc10/miniunz.vcxproj.filters b/externe_kniznice/zlib/contrib/vstudio/vc10/miniunz.vcxproj.filters new file mode 100644 index 0000000..0bd1221 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc10/miniunz.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {048af943-022b-4db6-beeb-a54c34774ee2} + cpp;c;cxx;def;odl;idl;hpj;bat;asm + + + {c1d600d2-888f-4aea-b73e-8b0dd9befa0c} + h;hpp;hxx;hm;inl;inc + + + {0844199a-966b-4f19-81db-1e0125e141b9} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc10/minizip.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc10/minizip.vcxproj new file mode 100644 index 0000000..ccd3651 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc10/minizip.vcxproj @@ -0,0 +1,307 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B} + Win32Proj + + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + true + false + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + false + x64\$(Configuration)\ + x64\$(Configuration)\ + true + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + true + false + x64\$(Configuration)\ + x64\$(Configuration)\ + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebug + false + + + $(IntDir) + Level3 + EditAndContinue + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc10/minizip.vcxproj.filters b/externe_kniznice/zlib/contrib/vstudio/vc10/minizip.vcxproj.filters new file mode 100644 index 0000000..7076d76 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc10/minizip.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {c0419b40-bf50-40da-b153-ff74215b79de} + cpp;c;cxx;def;odl;idl;hpj;bat;asm + + + {bb87b070-735b-478e-92ce-7383abb2f36c} + h;hpp;hxx;hm;inl;inc + + + {f46ab6a6-548f-43cb-ae96-681abb5bd5db} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc10/testzlib.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc10/testzlib.vcxproj new file mode 100644 index 0000000..476b8ea --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc10/testzlib.vcxproj @@ -0,0 +1,420 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B} + testzlib + Win32Proj + + + + Application + MultiByte + true + + + Application + MultiByte + true + + + Application + MultiByte + + + Application + MultiByte + true + + + Application + MultiByte + true + + + Application + MultiByte + + + Application + true + + + Application + true + + + Application + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + true + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + true + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebug + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + EditAndContinue + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc10/testzlib.vcxproj.filters b/externe_kniznice/zlib/contrib/vstudio/vc10/testzlib.vcxproj.filters new file mode 100644 index 0000000..3276491 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc10/testzlib.vcxproj.filters @@ -0,0 +1,58 @@ + + + + + {c1f6a2e3-5da5-4955-8653-310d3efe05a9} + cpp;c;cxx;def;odl;idl;hpj;bat;asm + + + {c2aaffdc-2c95-4d6f-8466-4bec5890af2c} + h;hpp;hxx;hm;inl;inc + + + {c274fe07-05f2-461c-964b-f6341e4e7eb5} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj new file mode 100644 index 0000000..8e38876 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj @@ -0,0 +1,310 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694366A} + Win32Proj + + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + true + false + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + false + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + true + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + true + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + false + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebug + false + + + $(IntDir) + Level3 + EditAndContinue + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj.filters b/externe_kniznice/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj.filters new file mode 100644 index 0000000..ab87f09 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {fa61a89f-93fc-4c89-b29e-36224b7592f4} + cpp;c;cxx;def;odl;idl;hpj;bat;asm + + + {d4b85da0-2ba2-4934-b57f-e2584e3848ee} + h;hpp;hxx;hm;inl;inc + + + {e573e075-00bd-4a7d-bd67-a8cc9bfc5aca} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc10/zlib.rc b/externe_kniznice/zlib/contrib/vstudio/vc10/zlib.rc new file mode 100644 index 0000000..c4e4b01 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc10/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 2, 11, 0 + PRODUCTVERSION 1, 2, 11, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.11\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/externe_kniznice/zlib/contrib/vstudio/vc10/zlibstat.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc10/zlibstat.vcxproj new file mode 100644 index 0000000..45389a3 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc10/zlibstat.vcxproj @@ -0,0 +1,473 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8} + + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + + + MultiThreadedDebug + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + cd ..\..\masmx64 +bld_ml64.bat + + + + + Itanium + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + cd ..\..\masmx64 +bld_ml64.bat + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc10/zlibstat.vcxproj.filters b/externe_kniznice/zlib/contrib/vstudio/vc10/zlibstat.vcxproj.filters new file mode 100644 index 0000000..0c8b250 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc10/zlibstat.vcxproj.filters @@ -0,0 +1,77 @@ + + + + + {174213f6-7f66-4ae8-a3a8-a1e0a1e6ffdd} + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Source Files + + + + + Source Files + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc10/zlibvc.def b/externe_kniznice/zlib/contrib/vstudio/vc10/zlibvc.def new file mode 100644 index 0000000..f876c3b --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc10/zlibvc.def @@ -0,0 +1,153 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.2 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 diff --git a/externe_kniznice/zlib/contrib/vstudio/vc10/zlibvc.sln b/externe_kniznice/zlib/contrib/vstudio/vc10/zlibvc.sln new file mode 100644 index 0000000..649f40c --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc10/zlibvc.sln @@ -0,0 +1,135 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcxproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlibdll", "testzlibdll.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcxproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Itanium = Debug|Itanium + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Itanium = Release|Itanium + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.Build.0 = Debug|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.Build.0 = Release|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.Build.0 = Debug|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.Build.0 = Release|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.Build.0 = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.Build.0 = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/externe_kniznice/zlib/contrib/vstudio/vc10/zlibvc.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc10/zlibvc.vcxproj new file mode 100644 index 0000000..7d7c49a --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc10/zlibvc.vcxproj @@ -0,0 +1,657 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {8FD826F8-3739-44E6-8CC8-997122E53B8D} + + + + DynamicLibrary + false + true + + + DynamicLibrary + false + true + + + DynamicLibrary + false + + + DynamicLibrary + false + true + + + DynamicLibrary + false + true + + + DynamicLibrary + false + + + DynamicLibrary + false + true + + + DynamicLibrary + false + true + + + DynamicLibrary + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + true + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + true + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + true + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + zlibwapid + zlibwapi + zlibwapi + zlibwapid + zlibwapi + zlibwapi + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + + + MultiThreadedDebug + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + EditAndContinue + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + true + .\zlibvc.def + true + true + Windows + false + + + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + true + false + .\zlibvc.def + true + Windows + false + + + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + true + false + .\zlibvc.def + true + Windows + false + + + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + true + .\zlibvc.def + true + true + Windows + MachineX64 + + + cd ..\..\masmx64 +bld_ml64.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + true + false + .\zlibvc.def + true + Windows + MachineX64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + true + false + .\zlibvc.def + true + Windows + MachineX64 + + + cd ..\..\masmx64 +bld_ml64.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc10/zlibvc.vcxproj.filters b/externe_kniznice/zlib/contrib/vstudio/vc10/zlibvc.vcxproj.filters new file mode 100644 index 0000000..2278682 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc10/zlibvc.vcxproj.filters @@ -0,0 +1,118 @@ + + + + + {07934a85-8b61-443d-a0ee-b2eedb74f3cd} + cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90 + + + {1d99675b-433d-4a21-9e50-ed4ab8b19762} + h;hpp;hxx;hm;inl;fi;fd + + + {431c0958-fa71-44d0-9084-2d19d100c0cc} + ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Source Files + + + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc11/miniunz.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc11/miniunz.vcxproj new file mode 100644 index 0000000..99be63d --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc11/miniunz.vcxproj @@ -0,0 +1,314 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694382A} + Win32Proj + + + + Application + MultiByte + v110 + + + Application + Unicode + v110 + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + v110 + + + Application + MultiByte + v110 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + true + false + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + false + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + true + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + true + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + false + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc11/minizip.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc11/minizip.vcxproj new file mode 100644 index 0000000..d6e98f4 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc11/minizip.vcxproj @@ -0,0 +1,311 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B} + Win32Proj + + + + Application + MultiByte + v110 + + + Application + Unicode + v110 + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + v110 + + + Application + MultiByte + v110 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + true + false + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + false + x64\$(Configuration)\ + x64\$(Configuration)\ + true + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + true + false + x64\$(Configuration)\ + x64\$(Configuration)\ + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc11/testzlib.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc11/testzlib.vcxproj new file mode 100644 index 0000000..0115dd1 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc11/testzlib.vcxproj @@ -0,0 +1,426 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B} + testzlib + Win32Proj + + + + Application + MultiByte + true + v110 + + + Application + MultiByte + true + v110 + + + Application + Unicode + v110 + + + Application + MultiByte + true + + + Application + MultiByte + true + + + Application + MultiByte + + + Application + true + v110 + + + Application + true + v110 + + + Application + v110 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + true + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + true + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc11/testzlibdll.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc11/testzlibdll.vcxproj new file mode 100644 index 0000000..9d36336 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc11/testzlibdll.vcxproj @@ -0,0 +1,314 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694366A} + Win32Proj + + + + Application + MultiByte + v110 + + + Application + Unicode + v110 + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + v110 + + + Application + MultiByte + v110 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + true + false + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + false + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + true + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + true + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + false + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc11/zlib.rc b/externe_kniznice/zlib/contrib/vstudio/vc11/zlib.rc new file mode 100644 index 0000000..c4e4b01 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc11/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 2, 11, 0 + PRODUCTVERSION 1, 2, 11, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.11\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/externe_kniznice/zlib/contrib/vstudio/vc11/zlibstat.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc11/zlibstat.vcxproj new file mode 100644 index 0000000..64b4d86 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc11/zlibstat.vcxproj @@ -0,0 +1,464 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8} + + + + StaticLibrary + false + v110 + + + StaticLibrary + false + v110 + + + StaticLibrary + false + v110 + Unicode + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + v110 + + + StaticLibrary + false + v110 + + + StaticLibrary + false + v110 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc11/zlibvc.def b/externe_kniznice/zlib/contrib/vstudio/vc11/zlibvc.def new file mode 100644 index 0000000..f876c3b --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc11/zlibvc.def @@ -0,0 +1,153 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.2 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 diff --git a/externe_kniznice/zlib/contrib/vstudio/vc11/zlibvc.sln b/externe_kniznice/zlib/contrib/vstudio/vc11/zlibvc.sln new file mode 100644 index 0000000..b7e3812 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc11/zlibvc.sln @@ -0,0 +1,117 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcxproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlibdll", "testzlibdll.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcxproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Itanium = Debug|Itanium + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Itanium = Release|Itanium + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/externe_kniznice/zlib/contrib/vstudio/vc11/zlibvc.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc11/zlibvc.vcxproj new file mode 100644 index 0000000..c4cffcc --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc11/zlibvc.vcxproj @@ -0,0 +1,688 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {8FD826F8-3739-44E6-8CC8-997122E53B8D} + + + + DynamicLibrary + false + true + v110 + + + DynamicLibrary + false + true + v110 + + + DynamicLibrary + false + v110 + Unicode + + + DynamicLibrary + false + true + + + DynamicLibrary + false + true + + + DynamicLibrary + false + + + DynamicLibrary + false + true + v110 + + + DynamicLibrary + false + true + v110 + + + DynamicLibrary + false + v110 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + true + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + true + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + true + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + cd ..\..\contrib\masmx64 +bld_ml64.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + cd ..\..\masmx64 +bld_ml64.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc12/miniunz.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc12/miniunz.vcxproj new file mode 100644 index 0000000..d88ac7f --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc12/miniunz.vcxproj @@ -0,0 +1,316 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694382A} + Win32Proj + + + + Application + MultiByte + v120 + + + Application + Unicode + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + true + false + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + false + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + true + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + true + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + false + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc12/minizip.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc12/minizip.vcxproj new file mode 100644 index 0000000..f1f239c --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc12/minizip.vcxproj @@ -0,0 +1,313 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B} + Win32Proj + + + + Application + MultiByte + v120 + + + Application + Unicode + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + true + false + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + false + x64\$(Configuration)\ + x64\$(Configuration)\ + true + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + true + false + x64\$(Configuration)\ + x64\$(Configuration)\ + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc12/testzlib.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc12/testzlib.vcxproj new file mode 100644 index 0000000..64b2cbe --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc12/testzlib.vcxproj @@ -0,0 +1,430 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B} + testzlib + Win32Proj + + + + Application + MultiByte + true + v120 + + + Application + MultiByte + true + v120 + + + Application + Unicode + v120 + + + Application + MultiByte + true + v120 + + + Application + MultiByte + true + v120 + + + Application + MultiByte + v120 + + + Application + true + v120 + + + Application + true + v120 + + + Application + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + true + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + true + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + false + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc12/testzlibdll.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc12/testzlibdll.vcxproj new file mode 100644 index 0000000..c66573a --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc12/testzlibdll.vcxproj @@ -0,0 +1,316 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694366A} + Win32Proj + + + + Application + MultiByte + v120 + + + Application + Unicode + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + Application + MultiByte + v120 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + true + false + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + false + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + true + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + true + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + false + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc12/zlib.rc b/externe_kniznice/zlib/contrib/vstudio/vc12/zlib.rc new file mode 100644 index 0000000..c4e4b01 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc12/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 2, 11, 0 + PRODUCTVERSION 1, 2, 11, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.11\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/externe_kniznice/zlib/contrib/vstudio/vc12/zlibstat.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc12/zlibstat.vcxproj new file mode 100644 index 0000000..3fdee7c --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc12/zlibstat.vcxproj @@ -0,0 +1,467 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8} + + + + StaticLibrary + false + v120 + + + StaticLibrary + false + v120 + + + StaticLibrary + false + v120 + Unicode + + + StaticLibrary + false + v120 + + + StaticLibrary + false + v120 + + + StaticLibrary + false + v120 + + + StaticLibrary + false + v120 + + + StaticLibrary + false + v120 + + + StaticLibrary + false + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc12/zlibvc.def b/externe_kniznice/zlib/contrib/vstudio/vc12/zlibvc.def new file mode 100644 index 0000000..f876c3b --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc12/zlibvc.def @@ -0,0 +1,153 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.2 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 diff --git a/externe_kniznice/zlib/contrib/vstudio/vc12/zlibvc.sln b/externe_kniznice/zlib/contrib/vstudio/vc12/zlibvc.sln new file mode 100644 index 0000000..dcda229 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc12/zlibvc.sln @@ -0,0 +1,119 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcxproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlibdll", "testzlibdll.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcxproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Itanium = Debug|Itanium + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Itanium = Release|Itanium + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/externe_kniznice/zlib/contrib/vstudio/vc12/zlibvc.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc12/zlibvc.vcxproj new file mode 100644 index 0000000..ab2b6c3 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc12/zlibvc.vcxproj @@ -0,0 +1,692 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {8FD826F8-3739-44E6-8CC8-997122E53B8D} + + + + DynamicLibrary + false + true + v120 + + + DynamicLibrary + false + true + v120 + + + DynamicLibrary + false + v120 + Unicode + + + DynamicLibrary + false + true + v120 + + + DynamicLibrary + false + true + v120 + + + DynamicLibrary + false + v120 + + + DynamicLibrary + false + true + v120 + + + DynamicLibrary + false + true + v120 + + + DynamicLibrary + false + v120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + true + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + true + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + true + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + false + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + cd ..\..\contrib\masmx64 +bld_ml64.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + cd ..\..\masmx64 +bld_ml64.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc14/miniunz.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc14/miniunz.vcxproj new file mode 100644 index 0000000..9b5c075 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc14/miniunz.vcxproj @@ -0,0 +1,316 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694382A} + Win32Proj + + + + Application + MultiByte + v140 + + + Application + Unicode + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + true + false + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + false + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + true + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + true + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + false + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc14/minizip.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc14/minizip.vcxproj new file mode 100644 index 0000000..968a410 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc14/minizip.vcxproj @@ -0,0 +1,313 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B} + Win32Proj + + + + Application + MultiByte + v140 + + + Application + Unicode + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + true + false + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + false + x64\$(Configuration)\ + x64\$(Configuration)\ + true + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + true + false + x64\$(Configuration)\ + x64\$(Configuration)\ + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc14/testzlib.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc14/testzlib.vcxproj new file mode 100644 index 0000000..2c37125 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc14/testzlib.vcxproj @@ -0,0 +1,430 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B} + testzlib + Win32Proj + + + + Application + MultiByte + true + v140 + + + Application + MultiByte + true + v140 + + + Application + Unicode + v140 + + + Application + MultiByte + true + v140 + + + Application + MultiByte + true + v140 + + + Application + MultiByte + v140 + + + Application + true + v140 + + + Application + true + v140 + + + Application + v140 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + true + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + true + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + false + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc14/testzlibdll.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc14/testzlibdll.vcxproj new file mode 100644 index 0000000..d87474d --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc14/testzlibdll.vcxproj @@ -0,0 +1,316 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694366A} + Win32Proj + + + + Application + MultiByte + v140 + + + Application + Unicode + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + Application + MultiByte + v140 + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + true + false + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + false + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + true + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + true + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + false + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc14/zlib.rc b/externe_kniznice/zlib/contrib/vstudio/vc14/zlib.rc new file mode 100644 index 0000000..c4e4b01 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc14/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 2, 11, 0 + PRODUCTVERSION 1, 2, 11, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.11\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/externe_kniznice/zlib/contrib/vstudio/vc14/zlibstat.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc14/zlibstat.vcxproj new file mode 100644 index 0000000..3e4b986 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc14/zlibstat.vcxproj @@ -0,0 +1,467 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8} + + + + StaticLibrary + false + v140 + + + StaticLibrary + false + v140 + + + StaticLibrary + false + v140 + Unicode + + + StaticLibrary + false + v140 + + + StaticLibrary + false + v140 + + + StaticLibrary + false + v140 + + + StaticLibrary + false + v140 + + + StaticLibrary + false + v140 + + + StaticLibrary + false + v140 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc14/zlibvc.def b/externe_kniznice/zlib/contrib/vstudio/vc14/zlibvc.def new file mode 100644 index 0000000..f876c3b --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc14/zlibvc.def @@ -0,0 +1,153 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.2 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 diff --git a/externe_kniznice/zlib/contrib/vstudio/vc14/zlibvc.sln b/externe_kniznice/zlib/contrib/vstudio/vc14/zlibvc.sln new file mode 100644 index 0000000..6f4a107 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc14/zlibvc.sln @@ -0,0 +1,119 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcxproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlibdll", "testzlibdll.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcxproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Itanium = Debug|Itanium + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Itanium = Release|Itanium + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/externe_kniznice/zlib/contrib/vstudio/vc14/zlibvc.vcxproj b/externe_kniznice/zlib/contrib/vstudio/vc14/zlibvc.vcxproj new file mode 100644 index 0000000..f8f673c --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc14/zlibvc.vcxproj @@ -0,0 +1,692 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {8FD826F8-3739-44E6-8CC8-997122E53B8D} + + + + DynamicLibrary + false + true + v140 + + + DynamicLibrary + false + true + v140 + + + DynamicLibrary + false + v140 + Unicode + + + DynamicLibrary + false + true + v140 + + + DynamicLibrary + false + true + v140 + + + DynamicLibrary + false + v140 + + + DynamicLibrary + false + true + v140 + + + DynamicLibrary + false + true + v140 + + + DynamicLibrary + false + v140 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + true + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + true + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + true + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + false + + + cd ..\..\masmx86 +bld_ml32.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + cd ..\..\contrib\masmx64 +bld_ml64.bat + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + cd ..\..\masmx64 +bld_ml64.bat + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/vstudio/vc9/miniunz.vcproj b/externe_kniznice/zlib/contrib/vstudio/vc9/miniunz.vcproj new file mode 100644 index 0000000..038a9e5 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc9/miniunz.vcproj @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/externe_kniznice/zlib/contrib/vstudio/vc9/minizip.vcproj b/externe_kniznice/zlib/contrib/vstudio/vc9/minizip.vcproj new file mode 100644 index 0000000..ad40239 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc9/minizip.vcproj @@ -0,0 +1,562 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/externe_kniznice/zlib/contrib/vstudio/vc9/testzlib.vcproj b/externe_kniznice/zlib/contrib/vstudio/vc9/testzlib.vcproj new file mode 100644 index 0000000..c9f19d2 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc9/testzlib.vcproj @@ -0,0 +1,852 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/externe_kniznice/zlib/contrib/vstudio/vc9/testzlibdll.vcproj b/externe_kniznice/zlib/contrib/vstudio/vc9/testzlibdll.vcproj new file mode 100644 index 0000000..d7530fd --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc9/testzlibdll.vcproj @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/externe_kniznice/zlib/contrib/vstudio/vc9/zlib.rc b/externe_kniznice/zlib/contrib/vstudio/vc9/zlib.rc new file mode 100644 index 0000000..c4e4b01 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc9/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 2, 11, 0 + PRODUCTVERSION 1, 2, 11, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.11\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/externe_kniznice/zlib/contrib/vstudio/vc9/zlibstat.vcproj b/externe_kniznice/zlib/contrib/vstudio/vc9/zlibstat.vcproj new file mode 100644 index 0000000..d4ffb46 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc9/zlibstat.vcproj @@ -0,0 +1,835 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/externe_kniznice/zlib/contrib/vstudio/vc9/zlibvc.def b/externe_kniznice/zlib/contrib/vstudio/vc9/zlibvc.def new file mode 100644 index 0000000..f876c3b --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc9/zlibvc.def @@ -0,0 +1,153 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.2 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 diff --git a/externe_kniznice/zlib/contrib/vstudio/vc9/zlibvc.sln b/externe_kniznice/zlib/contrib/vstudio/vc9/zlibvc.sln new file mode 100644 index 0000000..75c64c3 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc9/zlibvc.sln @@ -0,0 +1,144 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestZlibDll", "testzlibdll.vcproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" + ProjectSection(ProjectDependencies) = postProject + {8FD826F8-3739-44E6-8CC8-997122E53B8D} = {8FD826F8-3739-44E6-8CC8-997122E53B8D} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" + ProjectSection(ProjectDependencies) = postProject + {8FD826F8-3739-44E6-8CC8-997122E53B8D} = {8FD826F8-3739-44E6-8CC8-997122E53B8D} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" + ProjectSection(ProjectDependencies) = postProject + {8FD826F8-3739-44E6-8CC8-997122E53B8D} = {8FD826F8-3739-44E6-8CC8-997122E53B8D} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Itanium = Debug|Itanium + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Itanium = Release|Itanium + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.Build.0 = Debug|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.Build.0 = Release|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.Build.0 = Debug|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.Build.0 = Release|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.Build.0 = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.Build.0 = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/externe_kniznice/zlib/contrib/vstudio/vc9/zlibvc.vcproj b/externe_kniznice/zlib/contrib/vstudio/vc9/zlibvc.vcproj new file mode 100644 index 0000000..95bb241 --- /dev/null +++ b/externe_kniznice/zlib/contrib/vstudio/vc9/zlibvc.vcproj @@ -0,0 +1,1156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/externe_kniznice/zlib/crc32.c b/externe_kniznice/zlib/crc32.c new file mode 100644 index 0000000..9580440 --- /dev/null +++ b/externe_kniznice/zlib/crc32.c @@ -0,0 +1,442 @@ +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Thanks to Rodney Brown for his contribution of faster + * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing + * tables for updating the shift register in one step with three exclusive-ors + * instead of four steps with four exclusive-ors. This results in about a + * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. + */ + +/* @(#) $Id$ */ + +/* + Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore + protection on the static variables used to control the first-use generation + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + first call get_crc_table() to initialize the tables before allowing more than + one thread to use crc32(). + + DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. + */ + +#ifdef MAKECRCH +# include +# ifndef DYNAMIC_CRC_TABLE +# define DYNAMIC_CRC_TABLE +# endif /* !DYNAMIC_CRC_TABLE */ +#endif /* MAKECRCH */ + +#include "zutil.h" /* for STDC and FAR definitions */ + +/* Definitions for doing the crc four data bytes at a time. */ +#if !defined(NOBYFOUR) && defined(Z_U4) +# define BYFOUR +#endif +#ifdef BYFOUR + local unsigned long crc32_little OF((unsigned long, + const unsigned char FAR *, z_size_t)); + local unsigned long crc32_big OF((unsigned long, + const unsigned char FAR *, z_size_t)); +# define TBLS 8 +#else +# define TBLS 1 +#endif /* BYFOUR */ + +/* Local functions for crc concatenation */ +local unsigned long gf2_matrix_times OF((unsigned long *mat, + unsigned long vec)); +local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); +local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); + + +#ifdef DYNAMIC_CRC_TABLE + +local volatile int crc_table_empty = 1; +local z_crc_t FAR crc_table[TBLS][256]; +local void make_crc_table OF((void)); +#ifdef MAKECRCH + local void write_table OF((FILE *, const z_crc_t FAR *)); +#endif /* MAKECRCH */ +/* + Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The first table is simply the CRC of all possible eight bit values. This is + all the information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. The remaining tables + allow for word-at-a-time CRC calculation for both big-endian and little- + endian machines, where a word is four bytes. +*/ +local void make_crc_table() +{ + z_crc_t c; + int n, k; + z_crc_t poly; /* polynomial exclusive-or pattern */ + /* terms of polynomial defining this crc (except x^32): */ + static volatile int first = 1; /* flag to limit concurrent making */ + static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; + + /* See if another task is already doing this (not thread-safe, but better + than nothing -- significantly reduces duration of vulnerability in + case the advice about DYNAMIC_CRC_TABLE is ignored) */ + if (first) { + first = 0; + + /* make exclusive-or pattern from polynomial (0xedb88320UL) */ + poly = 0; + for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) + poly |= (z_crc_t)1 << (31 - p[n]); + + /* generate a crc for every 8-bit value */ + for (n = 0; n < 256; n++) { + c = (z_crc_t)n; + for (k = 0; k < 8; k++) + c = c & 1 ? poly ^ (c >> 1) : c >> 1; + crc_table[0][n] = c; + } + +#ifdef BYFOUR + /* generate crc for each value followed by one, two, and three zeros, + and then the byte reversal of those as well as the first table */ + for (n = 0; n < 256; n++) { + c = crc_table[0][n]; + crc_table[4][n] = ZSWAP32(c); + for (k = 1; k < 4; k++) { + c = crc_table[0][c & 0xff] ^ (c >> 8); + crc_table[k][n] = c; + crc_table[k + 4][n] = ZSWAP32(c); + } + } +#endif /* BYFOUR */ + + crc_table_empty = 0; + } + else { /* not first */ + /* wait for the other guy to finish (not efficient, but rare) */ + while (crc_table_empty) + ; + } + +#ifdef MAKECRCH + /* write out CRC tables to crc32.h */ + { + FILE *out; + + out = fopen("crc32.h", "w"); + if (out == NULL) return; + fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); + fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); + fprintf(out, "local const z_crc_t FAR "); + fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); + write_table(out, crc_table[0]); +# ifdef BYFOUR + fprintf(out, "#ifdef BYFOUR\n"); + for (k = 1; k < 8; k++) { + fprintf(out, " },\n {\n"); + write_table(out, crc_table[k]); + } + fprintf(out, "#endif\n"); +# endif /* BYFOUR */ + fprintf(out, " }\n};\n"); + fclose(out); + } +#endif /* MAKECRCH */ +} + +#ifdef MAKECRCH +local void write_table(out, table) + FILE *out; + const z_crc_t FAR *table; +{ + int n; + + for (n = 0; n < 256; n++) + fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", + (unsigned long)(table[n]), + n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); +} +#endif /* MAKECRCH */ + +#else /* !DYNAMIC_CRC_TABLE */ +/* ======================================================================== + * Tables of CRC-32s of all single-byte values, made by make_crc_table(). + */ +#include "crc32.h" +#endif /* DYNAMIC_CRC_TABLE */ + +/* ========================================================================= + * This function can be used by asm versions of crc32() + */ +const z_crc_t FAR * ZEXPORT get_crc_table() +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + return (const z_crc_t FAR *)crc_table; +} + +/* ========================================================================= */ +#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) +#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 + +/* ========================================================================= */ +unsigned long ZEXPORT crc32_z(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + z_size_t len; +{ + if (buf == Z_NULL) return 0UL; + +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + +#ifdef BYFOUR + if (sizeof(void *) == sizeof(ptrdiff_t)) { + z_crc_t endian; + + endian = 1; + if (*((unsigned char *)(&endian))) + return crc32_little(crc, buf, len); + else + return crc32_big(crc, buf, len); + } +#endif /* BYFOUR */ + crc = crc ^ 0xffffffffUL; + while (len >= 8) { + DO8; + len -= 8; + } + if (len) do { + DO1; + } while (--len); + return crc ^ 0xffffffffUL; +} + +/* ========================================================================= */ +unsigned long ZEXPORT crc32(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + uInt len; +{ + return crc32_z(crc, buf, len); +} + +#ifdef BYFOUR + +/* + This BYFOUR code accesses the passed unsigned char * buffer with a 32-bit + integer pointer type. This violates the strict aliasing rule, where a + compiler can assume, for optimization purposes, that two pointers to + fundamentally different types won't ever point to the same memory. This can + manifest as a problem only if one of the pointers is written to. This code + only reads from those pointers. So long as this code remains isolated in + this compilation unit, there won't be a problem. For this reason, this code + should not be copied and pasted into a compilation unit in which other code + writes to the buffer that is passed to these routines. + */ + +/* ========================================================================= */ +#define DOLIT4 c ^= *buf4++; \ + c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ + crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] +#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 + +/* ========================================================================= */ +local unsigned long crc32_little(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + z_size_t len; +{ + register z_crc_t c; + register const z_crc_t FAR *buf4; + + c = (z_crc_t)crc; + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + len--; + } + + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; + while (len >= 32) { + DOLIT32; + len -= 32; + } + while (len >= 4) { + DOLIT4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + } while (--len); + c = ~c; + return (unsigned long)c; +} + +/* ========================================================================= */ +#define DOBIG4 c ^= *buf4++; \ + c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ + crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] +#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 + +/* ========================================================================= */ +local unsigned long crc32_big(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + z_size_t len; +{ + register z_crc_t c; + register const z_crc_t FAR *buf4; + + c = ZSWAP32((z_crc_t)crc); + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + len--; + } + + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; + while (len >= 32) { + DOBIG32; + len -= 32; + } + while (len >= 4) { + DOBIG4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + } while (--len); + c = ~c; + return (unsigned long)(ZSWAP32(c)); +} + +#endif /* BYFOUR */ + +#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ + +/* ========================================================================= */ +local unsigned long gf2_matrix_times(mat, vec) + unsigned long *mat; + unsigned long vec; +{ + unsigned long sum; + + sum = 0; + while (vec) { + if (vec & 1) + sum ^= *mat; + vec >>= 1; + mat++; + } + return sum; +} + +/* ========================================================================= */ +local void gf2_matrix_square(square, mat) + unsigned long *square; + unsigned long *mat; +{ + int n; + + for (n = 0; n < GF2_DIM; n++) + square[n] = gf2_matrix_times(mat, mat[n]); +} + +/* ========================================================================= */ +local uLong crc32_combine_(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ + int n; + unsigned long row; + unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ + unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ + + /* degenerate case (also disallow negative lengths) */ + if (len2 <= 0) + return crc1; + + /* put operator for one zero bit in odd */ + odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ + row = 1; + for (n = 1; n < GF2_DIM; n++) { + odd[n] = row; + row <<= 1; + } + + /* put operator for two zero bits in even */ + gf2_matrix_square(even, odd); + + /* put operator for four zero bits in odd */ + gf2_matrix_square(odd, even); + + /* apply len2 zeros to crc1 (first square will put the operator for one + zero byte, eight zero bits, in even) */ + do { + /* apply zeros operator for this bit of len2 */ + gf2_matrix_square(even, odd); + if (len2 & 1) + crc1 = gf2_matrix_times(even, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + if (len2 == 0) + break; + + /* another iteration of the loop with odd and even swapped */ + gf2_matrix_square(odd, even); + if (len2 & 1) + crc1 = gf2_matrix_times(odd, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + } while (len2 != 0); + + /* return combined crc */ + crc1 ^= crc2; + return crc1; +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} + +uLong ZEXPORT crc32_combine64(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} diff --git a/externe_kniznice/zlib/crc32.h b/externe_kniznice/zlib/crc32.h new file mode 100644 index 0000000..9e0c778 --- /dev/null +++ b/externe_kniznice/zlib/crc32.h @@ -0,0 +1,441 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const z_crc_t FAR crc_table[TBLS][256] = +{ + { + 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, + 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, + 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, + 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, + 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, + 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, + 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, + 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, + 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, + 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, + 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, + 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, + 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, + 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, + 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, + 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, + 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, + 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, + 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, + 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, + 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, + 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, + 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, + 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, + 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, + 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, + 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, + 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, + 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, + 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, + 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, + 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, + 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, + 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, + 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, + 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, + 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, + 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, + 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, + 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, + 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, + 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, + 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, + 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, + 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, + 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, + 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, + 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, + 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, + 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, + 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, + 0x2d02ef8dUL +#ifdef BYFOUR + }, + { + 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, + 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, + 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, + 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, + 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, + 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, + 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, + 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, + 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, + 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, + 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, + 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, + 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, + 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, + 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, + 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, + 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, + 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, + 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, + 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, + 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, + 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, + 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, + 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, + 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, + 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, + 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, + 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, + 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, + 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, + 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, + 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, + 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, + 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, + 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, + 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, + 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, + 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, + 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, + 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, + 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, + 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, + 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, + 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, + 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, + 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, + 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, + 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, + 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, + 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, + 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, + 0x9324fd72UL + }, + { + 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, + 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, + 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, + 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, + 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, + 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, + 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, + 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, + 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, + 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, + 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, + 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, + 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, + 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, + 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, + 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, + 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, + 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, + 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, + 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, + 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, + 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, + 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, + 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, + 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, + 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, + 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, + 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, + 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, + 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, + 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, + 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, + 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, + 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, + 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, + 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, + 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, + 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, + 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, + 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, + 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, + 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, + 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, + 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, + 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, + 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, + 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, + 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, + 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, + 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, + 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, + 0xbe9834edUL + }, + { + 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, + 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, + 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, + 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, + 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, + 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, + 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, + 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, + 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, + 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, + 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, + 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, + 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, + 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, + 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, + 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, + 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, + 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, + 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, + 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, + 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, + 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, + 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, + 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, + 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, + 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, + 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, + 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, + 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, + 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, + 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, + 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, + 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, + 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, + 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, + 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, + 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, + 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, + 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, + 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, + 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, + 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, + 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, + 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, + 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, + 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, + 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, + 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, + 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, + 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, + 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, + 0xde0506f1UL + }, + { + 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, + 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, + 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, + 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, + 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, + 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, + 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, + 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, + 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, + 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, + 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, + 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, + 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, + 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, + 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, + 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, + 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, + 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, + 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, + 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, + 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, + 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, + 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, + 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, + 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, + 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, + 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, + 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, + 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, + 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, + 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, + 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, + 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, + 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, + 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, + 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, + 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, + 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, + 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, + 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, + 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, + 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, + 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, + 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, + 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, + 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, + 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, + 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, + 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, + 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, + 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, + 0x8def022dUL + }, + { + 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, + 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, + 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, + 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, + 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, + 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, + 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, + 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, + 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, + 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, + 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, + 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, + 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, + 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, + 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, + 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, + 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, + 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, + 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, + 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, + 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, + 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, + 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, + 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, + 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, + 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, + 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, + 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, + 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, + 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, + 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, + 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, + 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, + 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, + 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, + 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, + 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, + 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, + 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, + 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, + 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, + 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, + 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, + 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, + 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, + 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, + 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, + 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, + 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, + 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, + 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, + 0x72fd2493UL + }, + { + 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, + 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, + 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, + 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, + 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, + 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, + 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, + 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, + 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, + 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, + 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, + 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, + 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, + 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, + 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, + 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, + 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, + 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, + 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, + 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, + 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, + 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, + 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, + 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, + 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, + 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, + 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, + 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, + 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, + 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, + 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, + 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, + 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, + 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, + 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, + 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, + 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, + 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, + 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, + 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, + 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, + 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, + 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, + 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, + 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, + 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, + 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, + 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, + 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, + 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, + 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, + 0xed3498beUL + }, + { + 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, + 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, + 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, + 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, + 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, + 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, + 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, + 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, + 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, + 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, + 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, + 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, + 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, + 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, + 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, + 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, + 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, + 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, + 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, + 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, + 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, + 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, + 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, + 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, + 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, + 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, + 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, + 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, + 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, + 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, + 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, + 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, + 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, + 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, + 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, + 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, + 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, + 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, + 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, + 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, + 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, + 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, + 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, + 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, + 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, + 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, + 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, + 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, + 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, + 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, + 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, + 0xf10605deUL +#endif + } +}; diff --git a/externe_kniznice/zlib/deflate.c b/externe_kniznice/zlib/deflate.c new file mode 100644 index 0000000..1ec7614 --- /dev/null +++ b/externe_kniznice/zlib/deflate.c @@ -0,0 +1,2163 @@ +/* deflate.c -- compress data using the deflation algorithm + * Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process depends on being able to identify portions + * of the input text which are identical to earlier input (within a + * sliding window trailing behind the input currently being processed). + * + * The most straightforward technique turns out to be the fastest for + * most input files: try all possible matches and select the longest. + * The key feature of this algorithm is that insertions into the string + * dictionary are very simple and thus fast, and deletions are avoided + * completely. Insertions are performed at each input character, whereas + * string matches are performed only when the previous match ends. So it + * is preferable to spend more time in matches to allow very fast string + * insertions and avoid deletions. The matching algorithm for small + * strings is inspired from that of Rabin & Karp. A brute force approach + * is used to find longer strings when a small match has been found. + * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze + * (by Leonid Broukhis). + * A previous version of this file used a more sophisticated algorithm + * (by Fiala and Greene) which is guaranteed to run in linear amortized + * time, but has a larger average cost, uses more memory and is patented. + * However the F&G algorithm may be faster for some highly redundant + * files if the parameter max_chain_length (described below) is too large. + * + * ACKNOWLEDGEMENTS + * + * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and + * I found it in 'freeze' written by Leonid Broukhis. + * Thanks to many people for bug reports and testing. + * + * REFERENCES + * + * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". + * Available in http://tools.ietf.org/html/rfc1951 + * + * A description of the Rabin and Karp algorithm is given in the book + * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. + * + * Fiala,E.R., and Greene,D.H. + * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 + * + */ + +/* @(#) $Id$ */ + +#include "deflate.h" + +const char deflate_copyright[] = + " deflate 1.2.11 Copyright 1995-2017 Jean-loup Gailly and Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* =========================================================================== + * Function prototypes. + */ +typedef enum { + need_more, /* block not completed, need more input or more output */ + block_done, /* block flush performed */ + finish_started, /* finish started, need only more output at next deflate */ + finish_done /* finish done, accept no more input or output */ +} block_state; + +typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +/* Compression function. Returns the block state after the call. */ + +local int deflateStateCheck OF((z_streamp strm)); +local void slide_hash OF((deflate_state *s)); +local void fill_window OF((deflate_state *s)); +local block_state deflate_stored OF((deflate_state *s, int flush)); +local block_state deflate_fast OF((deflate_state *s, int flush)); +#ifndef FASTEST +local block_state deflate_slow OF((deflate_state *s, int flush)); +#endif +local block_state deflate_rle OF((deflate_state *s, int flush)); +local block_state deflate_huff OF((deflate_state *s, int flush)); +local void lm_init OF((deflate_state *s)); +local void putShortMSB OF((deflate_state *s, uInt b)); +local void flush_pending OF((z_streamp strm)); +local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); +#ifdef ASMV +# pragma message("Assembler code may have bugs -- use at your own risk") + void match_init OF((void)); /* asm code initialization */ + uInt longest_match OF((deflate_state *s, IPos cur_match)); +#else +local uInt longest_match OF((deflate_state *s, IPos cur_match)); +#endif + +#ifdef ZLIB_DEBUG +local void check_match OF((deflate_state *s, IPos start, IPos match, + int length)); +#endif + +/* =========================================================================== + * Local data + */ + +#define NIL 0 +/* Tail of hash chains */ + +#ifndef TOO_FAR +# define TOO_FAR 4096 +#endif +/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ + +/* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ +typedef struct config_s { + ush good_length; /* reduce lazy search above this match length */ + ush max_lazy; /* do not perform lazy search above this match length */ + ush nice_length; /* quit search above this match length */ + ush max_chain; + compress_func func; +} config; + +#ifdef FASTEST +local const config configuration_table[2] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ +#else +local const config configuration_table[10] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ +/* 2 */ {4, 5, 16, 8, deflate_fast}, +/* 3 */ {4, 6, 32, 32, deflate_fast}, + +/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ +/* 5 */ {8, 16, 32, 32, deflate_slow}, +/* 6 */ {8, 16, 128, 128, deflate_slow}, +/* 7 */ {8, 32, 128, 256, deflate_slow}, +/* 8 */ {32, 128, 258, 1024, deflate_slow}, +/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ +#endif + +/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 + * For deflate_fast() (levels <= 3) good is ignored and lazy has a different + * meaning. + */ + +/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */ +#define RANK(f) (((f) * 2) - ((f) > 4 ? 9 : 0)) + +/* =========================================================================== + * Update a hash value with the given input byte + * IN assertion: all calls to UPDATE_HASH are made with consecutive input + * characters, so that a running hash key can be computed from the previous + * key instead of complete recalculation each time. + */ +#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) + + +/* =========================================================================== + * Insert string str in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * If this file is compiled with -DFASTEST, the compression level is forced + * to 1, and no hash chains are maintained. + * IN assertion: all calls to INSERT_STRING are made with consecutive input + * characters and the first MIN_MATCH bytes of str are valid (except for + * the last MIN_MATCH-1 bytes of the input file). + */ +#ifdef FASTEST +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#else +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#endif + +/* =========================================================================== + * Initialize the hash table (avoiding 64K overflow for 16 bit systems). + * prev[] will be initialized on the fly. + */ +#define CLEAR_HASH(s) \ + s->head[s->hash_size-1] = NIL; \ + zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); + +/* =========================================================================== + * Slide the hash table when sliding the window down (could be avoided with 32 + * bit values at the expense of memory usage). We slide even when level == 0 to + * keep the hash table consistent if we switch back to level > 0 later. + */ +local void slide_hash(s) + deflate_state *s; +{ + unsigned n, m; + Posf *p; + uInt wsize = s->w_size; + + n = s->hash_size; + p = &s->head[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m - wsize : NIL); + } while (--n); + n = wsize; +#ifndef FASTEST + p = &s->prev[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m - wsize : NIL); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); +#endif +} + +/* ========================================================================= */ +int ZEXPORT deflateInit_(strm, level, version, stream_size) + z_streamp strm; + int level; + const char *version; + int stream_size; +{ + return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, + Z_DEFAULT_STRATEGY, version, stream_size); + /* To do: ignore strm->next_in if we use it as window */ +} + +/* ========================================================================= */ +int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + version, stream_size) + z_streamp strm; + int level; + int method; + int windowBits; + int memLevel; + int strategy; + const char *version; + int stream_size; +{ + deflate_state *s; + int wrap = 1; + static const char my_version[] = ZLIB_VERSION; + + ushf *overlay; + /* We overlay pending_buf and d_buf+l_buf. This works since the average + * output size for (length,distance) codes is <= 24 bits. + */ + + if (version == Z_NULL || version[0] != my_version[0] || + stream_size != sizeof(z_stream)) { + return Z_VERSION_ERROR; + } + if (strm == Z_NULL) return Z_STREAM_ERROR; + + strm->msg = Z_NULL; + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; + } +#ifdef GZIP + else if (windowBits > 15) { + wrap = 2; /* write gzip wrapper instead */ + windowBits -= 16; + } +#endif + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED || (windowBits == 8 && wrap != 1)) { + return Z_STREAM_ERROR; + } + if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ + s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); + if (s == Z_NULL) return Z_MEM_ERROR; + strm->state = (struct internal_state FAR *)s; + s->strm = strm; + s->status = INIT_STATE; /* to pass state test in deflateReset() */ + + s->wrap = wrap; + s->gzhead = Z_NULL; + s->w_bits = (uInt)windowBits; + s->w_size = 1 << s->w_bits; + s->w_mask = s->w_size - 1; + + s->hash_bits = (uInt)memLevel + 7; + s->hash_size = 1 << s->hash_bits; + s->hash_mask = s->hash_size - 1; + s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); + + s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); + s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); + s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); + + s->high_water = 0; /* nothing written to s->window yet */ + + s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + + overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); + s->pending_buf = (uchf *) overlay; + s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); + + if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || + s->pending_buf == Z_NULL) { + s->status = FINISH_STATE; + strm->msg = ERR_MSG(Z_MEM_ERROR); + deflateEnd (strm); + return Z_MEM_ERROR; + } + s->d_buf = overlay + s->lit_bufsize/sizeof(ush); + s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + + s->level = level; + s->strategy = strategy; + s->method = (Byte)method; + + return deflateReset(strm); +} + +/* ========================================================================= + * Check for a valid deflate stream state. Return 0 if ok, 1 if not. + */ +local int deflateStateCheck (strm) + z_streamp strm; +{ + deflate_state *s; + if (strm == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) + return 1; + s = strm->state; + if (s == Z_NULL || s->strm != strm || (s->status != INIT_STATE && +#ifdef GZIP + s->status != GZIP_STATE && +#endif + s->status != EXTRA_STATE && + s->status != NAME_STATE && + s->status != COMMENT_STATE && + s->status != HCRC_STATE && + s->status != BUSY_STATE && + s->status != FINISH_STATE)) + return 1; + return 0; +} + +/* ========================================================================= */ +int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) + z_streamp strm; + const Bytef *dictionary; + uInt dictLength; +{ + deflate_state *s; + uInt str, n; + int wrap; + unsigned avail; + z_const unsigned char *next; + + if (deflateStateCheck(strm) || dictionary == Z_NULL) + return Z_STREAM_ERROR; + s = strm->state; + wrap = s->wrap; + if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead) + return Z_STREAM_ERROR; + + /* when using zlib wrappers, compute Adler-32 for provided dictionary */ + if (wrap == 1) + strm->adler = adler32(strm->adler, dictionary, dictLength); + s->wrap = 0; /* avoid computing Adler-32 in read_buf */ + + /* if dictionary would fill window, just replace the history */ + if (dictLength >= s->w_size) { + if (wrap == 0) { /* already empty otherwise */ + CLEAR_HASH(s); + s->strstart = 0; + s->block_start = 0L; + s->insert = 0; + } + dictionary += dictLength - s->w_size; /* use the tail */ + dictLength = s->w_size; + } + + /* insert dictionary into window and hash */ + avail = strm->avail_in; + next = strm->next_in; + strm->avail_in = dictLength; + strm->next_in = (z_const Bytef *)dictionary; + fill_window(s); + while (s->lookahead >= MIN_MATCH) { + str = s->strstart; + n = s->lookahead - (MIN_MATCH-1); + do { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + } while (--n); + s->strstart = str; + s->lookahead = MIN_MATCH-1; + fill_window(s); + } + s->strstart += s->lookahead; + s->block_start = (long)s->strstart; + s->insert = s->lookahead; + s->lookahead = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + strm->next_in = next; + strm->avail_in = avail; + s->wrap = wrap; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength) + z_streamp strm; + Bytef *dictionary; + uInt *dictLength; +{ + deflate_state *s; + uInt len; + + if (deflateStateCheck(strm)) + return Z_STREAM_ERROR; + s = strm->state; + len = s->strstart + s->lookahead; + if (len > s->w_size) + len = s->w_size; + if (dictionary != Z_NULL && len) + zmemcpy(dictionary, s->window + s->strstart + s->lookahead - len, len); + if (dictLength != Z_NULL) + *dictLength = len; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateResetKeep (strm) + z_streamp strm; +{ + deflate_state *s; + + if (deflateStateCheck(strm)) { + return Z_STREAM_ERROR; + } + + strm->total_in = strm->total_out = 0; + strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ + strm->data_type = Z_UNKNOWN; + + s = (deflate_state *)strm->state; + s->pending = 0; + s->pending_out = s->pending_buf; + + if (s->wrap < 0) { + s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ + } + s->status = +#ifdef GZIP + s->wrap == 2 ? GZIP_STATE : +#endif + s->wrap ? INIT_STATE : BUSY_STATE; + strm->adler = +#ifdef GZIP + s->wrap == 2 ? crc32(0L, Z_NULL, 0) : +#endif + adler32(0L, Z_NULL, 0); + s->last_flush = Z_NO_FLUSH; + + _tr_init(s); + + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateReset (strm) + z_streamp strm; +{ + int ret; + + ret = deflateResetKeep(strm); + if (ret == Z_OK) + lm_init(strm->state); + return ret; +} + +/* ========================================================================= */ +int ZEXPORT deflateSetHeader (strm, head) + z_streamp strm; + gz_headerp head; +{ + if (deflateStateCheck(strm) || strm->state->wrap != 2) + return Z_STREAM_ERROR; + strm->state->gzhead = head; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePending (strm, pending, bits) + unsigned *pending; + int *bits; + z_streamp strm; +{ + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + if (pending != Z_NULL) + *pending = strm->state->pending; + if (bits != Z_NULL) + *bits = strm->state->bi_valid; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePrime (strm, bits, value) + z_streamp strm; + int bits; + int value; +{ + deflate_state *s; + int put; + + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + s = strm->state; + if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) + return Z_BUF_ERROR; + do { + put = Buf_size - s->bi_valid; + if (put > bits) + put = bits; + s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid); + s->bi_valid += put; + _tr_flush_bits(s); + value >>= put; + bits -= put; + } while (bits); + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateParams(strm, level, strategy) + z_streamp strm; + int level; + int strategy; +{ + deflate_state *s; + compress_func func; + + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + s = strm->state; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + func = configuration_table[s->level].func; + + if ((strategy != s->strategy || func != configuration_table[level].func) && + s->high_water) { + /* Flush the last buffer: */ + int err = deflate(strm, Z_BLOCK); + if (err == Z_STREAM_ERROR) + return err; + if (strm->avail_out == 0) + return Z_BUF_ERROR; + } + if (s->level != level) { + if (s->level == 0 && s->matches != 0) { + if (s->matches == 1) + slide_hash(s); + else + CLEAR_HASH(s); + s->matches = 0; + } + s->level = level; + s->max_lazy_match = configuration_table[level].max_lazy; + s->good_match = configuration_table[level].good_length; + s->nice_match = configuration_table[level].nice_length; + s->max_chain_length = configuration_table[level].max_chain; + } + s->strategy = strategy; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) + z_streamp strm; + int good_length; + int max_lazy; + int nice_length; + int max_chain; +{ + deflate_state *s; + + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + s = strm->state; + s->good_match = (uInt)good_length; + s->max_lazy_match = (uInt)max_lazy; + s->nice_match = nice_length; + s->max_chain_length = (uInt)max_chain; + return Z_OK; +} + +/* ========================================================================= + * For the default windowBits of 15 and memLevel of 8, this function returns + * a close to exact, as well as small, upper bound on the compressed size. + * They are coded as constants here for a reason--if the #define's are + * changed, then this function needs to be changed as well. The return + * value for 15 and 8 only works for those exact settings. + * + * For any setting other than those defaults for windowBits and memLevel, + * the value returned is a conservative worst case for the maximum expansion + * resulting from using fixed blocks instead of stored blocks, which deflate + * can emit on compressed data for some combinations of the parameters. + * + * This function could be more sophisticated to provide closer upper bounds for + * every combination of windowBits and memLevel. But even the conservative + * upper bound of about 14% expansion does not seem onerous for output buffer + * allocation. + */ +uLong ZEXPORT deflateBound(strm, sourceLen) + z_streamp strm; + uLong sourceLen; +{ + deflate_state *s; + uLong complen, wraplen; + + /* conservative upper bound for compressed data */ + complen = sourceLen + + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; + + /* if can't get parameters, return conservative bound plus zlib wrapper */ + if (deflateStateCheck(strm)) + return complen + 6; + + /* compute wrapper length */ + s = strm->state; + switch (s->wrap) { + case 0: /* raw deflate */ + wraplen = 0; + break; + case 1: /* zlib wrapper */ + wraplen = 6 + (s->strstart ? 4 : 0); + break; +#ifdef GZIP + case 2: /* gzip wrapper */ + wraplen = 18; + if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ + Bytef *str; + if (s->gzhead->extra != Z_NULL) + wraplen += 2 + s->gzhead->extra_len; + str = s->gzhead->name; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + str = s->gzhead->comment; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + if (s->gzhead->hcrc) + wraplen += 2; + } + break; +#endif + default: /* for compiler happiness */ + wraplen = 6; + } + + /* if not default parameters, return conservative bound */ + if (s->w_bits != 15 || s->hash_bits != 8 + 7) + return complen + wraplen; + + /* default settings: return tight bound for that case */ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13 - 6 + wraplen; +} + +/* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ +local void putShortMSB (s, b) + deflate_state *s; + uInt b; +{ + put_byte(s, (Byte)(b >> 8)); + put_byte(s, (Byte)(b & 0xff)); +} + +/* ========================================================================= + * Flush as much pending output as possible. All deflate() output, except for + * some deflate_stored() output, goes through this function so some + * applications may wish to modify it to avoid allocating a large + * strm->next_out buffer and copying into it. (See also read_buf()). + */ +local void flush_pending(strm) + z_streamp strm; +{ + unsigned len; + deflate_state *s = strm->state; + + _tr_flush_bits(s); + len = s->pending; + if (len > strm->avail_out) len = strm->avail_out; + if (len == 0) return; + + zmemcpy(strm->next_out, s->pending_out, len); + strm->next_out += len; + s->pending_out += len; + strm->total_out += len; + strm->avail_out -= len; + s->pending -= len; + if (s->pending == 0) { + s->pending_out = s->pending_buf; + } +} + +/* =========================================================================== + * Update the header CRC with the bytes s->pending_buf[beg..s->pending - 1]. + */ +#define HCRC_UPDATE(beg) \ + do { \ + if (s->gzhead->hcrc && s->pending > (beg)) \ + strm->adler = crc32(strm->adler, s->pending_buf + (beg), \ + s->pending - (beg)); \ + } while (0) + +/* ========================================================================= */ +int ZEXPORT deflate (strm, flush) + z_streamp strm; + int flush; +{ + int old_flush; /* value of flush param for previous deflate call */ + deflate_state *s; + + if (deflateStateCheck(strm) || flush > Z_BLOCK || flush < 0) { + return Z_STREAM_ERROR; + } + s = strm->state; + + if (strm->next_out == Z_NULL || + (strm->avail_in != 0 && strm->next_in == Z_NULL) || + (s->status == FINISH_STATE && flush != Z_FINISH)) { + ERR_RETURN(strm, Z_STREAM_ERROR); + } + if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); + + old_flush = s->last_flush; + s->last_flush = flush; + + /* Flush as much pending output as possible */ + if (s->pending != 0) { + flush_pending(strm); + if (strm->avail_out == 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s->last_flush = -1; + return Z_OK; + } + + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) && + flush != Z_FINISH) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* User must not provide more input after the first FINISH: */ + if (s->status == FINISH_STATE && strm->avail_in != 0) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* Write the header */ + if (s->status == INIT_STATE) { + /* zlib header */ + uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt level_flags; + + if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) + level_flags = 0; + else if (s->level < 6) + level_flags = 1; + else if (s->level == 6) + level_flags = 2; + else + level_flags = 3; + header |= (level_flags << 6); + if (s->strstart != 0) header |= PRESET_DICT; + header += 31 - (header % 31); + + putShortMSB(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s->strstart != 0) { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + strm->adler = adler32(0L, Z_NULL, 0); + s->status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } +#ifdef GZIP + if (s->status == GZIP_STATE) { + /* gzip header */ + strm->adler = crc32(0L, Z_NULL, 0); + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (s->gzhead == Z_NULL) { + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, OS_CODE); + s->status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } + else { + put_byte(s, (s->gzhead->text ? 1 : 0) + + (s->gzhead->hcrc ? 2 : 0) + + (s->gzhead->extra == Z_NULL ? 0 : 4) + + (s->gzhead->name == Z_NULL ? 0 : 8) + + (s->gzhead->comment == Z_NULL ? 0 : 16) + ); + put_byte(s, (Byte)(s->gzhead->time & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, s->gzhead->os & 0xff); + if (s->gzhead->extra != Z_NULL) { + put_byte(s, s->gzhead->extra_len & 0xff); + put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); + } + if (s->gzhead->hcrc) + strm->adler = crc32(strm->adler, s->pending_buf, + s->pending); + s->gzindex = 0; + s->status = EXTRA_STATE; + } + } + if (s->status == EXTRA_STATE) { + if (s->gzhead->extra != Z_NULL) { + ulg beg = s->pending; /* start of bytes to update crc */ + uInt left = (s->gzhead->extra_len & 0xffff) - s->gzindex; + while (s->pending + left > s->pending_buf_size) { + uInt copy = s->pending_buf_size - s->pending; + zmemcpy(s->pending_buf + s->pending, + s->gzhead->extra + s->gzindex, copy); + s->pending = s->pending_buf_size; + HCRC_UPDATE(beg); + s->gzindex += copy; + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + beg = 0; + left -= copy; + } + zmemcpy(s->pending_buf + s->pending, + s->gzhead->extra + s->gzindex, left); + s->pending += left; + HCRC_UPDATE(beg); + s->gzindex = 0; + } + s->status = NAME_STATE; + } + if (s->status == NAME_STATE) { + if (s->gzhead->name != Z_NULL) { + ulg beg = s->pending; /* start of bytes to update crc */ + int val; + do { + if (s->pending == s->pending_buf_size) { + HCRC_UPDATE(beg); + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + beg = 0; + } + val = s->gzhead->name[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + HCRC_UPDATE(beg); + s->gzindex = 0; + } + s->status = COMMENT_STATE; + } + if (s->status == COMMENT_STATE) { + if (s->gzhead->comment != Z_NULL) { + ulg beg = s->pending; /* start of bytes to update crc */ + int val; + do { + if (s->pending == s->pending_buf_size) { + HCRC_UPDATE(beg); + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + beg = 0; + } + val = s->gzhead->comment[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + HCRC_UPDATE(beg); + } + s->status = HCRC_STATE; + } + if (s->status == HCRC_STATE) { + if (s->gzhead->hcrc) { + if (s->pending + 2 > s->pending_buf_size) { + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + strm->adler = crc32(0L, Z_NULL, 0); + } + s->status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } +#endif + + /* Start a new block or continue the current one. + */ + if (strm->avail_in != 0 || s->lookahead != 0 || + (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { + block_state bstate; + + bstate = s->level == 0 ? deflate_stored(s, flush) : + s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : + s->strategy == Z_RLE ? deflate_rle(s, flush) : + (*(configuration_table[s->level].func))(s, flush); + + if (bstate == finish_started || bstate == finish_done) { + s->status = FINISH_STATE; + } + if (bstate == need_more || bstate == finish_started) { + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ + } + return Z_OK; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate == block_done) { + if (flush == Z_PARTIAL_FLUSH) { + _tr_align(s); + } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ + _tr_stored_block(s, (char*)0, 0L, 0); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush == Z_FULL_FLUSH) { + CLEAR_HASH(s); /* forget history */ + if (s->lookahead == 0) { + s->strstart = 0; + s->block_start = 0L; + s->insert = 0; + } + } + } + flush_pending(strm); + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK; + } + } + } + + if (flush != Z_FINISH) return Z_OK; + if (s->wrap <= 0) return Z_STREAM_END; + + /* Write the trailer */ +#ifdef GZIP + if (s->wrap == 2) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); + put_byte(s, (Byte)(strm->total_in & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); + } + else +#endif + { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + flush_pending(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ + return s->pending != 0 ? Z_OK : Z_STREAM_END; +} + +/* ========================================================================= */ +int ZEXPORT deflateEnd (strm) + z_streamp strm; +{ + int status; + + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; + + status = strm->state->status; + + /* Deallocate in reverse order of allocations: */ + TRY_FREE(strm, strm->state->pending_buf); + TRY_FREE(strm, strm->state->head); + TRY_FREE(strm, strm->state->prev); + TRY_FREE(strm, strm->state->window); + + ZFREE(strm, strm->state); + strm->state = Z_NULL; + + return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; +} + +/* ========================================================================= + * Copy the source state to the destination state. + * To simplify the source, this is not supported for 16-bit MSDOS (which + * doesn't have enough memory anyway to duplicate compression states). + */ +int ZEXPORT deflateCopy (dest, source) + z_streamp dest; + z_streamp source; +{ +#ifdef MAXSEG_64K + return Z_STREAM_ERROR; +#else + deflate_state *ds; + deflate_state *ss; + ushf *overlay; + + + if (deflateStateCheck(source) || dest == Z_NULL) { + return Z_STREAM_ERROR; + } + + ss = source->state; + + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + + ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); + if (ds == Z_NULL) return Z_MEM_ERROR; + dest->state = (struct internal_state FAR *) ds; + zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state)); + ds->strm = dest; + + ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); + ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); + ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); + overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); + ds->pending_buf = (uchf *) overlay; + + if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || + ds->pending_buf == Z_NULL) { + deflateEnd (dest); + return Z_MEM_ERROR; + } + /* following zmemcpy do not work for 16-bit MSDOS */ + zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); + zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); + zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); + zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + + ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); + ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); + ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; + + ds->l_desc.dyn_tree = ds->dyn_ltree; + ds->d_desc.dyn_tree = ds->dyn_dtree; + ds->bl_desc.dyn_tree = ds->bl_tree; + + return Z_OK; +#endif /* MAXSEG_64K */ +} + +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->next_in buffer and copying from it. + * (See also flush_pending()). + */ +local unsigned read_buf(strm, buf, size) + z_streamp strm; + Bytef *buf; + unsigned size; +{ + unsigned len = strm->avail_in; + + if (len > size) len = size; + if (len == 0) return 0; + + strm->avail_in -= len; + + zmemcpy(buf, strm->next_in, len); + if (strm->state->wrap == 1) { + strm->adler = adler32(strm->adler, buf, len); + } +#ifdef GZIP + else if (strm->state->wrap == 2) { + strm->adler = crc32(strm->adler, buf, len); + } +#endif + strm->next_in += len; + strm->total_in += len; + + return len; +} + +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +local void lm_init (s) + deflate_state *s; +{ + s->window_size = (ulg)2L*s->w_size; + + CLEAR_HASH(s); + + /* Set the default configuration parameters: + */ + s->max_lazy_match = configuration_table[s->level].max_lazy; + s->good_match = configuration_table[s->level].good_length; + s->nice_match = configuration_table[s->level].nice_length; + s->max_chain_length = configuration_table[s->level].max_chain; + + s->strstart = 0; + s->block_start = 0L; + s->lookahead = 0; + s->insert = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + s->ins_h = 0; +#ifndef FASTEST +#ifdef ASMV + match_init(); /* initialize the asm code */ +#endif +#endif +} + +#ifndef FASTEST +/* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ +#ifndef ASMV +/* For 80x86 and 680x0, an optimized version will be provided in match.asm or + * match.S. The code will be functionally equivalent. + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + unsigned chain_length = s->max_chain_length;/* max hash chain length */ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + int best_len = (int)s->prev_length; /* best match length so far */ + int nice_match = s->nice_match; /* stop if match long enough */ + IPos limit = s->strstart > (IPos)MAX_DIST(s) ? + s->strstart - (IPos)MAX_DIST(s) : NIL; + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + Posf *prev = s->prev; + uInt wmask = s->w_mask; + +#ifdef UNALIGNED_OK + /* Compare two bytes at a time. Note: this is not always beneficial. + * Try with and without -DUNALIGNED_OK to check. + */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; + register ush scan_start = *(ushf*)scan; + register ush scan_end = *(ushf*)(scan+best_len-1); +#else + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + register Byte scan_end1 = scan[best_len-1]; + register Byte scan_end = scan[best_len]; +#endif + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + /* Do not waste too much time if we already have a good match: */ + if (s->prev_length >= s->good_match) { + chain_length >>= 2; + } + /* Do not look for matches beyond the end of the input. This is necessary + * to make deflate deterministic. + */ + if ((uInt)nice_match > s->lookahead) nice_match = (int)s->lookahead; + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + do { + Assert(cur_match < s->strstart, "no future"); + match = s->window + cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ +#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) + /* This code assumes sizeof(unsigned short) == 2. Do not use + * UNALIGNED_OK if your compiler uses a different size. + */ + if (*(ushf*)(match+best_len-1) != scan_end || + *(ushf*)match != scan_start) continue; + + /* It is not necessary to compare scan[2] and match[2] since they are + * always equal when the other bytes match, given that the hash keys + * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at + * strstart+3, +5, ... up to strstart+257. We check for insufficient + * lookahead only every 4th comparison; the 128th check will be made + * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is + * necessary to put more guard bytes at the end of the window, or + * to check more often for insufficient lookahead. + */ + Assert(scan[2] == match[2], "scan[2]?"); + scan++, match++; + do { + } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + scan < strend); + /* The funny "do {}" generates better code on most compilers */ + + /* Here, scan <= window+strstart+257 */ + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + if (*scan == *match) scan++; + + len = (MAX_MATCH - 1) - (int)(strend-scan); + scan = strend - (MAX_MATCH-1); + +#else /* UNALIGNED_OK */ + + if (match[best_len] != scan_end || + match[best_len-1] != scan_end1 || + *match != *scan || + *++match != scan[1]) continue; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match++; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + scan = strend - MAX_MATCH; + +#endif /* UNALIGNED_OK */ + + if (len > best_len) { + s->match_start = cur_match; + best_len = len; + if (len >= nice_match) break; +#ifdef UNALIGNED_OK + scan_end = *(ushf*)(scan+best_len-1); +#else + scan_end1 = scan[best_len-1]; + scan_end = scan[best_len]; +#endif + } + } while ((cur_match = prev[cur_match & wmask]) > limit + && --chain_length != 0); + + if ((uInt)best_len <= s->lookahead) return (uInt)best_len; + return s->lookahead; +} +#endif /* ASMV */ + +#else /* FASTEST */ + +/* --------------------------------------------------------------------------- + * Optimized version for FASTEST only + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + Assert(cur_match < s->strstart, "no future"); + + match = s->window + cur_match; + + /* Return failure if the match length is less than 2: + */ + if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match += 2; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + + if (len < MIN_MATCH) return MIN_MATCH - 1; + + s->match_start = cur_match; + return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; +} + +#endif /* FASTEST */ + +#ifdef ZLIB_DEBUG + +#define EQUAL 0 +/* result of memcmp for equal strings */ + +/* =========================================================================== + * Check that the match at match_start is indeed a match. + */ +local void check_match(s, start, match, length) + deflate_state *s; + IPos start, match; + int length; +{ + /* check that the match is indeed a match */ + if (zmemcmp(s->window + match, + s->window + start, length) != EQUAL) { + fprintf(stderr, " start %u, match %u, length %d\n", + start, match, length); + do { + fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); + } while (--length != 0); + z_error("invalid match"); + } + if (z_verbose > 1) { + fprintf(stderr,"\\[%d,%d]", start-match, length); + do { putc(s->window[start++], stderr); } while (--length != 0); + } +} +#else +# define check_match(s, start, match, length) +#endif /* ZLIB_DEBUG */ + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +local void fill_window(s) + deflate_state *s; +{ + unsigned n; + unsigned more; /* Amount of free space at the end of the window. */ + uInt wsize = s->w_size; + + Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + + do { + more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); + + /* Deal with !@#$% 64K limit: */ + if (sizeof(int) <= 2) { + if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + more = wsize; + + } else if (more == (unsigned)(-1)) { + /* Very unlikely, but possible on 16 bit machine if + * strstart == 0 && lookahead == 1 (input done a byte at time) + */ + more--; + } + } + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s->strstart >= wsize+MAX_DIST(s)) { + + zmemcpy(s->window, s->window+wsize, (unsigned)wsize - more); + s->match_start -= wsize; + s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ + s->block_start -= (long) wsize; + slide_hash(s); + more += wsize; + } + if (s->strm->avail_in == 0) break; + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + Assert(more >= 2, "more < 2"); + + n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); + s->lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s->lookahead + s->insert >= MIN_MATCH) { + uInt str = s->strstart - s->insert; + s->ins_h = s->window[str]; + UPDATE_HASH(s, s->ins_h, s->window[str + 1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + while (s->insert) { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + s->insert--; + if (s->lookahead + s->insert < MIN_MATCH) + break; + } + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ + if (s->high_water < s->window_size) { + ulg curr = s->strstart + (ulg)(s->lookahead); + ulg init; + + if (s->high_water < curr) { + /* Previous high water mark below current data -- zero WIN_INIT + * bytes or up to end of window, whichever is less. + */ + init = s->window_size - curr; + if (init > WIN_INIT) + init = WIN_INIT; + zmemzero(s->window + curr, (unsigned)init); + s->high_water = curr + init; + } + else if (s->high_water < (ulg)curr + WIN_INIT) { + /* High water mark at or above current data, but below current data + * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up + * to end of window, whichever is less. + */ + init = (ulg)curr + WIN_INIT - s->high_water; + if (init > s->window_size - s->high_water) + init = s->window_size - s->high_water; + zmemzero(s->window + s->high_water, (unsigned)init); + s->high_water += init; + } + } + + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "not enough room for search"); +} + +/* =========================================================================== + * Flush the current block, with given end-of-file flag. + * IN assertion: strstart is set to the end of the current match. + */ +#define FLUSH_BLOCK_ONLY(s, last) { \ + _tr_flush_block(s, (s->block_start >= 0L ? \ + (charf *)&s->window[(unsigned)s->block_start] : \ + (charf *)Z_NULL), \ + (ulg)((long)s->strstart - s->block_start), \ + (last)); \ + s->block_start = s->strstart; \ + flush_pending(s->strm); \ + Tracev((stderr,"[FLUSH]")); \ +} + +/* Same but force premature exit if necessary. */ +#define FLUSH_BLOCK(s, last) { \ + FLUSH_BLOCK_ONLY(s, last); \ + if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ +} + +/* Maximum stored block length in deflate format (not including header). */ +#define MAX_STORED 65535 + +/* Minimum of a and b. */ +#define MIN(a, b) ((a) > (b) ? (b) : (a)) + +/* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * + * In case deflateParams() is used to later switch to a non-zero compression + * level, s->matches (otherwise unused when storing) keeps track of the number + * of hash table slides to perform. If s->matches is 1, then one hash table + * slide will be done when switching. If s->matches is 2, the maximum value + * allowed here, then the hash table will be cleared, since two or more slides + * is the same as a clear. + * + * deflate_stored() is written to minimize the number of times an input byte is + * copied. It is most efficient with large input and output buffers, which + * maximizes the opportunites to have a single copy from next_in to next_out. + */ +local block_state deflate_stored(s, flush) + deflate_state *s; + int flush; +{ + /* Smallest worthy block size when not flushing or finishing. By default + * this is 32K. This can be as small as 507 bytes for memLevel == 1. For + * large input and output buffers, the stored block size will be larger. + */ + unsigned min_block = MIN(s->pending_buf_size - 5, s->w_size); + + /* Copy as many min_block or larger stored blocks directly to next_out as + * possible. If flushing, copy the remaining available input to next_out as + * stored blocks, if there is enough space. + */ + unsigned len, left, have, last = 0; + unsigned used = s->strm->avail_in; + do { + /* Set len to the maximum size block that we can copy directly with the + * available input data and output space. Set left to how much of that + * would be copied from what's left in the window. + */ + len = MAX_STORED; /* maximum deflate stored block length */ + have = (s->bi_valid + 42) >> 3; /* number of header bytes */ + if (s->strm->avail_out < have) /* need room for header */ + break; + /* maximum stored block length that will fit in avail_out: */ + have = s->strm->avail_out - have; + left = s->strstart - s->block_start; /* bytes left in window */ + if (len > (ulg)left + s->strm->avail_in) + len = left + s->strm->avail_in; /* limit len to the input */ + if (len > have) + len = have; /* limit len to the output */ + + /* If the stored block would be less than min_block in length, or if + * unable to copy all of the available input when flushing, then try + * copying to the window and the pending buffer instead. Also don't + * write an empty block when flushing -- deflate() does that. + */ + if (len < min_block && ((len == 0 && flush != Z_FINISH) || + flush == Z_NO_FLUSH || + len != left + s->strm->avail_in)) + break; + + /* Make a dummy stored block in pending to get the header bytes, + * including any pending bits. This also updates the debugging counts. + */ + last = flush == Z_FINISH && len == left + s->strm->avail_in ? 1 : 0; + _tr_stored_block(s, (char *)0, 0L, last); + + /* Replace the lengths in the dummy stored block with len. */ + s->pending_buf[s->pending - 4] = len; + s->pending_buf[s->pending - 3] = len >> 8; + s->pending_buf[s->pending - 2] = ~len; + s->pending_buf[s->pending - 1] = ~len >> 8; + + /* Write the stored block header bytes. */ + flush_pending(s->strm); + +#ifdef ZLIB_DEBUG + /* Update debugging counts for the data about to be copied. */ + s->compressed_len += len << 3; + s->bits_sent += len << 3; +#endif + + /* Copy uncompressed bytes from the window to next_out. */ + if (left) { + if (left > len) + left = len; + zmemcpy(s->strm->next_out, s->window + s->block_start, left); + s->strm->next_out += left; + s->strm->avail_out -= left; + s->strm->total_out += left; + s->block_start += left; + len -= left; + } + + /* Copy uncompressed bytes directly from next_in to next_out, updating + * the check value. + */ + if (len) { + read_buf(s->strm, s->strm->next_out, len); + s->strm->next_out += len; + s->strm->avail_out -= len; + s->strm->total_out += len; + } + } while (last == 0); + + /* Update the sliding window with the last s->w_size bytes of the copied + * data, or append all of the copied data to the existing window if less + * than s->w_size bytes were copied. Also update the number of bytes to + * insert in the hash tables, in the event that deflateParams() switches to + * a non-zero compression level. + */ + used -= s->strm->avail_in; /* number of input bytes directly copied */ + if (used) { + /* If any input was used, then no unused input remains in the window, + * therefore s->block_start == s->strstart. + */ + if (used >= s->w_size) { /* supplant the previous history */ + s->matches = 2; /* clear hash */ + zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); + s->strstart = s->w_size; + } + else { + if (s->window_size - s->strstart <= used) { + /* Slide the window down. */ + s->strstart -= s->w_size; + zmemcpy(s->window, s->window + s->w_size, s->strstart); + if (s->matches < 2) + s->matches++; /* add a pending slide_hash() */ + } + zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); + s->strstart += used; + } + s->block_start = s->strstart; + s->insert += MIN(used, s->w_size - s->insert); + } + if (s->high_water < s->strstart) + s->high_water = s->strstart; + + /* If the last block was written to next_out, then done. */ + if (last) + return finish_done; + + /* If flushing and all input has been consumed, then done. */ + if (flush != Z_NO_FLUSH && flush != Z_FINISH && + s->strm->avail_in == 0 && (long)s->strstart == s->block_start) + return block_done; + + /* Fill the window with any remaining input. */ + have = s->window_size - s->strstart - 1; + if (s->strm->avail_in > have && s->block_start >= (long)s->w_size) { + /* Slide the window down. */ + s->block_start -= s->w_size; + s->strstart -= s->w_size; + zmemcpy(s->window, s->window + s->w_size, s->strstart); + if (s->matches < 2) + s->matches++; /* add a pending slide_hash() */ + have += s->w_size; /* more space now */ + } + if (have > s->strm->avail_in) + have = s->strm->avail_in; + if (have) { + read_buf(s->strm, s->window + s->strstart, have); + s->strstart += have; + } + if (s->high_water < s->strstart) + s->high_water = s->strstart; + + /* There was not enough avail_out to write a complete worthy or flushed + * stored block to next_out. Write a stored block to pending instead, if we + * have enough input for a worthy block, or if flushing and there is enough + * room for the remaining input as a stored block in the pending buffer. + */ + have = (s->bi_valid + 42) >> 3; /* number of header bytes */ + /* maximum stored block length that will fit in pending: */ + have = MIN(s->pending_buf_size - have, MAX_STORED); + min_block = MIN(have, s->w_size); + left = s->strstart - s->block_start; + if (left >= min_block || + ((left || flush == Z_FINISH) && flush != Z_NO_FLUSH && + s->strm->avail_in == 0 && left <= have)) { + len = MIN(left, have); + last = flush == Z_FINISH && s->strm->avail_in == 0 && + len == left ? 1 : 0; + _tr_stored_block(s, (charf *)s->window + s->block_start, len, last); + s->block_start += len; + flush_pending(s->strm); + } + + /* We've done all we can with the available input and output. */ + return last ? finish_started : need_more; +} + +/* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ +local block_state deflate_fast(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head; /* head of the hash chain */ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = NIL; + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ + } + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->match_start, s->match_length); + + _tr_tally_dist(s, s->strstart - s->match_start, + s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ +#ifndef FASTEST + if (s->match_length <= s->max_insert_length && + s->lookahead >= MIN_MATCH) { + s->match_length--; /* string at strstart already in table */ + do { + s->strstart++; + INSERT_STRING(s, s->strstart, hash_head); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s->match_length != 0); + s->strstart++; + } else +#endif + { + s->strstart += s->match_length; + s->match_length = 0; + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} + +#ifndef FASTEST +/* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ +local block_state deflate_slow(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head; /* head of hash chain */ + int bflush; /* set if current block must be flushed */ + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = NIL; + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + */ + s->prev_length = s->match_length, s->prev_match = s->match_start; + s->match_length = MIN_MATCH-1; + + if (hash_head != NIL && s->prev_length < s->max_lazy_match && + s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ + + if (s->match_length <= 5 && (s->strategy == Z_FILTERED +#if TOO_FAR <= 32767 + || (s->match_length == MIN_MATCH && + s->strstart - s->match_start > TOO_FAR) +#endif + )) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s->match_length = MIN_MATCH-1; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { + uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; + /* Do not insert strings in hash table beyond this. */ + + check_match(s, s->strstart-1, s->prev_match, s->prev_length); + + _tr_tally_dist(s, s->strstart -1 - s->prev_match, + s->prev_length - MIN_MATCH, bflush); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s->lookahead -= s->prev_length-1; + s->prev_length -= 2; + do { + if (++s->strstart <= max_insert) { + INSERT_STRING(s, s->strstart, hash_head); + } + } while (--s->prev_length != 0); + s->match_available = 0; + s->match_length = MIN_MATCH-1; + s->strstart++; + + if (bflush) FLUSH_BLOCK(s, 0); + + } else if (s->match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + if (bflush) { + FLUSH_BLOCK_ONLY(s, 0); + } + s->strstart++; + s->lookahead--; + if (s->strm->avail_out == 0) return need_more; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s->match_available = 1; + s->strstart++; + s->lookahead--; + } + } + Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s->match_available) { + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + s->match_available = 0; + } + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} +#endif /* FASTEST */ + +/* =========================================================================== + * For Z_RLE, simply look for runs of bytes, generate matches only of distance + * one. Do not maintain a hash table. (It will be regenerated if this run of + * deflate switches away from Z_RLE.) + */ +local block_state deflate_rle(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + uInt prev; /* byte at distance one to match */ + Bytef *scan, *strend; /* scan goes up to strend for length of run */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the longest run, plus one for the unrolled loop. + */ + if (s->lookahead <= MAX_MATCH) { + fill_window(s); + if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* See how many times the previous byte repeats */ + s->match_length = 0; + if (s->lookahead >= MIN_MATCH && s->strstart > 0) { + scan = s->window + s->strstart - 1; + prev = *scan; + if (prev == *++scan && prev == *++scan && prev == *++scan) { + strend = s->window + s->strstart + MAX_MATCH; + do { + } while (prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + scan < strend); + s->match_length = MAX_MATCH - (uInt)(strend - scan); + if (s->match_length > s->lookahead) + s->match_length = s->lookahead; + } + Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); + } + + /* Emit match if have run of MIN_MATCH or longer, else emit literal */ + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->strstart - 1, s->match_length); + + _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + s->strstart += s->match_length; + s->match_length = 0; + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} + +/* =========================================================================== + * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. + * (It will be regenerated if this run of deflate switches away from Huffman.) + */ +local block_state deflate_huff(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we have a literal to write. */ + if (s->lookahead == 0) { + fill_window(s); + if (s->lookahead == 0) { + if (flush == Z_NO_FLUSH) + return need_more; + break; /* flush the current block */ + } + } + + /* Output a literal byte */ + s->match_length = 0; + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} diff --git a/externe_kniznice/zlib/deflate.h b/externe_kniznice/zlib/deflate.h new file mode 100644 index 0000000..23ecdd3 --- /dev/null +++ b/externe_kniznice/zlib/deflate.h @@ -0,0 +1,349 @@ +/* deflate.h -- internal compression state + * Copyright (C) 1995-2016 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef DEFLATE_H +#define DEFLATE_H + +#include "zutil.h" + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer creation by deflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip encoding + should be left enabled. */ +#ifndef NO_GZIP +# define GZIP +#endif + +/* =========================================================================== + * Internal compression state. + */ + +#define LENGTH_CODES 29 +/* number of length codes, not counting the special END_BLOCK code */ + +#define LITERALS 256 +/* number of literal bytes 0..255 */ + +#define L_CODES (LITERALS+1+LENGTH_CODES) +/* number of Literal or Length codes, including the END_BLOCK code */ + +#define D_CODES 30 +/* number of distance codes */ + +#define BL_CODES 19 +/* number of codes used to transfer the bit lengths */ + +#define HEAP_SIZE (2*L_CODES+1) +/* maximum heap size */ + +#define MAX_BITS 15 +/* All codes must not exceed MAX_BITS bits */ + +#define Buf_size 16 +/* size of bit buffer in bi_buf */ + +#define INIT_STATE 42 /* zlib header -> BUSY_STATE */ +#ifdef GZIP +# define GZIP_STATE 57 /* gzip header -> BUSY_STATE | EXTRA_STATE */ +#endif +#define EXTRA_STATE 69 /* gzip extra block -> NAME_STATE */ +#define NAME_STATE 73 /* gzip file name -> COMMENT_STATE */ +#define COMMENT_STATE 91 /* gzip comment -> HCRC_STATE */ +#define HCRC_STATE 103 /* gzip header CRC -> BUSY_STATE */ +#define BUSY_STATE 113 /* deflate -> FINISH_STATE */ +#define FINISH_STATE 666 /* stream complete */ +/* Stream status */ + + +/* Data structure describing a single value and its code string. */ +typedef struct ct_data_s { + union { + ush freq; /* frequency count */ + ush code; /* bit string */ + } fc; + union { + ush dad; /* father node in Huffman tree */ + ush len; /* length of bit string */ + } dl; +} FAR ct_data; + +#define Freq fc.freq +#define Code fc.code +#define Dad dl.dad +#define Len dl.len + +typedef struct static_tree_desc_s static_tree_desc; + +typedef struct tree_desc_s { + ct_data *dyn_tree; /* the dynamic tree */ + int max_code; /* largest code with non zero frequency */ + const static_tree_desc *stat_desc; /* the corresponding static tree */ +} FAR tree_desc; + +typedef ush Pos; +typedef Pos FAR Posf; +typedef unsigned IPos; + +/* A Pos is an index in the character window. We use short instead of int to + * save space in the various tables. IPos is used only for parameter passing. + */ + +typedef struct internal_state { + z_streamp strm; /* pointer back to this zlib stream */ + int status; /* as the name implies */ + Bytef *pending_buf; /* output still pending */ + ulg pending_buf_size; /* size of pending_buf */ + Bytef *pending_out; /* next pending byte to output to the stream */ + ulg pending; /* nb of bytes in the pending buffer */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + gz_headerp gzhead; /* gzip header information to write */ + ulg gzindex; /* where in extra, name, or comment */ + Byte method; /* can only be DEFLATED */ + int last_flush; /* value of flush param for previous deflate call */ + + /* used by deflate.c: */ + + uInt w_size; /* LZ77 window size (32K by default) */ + uInt w_bits; /* log2(w_size) (8..16) */ + uInt w_mask; /* w_size - 1 */ + + Bytef *window; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. Also, it limits + * the window size to 64K, which is quite useful on MSDOS. + * To do: use the user input buffer as sliding window. + */ + + ulg window_size; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + Posf *prev; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + Posf *head; /* Heads of the hash chains or NIL. */ + + uInt ins_h; /* hash index of string to be inserted */ + uInt hash_size; /* number of elements in hash table */ + uInt hash_bits; /* log2(hash_size) */ + uInt hash_mask; /* hash_size-1 */ + + uInt hash_shift; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + long block_start; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + uInt match_length; /* length of best match */ + IPos prev_match; /* previous match */ + int match_available; /* set if previous match exists */ + uInt strstart; /* start of string to insert */ + uInt match_start; /* start of matching string */ + uInt lookahead; /* number of valid bytes ahead in window */ + + uInt prev_length; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + uInt max_chain_length; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + uInt max_lazy_match; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ +# define max_insert_length max_lazy_match + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + int level; /* compression level (1..9) */ + int strategy; /* favor or force Huffman coding*/ + + uInt good_match; + /* Use a faster search when the previous match is longer than this */ + + int nice_match; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + /* Didn't use ct_data typedef below to suppress compiler warning */ + struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + struct tree_desc_s l_desc; /* desc. for literal tree */ + struct tree_desc_s d_desc; /* desc. for distance tree */ + struct tree_desc_s bl_desc; /* desc. for bit length tree */ + + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + int heap_len; /* number of elements in the heap */ + int heap_max; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + uch depth[2*L_CODES+1]; + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + uchf *l_buf; /* buffer for literals or lengths */ + + uInt lit_bufsize; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + uInt last_lit; /* running index in l_buf */ + + ushf *d_buf; + /* Buffer for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ + + ulg opt_len; /* bit length of current block with optimal trees */ + ulg static_len; /* bit length of current block with static trees */ + uInt matches; /* number of string matches in current block */ + uInt insert; /* bytes at end of window left to insert */ + +#ifdef ZLIB_DEBUG + ulg compressed_len; /* total bit length of compressed file mod 2^32 */ + ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ +#endif + + ush bi_buf; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + int bi_valid; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + + ulg high_water; + /* High water mark offset in window for initialized bytes -- bytes above + * this are set to zero in order to avoid memory check warnings when + * longest match routines access bytes past the input. This is then + * updated to the new high water mark. + */ + +} FAR deflate_state; + +/* Output a byte on the stream. + * IN assertion: there is enough room in pending_buf. + */ +#define put_byte(s, c) {s->pending_buf[s->pending++] = (Bytef)(c);} + + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) +/* In order to simplify the code, particularly on 16 bit machines, match + * distances are limited to MAX_DIST instead of WSIZE. + */ + +#define WIN_INIT MAX_MATCH +/* Number of bytes after end of data in window to initialize in order to avoid + memory checker errors from longest match routines */ + + /* in trees.c */ +void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); +int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); +void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); + +#define d_code(dist) \ + ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) +/* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. _dist_code[256] and _dist_code[257] are never + * used. + */ + +#ifndef ZLIB_DEBUG +/* Inline versions of _tr_tally for speed: */ + +#if defined(GEN_TREES_H) || !defined(STDC) + extern uch ZLIB_INTERNAL _length_code[]; + extern uch ZLIB_INTERNAL _dist_code[]; +#else + extern const uch ZLIB_INTERNAL _length_code[]; + extern const uch ZLIB_INTERNAL _dist_code[]; +#endif + +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->last_lit] = 0; \ + s->l_buf[s->last_lit++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (uch)(length); \ + ush dist = (ush)(distance); \ + s->d_buf[s->last_lit] = dist; \ + s->l_buf[s->last_lit++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +#else +# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) +# define _tr_tally_dist(s, distance, length, flush) \ + flush = _tr_tally(s, distance, length) +#endif + +#endif /* DEFLATE_H */ diff --git a/externe_kniznice/zlib/doc/algorithm.txt b/externe_kniznice/zlib/doc/algorithm.txt new file mode 100644 index 0000000..c97f495 --- /dev/null +++ b/externe_kniznice/zlib/doc/algorithm.txt @@ -0,0 +1,209 @@ +1. Compression algorithm (deflate) + +The deflation algorithm used by gzip (also zip and zlib) is a variation of +LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in +the input data. The second occurrence of a string is replaced by a +pointer to the previous string, in the form of a pair (distance, +length). Distances are limited to 32K bytes, and lengths are limited +to 258 bytes. When a string does not occur anywhere in the previous +32K bytes, it is emitted as a sequence of literal bytes. (In this +description, `string' must be taken as an arbitrary sequence of bytes, +and is not restricted to printable characters.) + +Literals or match lengths are compressed with one Huffman tree, and +match distances are compressed with another tree. The trees are stored +in a compact form at the start of each block. The blocks can have any +size (except that the compressed data for one block must fit in +available memory). A block is terminated when deflate() determines that +it would be useful to start another block with fresh trees. (This is +somewhat similar to the behavior of LZW-based _compress_.) + +Duplicated strings are found using a hash table. All input strings of +length 3 are inserted in the hash table. A hash index is computed for +the next 3 bytes. If the hash chain for this index is not empty, all +strings in the chain are compared with the current input string, and +the longest match is selected. + +The hash chains are searched starting with the most recent strings, to +favor small distances and thus take advantage of the Huffman encoding. +The hash chains are singly linked. There are no deletions from the +hash chains, the algorithm simply discards matches that are too old. + +To avoid a worst-case situation, very long hash chains are arbitrarily +truncated at a certain length, determined by a runtime option (level +parameter of deflateInit). So deflate() does not always find the longest +possible match but generally finds a match which is long enough. + +deflate() also defers the selection of matches with a lazy evaluation +mechanism. After a match of length N has been found, deflate() searches for +a longer match at the next input byte. If a longer match is found, the +previous match is truncated to a length of one (thus producing a single +literal byte) and the process of lazy evaluation begins again. Otherwise, +the original match is kept, and the next match search is attempted only N +steps later. + +The lazy match evaluation is also subject to a runtime parameter. If +the current match is long enough, deflate() reduces the search for a longer +match, thus speeding up the whole process. If compression ratio is more +important than speed, deflate() attempts a complete second search even if +the first match is already long enough. + +The lazy match evaluation is not performed for the fastest compression +modes (level parameter 1 to 3). For these fast modes, new strings +are inserted in the hash table only when no match was found, or +when the match is not too long. This degrades the compression ratio +but saves time since there are both fewer insertions and fewer searches. + + +2. Decompression algorithm (inflate) + +2.1 Introduction + +The key question is how to represent a Huffman code (or any prefix code) so +that you can decode fast. The most important characteristic is that shorter +codes are much more common than longer codes, so pay attention to decoding the +short codes fast, and let the long codes take longer to decode. + +inflate() sets up a first level table that covers some number of bits of +input less than the length of longest code. It gets that many bits from the +stream, and looks it up in the table. The table will tell if the next +code is that many bits or less and how many, and if it is, it will tell +the value, else it will point to the next level table for which inflate() +grabs more bits and tries to decode a longer code. + +How many bits to make the first lookup is a tradeoff between the time it +takes to decode and the time it takes to build the table. If building the +table took no time (and if you had infinite memory), then there would only +be a first level table to cover all the way to the longest code. However, +building the table ends up taking a lot longer for more bits since short +codes are replicated many times in such a table. What inflate() does is +simply to make the number of bits in the first table a variable, and then +to set that variable for the maximum speed. + +For inflate, which has 286 possible codes for the literal/length tree, the size +of the first table is nine bits. Also the distance trees have 30 possible +values, and the size of the first table is six bits. Note that for each of +those cases, the table ended up one bit longer than the ``average'' code +length, i.e. the code length of an approximately flat code which would be a +little more than eight bits for 286 symbols and a little less than five bits +for 30 symbols. + + +2.2 More details on the inflate table lookup + +Ok, you want to know what this cleverly obfuscated inflate tree actually +looks like. You are correct that it's not a Huffman tree. It is simply a +lookup table for the first, let's say, nine bits of a Huffman symbol. The +symbol could be as short as one bit or as long as 15 bits. If a particular +symbol is shorter than nine bits, then that symbol's translation is duplicated +in all those entries that start with that symbol's bits. For example, if the +symbol is four bits, then it's duplicated 32 times in a nine-bit table. If a +symbol is nine bits long, it appears in the table once. + +If the symbol is longer than nine bits, then that entry in the table points +to another similar table for the remaining bits. Again, there are duplicated +entries as needed. The idea is that most of the time the symbol will be short +and there will only be one table look up. (That's whole idea behind data +compression in the first place.) For the less frequent long symbols, there +will be two lookups. If you had a compression method with really long +symbols, you could have as many levels of lookups as is efficient. For +inflate, two is enough. + +So a table entry either points to another table (in which case nine bits in +the above example are gobbled), or it contains the translation for the symbol +and the number of bits to gobble. Then you start again with the next +ungobbled bit. + +You may wonder: why not just have one lookup table for how ever many bits the +longest symbol is? The reason is that if you do that, you end up spending +more time filling in duplicate symbol entries than you do actually decoding. +At least for deflate's output that generates new trees every several 10's of +kbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code +would take too long if you're only decoding several thousand symbols. At the +other extreme, you could make a new table for every bit in the code. In fact, +that's essentially a Huffman tree. But then you spend too much time +traversing the tree while decoding, even for short symbols. + +So the number of bits for the first lookup table is a trade of the time to +fill out the table vs. the time spent looking at the second level and above of +the table. + +Here is an example, scaled down: + +The code being decoded, with 10 symbols, from 1 to 6 bits long: + +A: 0 +B: 10 +C: 1100 +D: 11010 +E: 11011 +F: 11100 +G: 11101 +H: 11110 +I: 111110 +J: 111111 + +Let's make the first table three bits long (eight entries): + +000: A,1 +001: A,1 +010: A,1 +011: A,1 +100: B,2 +101: B,2 +110: -> table X (gobble 3 bits) +111: -> table Y (gobble 3 bits) + +Each entry is what the bits decode as and how many bits that is, i.e. how +many bits to gobble. Or the entry points to another table, with the number of +bits to gobble implicit in the size of the table. + +Table X is two bits long since the longest code starting with 110 is five bits +long: + +00: C,1 +01: C,1 +10: D,2 +11: E,2 + +Table Y is three bits long since the longest code starting with 111 is six +bits long: + +000: F,2 +001: F,2 +010: G,2 +011: G,2 +100: H,2 +101: H,2 +110: I,3 +111: J,3 + +So what we have here are three tables with a total of 20 entries that had to +be constructed. That's compared to 64 entries for a single table. Or +compared to 16 entries for a Huffman tree (six two entry tables and one four +entry table). Assuming that the code ideally represents the probability of +the symbols, it takes on the average 1.25 lookups per symbol. That's compared +to one lookup for the single table, or 1.66 lookups per symbol for the +Huffman tree. + +There, I think that gives you a picture of what's going on. For inflate, the +meaning of a particular symbol is often more than just a letter. It can be a +byte (a "literal"), or it can be either a length or a distance which +indicates a base value and a number of bits to fetch after the code that is +added to the base value. Or it might be the special end-of-block code. The +data structures created in inftrees.c try to encode all that information +compactly in the tables. + + +Jean-loup Gailly Mark Adler +jloup@gzip.org madler@alumni.caltech.edu + + +References: + +[LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data +Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3, +pp. 337-343. + +``DEFLATE Compressed Data Format Specification'' available in +http://tools.ietf.org/html/rfc1951 diff --git a/externe_kniznice/zlib/doc/rfc1950.txt b/externe_kniznice/zlib/doc/rfc1950.txt new file mode 100644 index 0000000..ce6428a --- /dev/null +++ b/externe_kniznice/zlib/doc/rfc1950.txt @@ -0,0 +1,619 @@ + + + + + + +Network Working Group P. Deutsch +Request for Comments: 1950 Aladdin Enterprises +Category: Informational J-L. Gailly + Info-ZIP + May 1996 + + + ZLIB Compressed Data Format Specification version 3.3 + +Status of This Memo + + This memo provides information for the Internet community. This memo + does not specify an Internet standard of any kind. Distribution of + this memo is unlimited. + +IESG Note: + + The IESG takes no position on the validity of any Intellectual + Property Rights statements contained in this document. + +Notices + + Copyright (c) 1996 L. Peter Deutsch and Jean-Loup Gailly + + Permission is granted to copy and distribute this document for any + purpose and without charge, including translations into other + languages and incorporation into compilations, provided that the + copyright notice and this notice are preserved, and that any + substantive changes or deletions from the original are clearly + marked. + + A pointer to the latest version of this and related documentation in + HTML format can be found at the URL + . + +Abstract + + This specification defines a lossless compressed data format. The + data can be produced or consumed, even for an arbitrarily long + sequentially presented input data stream, using only an a priori + bounded amount of intermediate storage. The format presently uses + the DEFLATE compression method but can be easily extended to use + other compression methods. It can be implemented readily in a manner + not covered by patents. This specification also defines the ADLER-32 + checksum (an extension and improvement of the Fletcher checksum), + used for detection of data corruption, and provides an algorithm for + computing it. + + + + +Deutsch & Gailly Informational [Page 1] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + +Table of Contents + + 1. Introduction ................................................... 2 + 1.1. Purpose ................................................... 2 + 1.2. Intended audience ......................................... 3 + 1.3. Scope ..................................................... 3 + 1.4. Compliance ................................................ 3 + 1.5. Definitions of terms and conventions used ................ 3 + 1.6. Changes from previous versions ............................ 3 + 2. Detailed specification ......................................... 3 + 2.1. Overall conventions ....................................... 3 + 2.2. Data format ............................................... 4 + 2.3. Compliance ................................................ 7 + 3. References ..................................................... 7 + 4. Source code .................................................... 8 + 5. Security Considerations ........................................ 8 + 6. Acknowledgements ............................................... 8 + 7. Authors' Addresses ............................................. 8 + 8. Appendix: Rationale ............................................ 9 + 9. Appendix: Sample code ..........................................10 + +1. Introduction + + 1.1. Purpose + + The purpose of this specification is to define a lossless + compressed data format that: + + * Is independent of CPU type, operating system, file system, + and character set, and hence can be used for interchange; + + * Can be produced or consumed, even for an arbitrarily long + sequentially presented input data stream, using only an a + priori bounded amount of intermediate storage, and hence can + be used in data communications or similar structures such as + Unix filters; + + * Can use a number of different compression methods; + + * Can be implemented readily in a manner not covered by + patents, and hence can be practiced freely. + + The data format defined by this specification does not attempt to + allow random access to compressed data. + + + + + + + +Deutsch & Gailly Informational [Page 2] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + 1.2. Intended audience + + This specification is intended for use by implementors of software + to compress data into zlib format and/or decompress data from zlib + format. + + The text of the specification assumes a basic background in + programming at the level of bits and other primitive data + representations. + + 1.3. Scope + + The specification specifies a compressed data format that can be + used for in-memory compression of a sequence of arbitrary bytes. + + 1.4. Compliance + + Unless otherwise indicated below, a compliant decompressor must be + able to accept and decompress any data set that conforms to all + the specifications presented here; a compliant compressor must + produce data sets that conform to all the specifications presented + here. + + 1.5. Definitions of terms and conventions used + + byte: 8 bits stored or transmitted as a unit (same as an octet). + (For this specification, a byte is exactly 8 bits, even on + machines which store a character on a number of bits different + from 8.) See below, for the numbering of bits within a byte. + + 1.6. Changes from previous versions + + Version 3.1 was the first public release of this specification. + In version 3.2, some terminology was changed and the Adler-32 + sample code was rewritten for clarity. In version 3.3, the + support for a preset dictionary was introduced, and the + specification was converted to RFC style. + +2. Detailed specification + + 2.1. Overall conventions + + In the diagrams below, a box like this: + + +---+ + | | <-- the vertical bars might be missing + +---+ + + + + +Deutsch & Gailly Informational [Page 3] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + represents one byte; a box like this: + + +==============+ + | | + +==============+ + + represents a variable number of bytes. + + Bytes stored within a computer do not have a "bit order", since + they are always treated as a unit. However, a byte considered as + an integer between 0 and 255 does have a most- and least- + significant bit, and since we write numbers with the most- + significant digit on the left, we also write bytes with the most- + significant bit on the left. In the diagrams below, we number the + bits of a byte so that bit 0 is the least-significant bit, i.e., + the bits are numbered: + + +--------+ + |76543210| + +--------+ + + Within a computer, a number may occupy multiple bytes. All + multi-byte numbers in the format described here are stored with + the MOST-significant byte first (at the lower memory address). + For example, the decimal number 520 is stored as: + + 0 1 + +--------+--------+ + |00000010|00001000| + +--------+--------+ + ^ ^ + | | + | + less significant byte = 8 + + more significant byte = 2 x 256 + + 2.2. Data format + + A zlib stream has the following structure: + + 0 1 + +---+---+ + |CMF|FLG| (more-->) + +---+---+ + + + + + + + + +Deutsch & Gailly Informational [Page 4] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + (if FLG.FDICT set) + + 0 1 2 3 + +---+---+---+---+ + | DICTID | (more-->) + +---+---+---+---+ + + +=====================+---+---+---+---+ + |...compressed data...| ADLER32 | + +=====================+---+---+---+---+ + + Any data which may appear after ADLER32 are not part of the zlib + stream. + + CMF (Compression Method and flags) + This byte is divided into a 4-bit compression method and a 4- + bit information field depending on the compression method. + + bits 0 to 3 CM Compression method + bits 4 to 7 CINFO Compression info + + CM (Compression method) + This identifies the compression method used in the file. CM = 8 + denotes the "deflate" compression method with a window size up + to 32K. This is the method used by gzip and PNG (see + references [1] and [2] in Chapter 3, below, for the reference + documents). CM = 15 is reserved. It might be used in a future + version of this specification to indicate the presence of an + extra field before the compressed data. + + CINFO (Compression info) + For CM = 8, CINFO is the base-2 logarithm of the LZ77 window + size, minus eight (CINFO=7 indicates a 32K window size). Values + of CINFO above 7 are not allowed in this version of the + specification. CINFO is not defined in this specification for + CM not equal to 8. + + FLG (FLaGs) + This flag byte is divided as follows: + + bits 0 to 4 FCHECK (check bits for CMF and FLG) + bit 5 FDICT (preset dictionary) + bits 6 to 7 FLEVEL (compression level) + + The FCHECK value must be such that CMF and FLG, when viewed as + a 16-bit unsigned integer stored in MSB order (CMF*256 + FLG), + is a multiple of 31. + + + + +Deutsch & Gailly Informational [Page 5] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + FDICT (Preset dictionary) + If FDICT is set, a DICT dictionary identifier is present + immediately after the FLG byte. The dictionary is a sequence of + bytes which are initially fed to the compressor without + producing any compressed output. DICT is the Adler-32 checksum + of this sequence of bytes (see the definition of ADLER32 + below). The decompressor can use this identifier to determine + which dictionary has been used by the compressor. + + FLEVEL (Compression level) + These flags are available for use by specific compression + methods. The "deflate" method (CM = 8) sets these flags as + follows: + + 0 - compressor used fastest algorithm + 1 - compressor used fast algorithm + 2 - compressor used default algorithm + 3 - compressor used maximum compression, slowest algorithm + + The information in FLEVEL is not needed for decompression; it + is there to indicate if recompression might be worthwhile. + + compressed data + For compression method 8, the compressed data is stored in the + deflate compressed data format as described in the document + "DEFLATE Compressed Data Format Specification" by L. Peter + Deutsch. (See reference [3] in Chapter 3, below) + + Other compressed data formats are not specified in this version + of the zlib specification. + + ADLER32 (Adler-32 checksum) + This contains a checksum value of the uncompressed data + (excluding any dictionary data) computed according to Adler-32 + algorithm. This algorithm is a 32-bit extension and improvement + of the Fletcher algorithm, used in the ITU-T X.224 / ISO 8073 + standard. See references [4] and [5] in Chapter 3, below) + + Adler-32 is composed of two sums accumulated per byte: s1 is + the sum of all bytes, s2 is the sum of all s1 values. Both sums + are done modulo 65521. s1 is initialized to 1, s2 to zero. The + Adler-32 checksum is stored as s2*65536 + s1 in most- + significant-byte first (network) order. + + + + + + + + +Deutsch & Gailly Informational [Page 6] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + 2.3. Compliance + + A compliant compressor must produce streams with correct CMF, FLG + and ADLER32, but need not support preset dictionaries. When the + zlib data format is used as part of another standard data format, + the compressor may use only preset dictionaries that are specified + by this other data format. If this other format does not use the + preset dictionary feature, the compressor must not set the FDICT + flag. + + A compliant decompressor must check CMF, FLG, and ADLER32, and + provide an error indication if any of these have incorrect values. + A compliant decompressor must give an error indication if CM is + not one of the values defined in this specification (only the + value 8 is permitted in this version), since another value could + indicate the presence of new features that would cause subsequent + data to be interpreted incorrectly. A compliant decompressor must + give an error indication if FDICT is set and DICTID is not the + identifier of a known preset dictionary. A decompressor may + ignore FLEVEL and still be compliant. When the zlib data format + is being used as a part of another standard format, a compliant + decompressor must support all the preset dictionaries specified by + the other format. When the other format does not use the preset + dictionary feature, a compliant decompressor must reject any + stream in which the FDICT flag is set. + +3. References + + [1] Deutsch, L.P.,"GZIP Compressed Data Format Specification", + available in ftp://ftp.uu.net/pub/archiving/zip/doc/ + + [2] Thomas Boutell, "PNG (Portable Network Graphics) specification", + available in ftp://ftp.uu.net/graphics/png/documents/ + + [3] Deutsch, L.P.,"DEFLATE Compressed Data Format Specification", + available in ftp://ftp.uu.net/pub/archiving/zip/doc/ + + [4] Fletcher, J. G., "An Arithmetic Checksum for Serial + Transmissions," IEEE Transactions on Communications, Vol. COM-30, + No. 1, January 1982, pp. 247-252. + + [5] ITU-T Recommendation X.224, Annex D, "Checksum Algorithms," + November, 1993, pp. 144, 145. (Available from + gopher://info.itu.ch). ITU-T X.244 is also the same as ISO 8073. + + + + + + + +Deutsch & Gailly Informational [Page 7] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + +4. Source code + + Source code for a C language implementation of a "zlib" compliant + library is available at ftp://ftp.uu.net/pub/archiving/zip/zlib/. + +5. Security Considerations + + A decoder that fails to check the ADLER32 checksum value may be + subject to undetected data corruption. + +6. Acknowledgements + + Trademarks cited in this document are the property of their + respective owners. + + Jean-Loup Gailly and Mark Adler designed the zlib format and wrote + the related software described in this specification. Glenn + Randers-Pehrson converted this document to RFC and HTML format. + +7. Authors' Addresses + + L. Peter Deutsch + Aladdin Enterprises + 203 Santa Margarita Ave. + Menlo Park, CA 94025 + + Phone: (415) 322-0103 (AM only) + FAX: (415) 322-1734 + EMail: + + + Jean-Loup Gailly + + EMail: + + Questions about the technical content of this specification can be + sent by email to + + Jean-Loup Gailly and + Mark Adler + + Editorial comments on this specification can be sent by email to + + L. Peter Deutsch and + Glenn Randers-Pehrson + + + + + + +Deutsch & Gailly Informational [Page 8] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + +8. Appendix: Rationale + + 8.1. Preset dictionaries + + A preset dictionary is specially useful to compress short input + sequences. The compressor can take advantage of the dictionary + context to encode the input in a more compact manner. The + decompressor can be initialized with the appropriate context by + virtually decompressing a compressed version of the dictionary + without producing any output. However for certain compression + algorithms such as the deflate algorithm this operation can be + achieved without actually performing any decompression. + + The compressor and the decompressor must use exactly the same + dictionary. The dictionary may be fixed or may be chosen among a + certain number of predefined dictionaries, according to the kind + of input data. The decompressor can determine which dictionary has + been chosen by the compressor by checking the dictionary + identifier. This document does not specify the contents of + predefined dictionaries, since the optimal dictionaries are + application specific. Standard data formats using this feature of + the zlib specification must precisely define the allowed + dictionaries. + + 8.2. The Adler-32 algorithm + + The Adler-32 algorithm is much faster than the CRC32 algorithm yet + still provides an extremely low probability of undetected errors. + + The modulo on unsigned long accumulators can be delayed for 5552 + bytes, so the modulo operation time is negligible. If the bytes + are a, b, c, the second sum is 3a + 2b + c + 3, and so is position + and order sensitive, unlike the first sum, which is just a + checksum. That 65521 is prime is important to avoid a possible + large class of two-byte errors that leave the check unchanged. + (The Fletcher checksum uses 255, which is not prime and which also + makes the Fletcher check insensitive to single byte changes 0 <-> + 255.) + + The sum s1 is initialized to 1 instead of zero to make the length + of the sequence part of s2, so that the length does not have to be + checked separately. (Any sequence of zeroes has a Fletcher + checksum of zero.) + + + + + + + + +Deutsch & Gailly Informational [Page 9] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + +9. Appendix: Sample code + + The following C code computes the Adler-32 checksum of a data buffer. + It is written for clarity, not for speed. The sample code is in the + ANSI C programming language. Non C users may find it easier to read + with these hints: + + & Bitwise AND operator. + >> Bitwise right shift operator. When applied to an + unsigned quantity, as here, right shift inserts zero bit(s) + at the left. + << Bitwise left shift operator. Left shift inserts zero + bit(s) at the right. + ++ "n++" increments the variable n. + % modulo operator: a % b is the remainder of a divided by b. + + #define BASE 65521 /* largest prime smaller than 65536 */ + + /* + Update a running Adler-32 checksum with the bytes buf[0..len-1] + and return the updated checksum. The Adler-32 checksum should be + initialized to 1. + + Usage example: + + unsigned long adler = 1L; + + while (read_buffer(buffer, length) != EOF) { + adler = update_adler32(adler, buffer, length); + } + if (adler != original_adler) error(); + */ + unsigned long update_adler32(unsigned long adler, + unsigned char *buf, int len) + { + unsigned long s1 = adler & 0xffff; + unsigned long s2 = (adler >> 16) & 0xffff; + int n; + + for (n = 0; n < len; n++) { + s1 = (s1 + buf[n]) % BASE; + s2 = (s2 + s1) % BASE; + } + return (s2 << 16) + s1; + } + + /* Return the adler32 of the bytes buf[0..len-1] */ + + + + +Deutsch & Gailly Informational [Page 10] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + unsigned long adler32(unsigned char *buf, int len) + { + return update_adler32(1L, buf, len); + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Deutsch & Gailly Informational [Page 11] + diff --git a/externe_kniznice/zlib/doc/rfc1951.txt b/externe_kniznice/zlib/doc/rfc1951.txt new file mode 100644 index 0000000..403c8c7 --- /dev/null +++ b/externe_kniznice/zlib/doc/rfc1951.txt @@ -0,0 +1,955 @@ + + + + + + +Network Working Group P. Deutsch +Request for Comments: 1951 Aladdin Enterprises +Category: Informational May 1996 + + + DEFLATE Compressed Data Format Specification version 1.3 + +Status of This Memo + + This memo provides information for the Internet community. This memo + does not specify an Internet standard of any kind. Distribution of + this memo is unlimited. + +IESG Note: + + The IESG takes no position on the validity of any Intellectual + Property Rights statements contained in this document. + +Notices + + Copyright (c) 1996 L. Peter Deutsch + + Permission is granted to copy and distribute this document for any + purpose and without charge, including translations into other + languages and incorporation into compilations, provided that the + copyright notice and this notice are preserved, and that any + substantive changes or deletions from the original are clearly + marked. + + A pointer to the latest version of this and related documentation in + HTML format can be found at the URL + . + +Abstract + + This specification defines a lossless compressed data format that + compresses data using a combination of the LZ77 algorithm and Huffman + coding, with efficiency comparable to the best currently available + general-purpose compression methods. The data can be produced or + consumed, even for an arbitrarily long sequentially presented input + data stream, using only an a priori bounded amount of intermediate + storage. The format can be implemented readily in a manner not + covered by patents. + + + + + + + + +Deutsch Informational [Page 1] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + +Table of Contents + + 1. Introduction ................................................... 2 + 1.1. Purpose ................................................... 2 + 1.2. Intended audience ......................................... 3 + 1.3. Scope ..................................................... 3 + 1.4. Compliance ................................................ 3 + 1.5. Definitions of terms and conventions used ................ 3 + 1.6. Changes from previous versions ............................ 4 + 2. Compressed representation overview ............................. 4 + 3. Detailed specification ......................................... 5 + 3.1. Overall conventions ....................................... 5 + 3.1.1. Packing into bytes .................................. 5 + 3.2. Compressed block format ................................... 6 + 3.2.1. Synopsis of prefix and Huffman coding ............... 6 + 3.2.2. Use of Huffman coding in the "deflate" format ....... 7 + 3.2.3. Details of block format ............................. 9 + 3.2.4. Non-compressed blocks (BTYPE=00) ................... 11 + 3.2.5. Compressed blocks (length and distance codes) ...... 11 + 3.2.6. Compression with fixed Huffman codes (BTYPE=01) .... 12 + 3.2.7. Compression with dynamic Huffman codes (BTYPE=10) .. 13 + 3.3. Compliance ............................................... 14 + 4. Compression algorithm details ................................. 14 + 5. References .................................................... 16 + 6. Security Considerations ....................................... 16 + 7. Source code ................................................... 16 + 8. Acknowledgements .............................................. 16 + 9. Author's Address .............................................. 17 + +1. Introduction + + 1.1. Purpose + + The purpose of this specification is to define a lossless + compressed data format that: + * Is independent of CPU type, operating system, file system, + and character set, and hence can be used for interchange; + * Can be produced or consumed, even for an arbitrarily long + sequentially presented input data stream, using only an a + priori bounded amount of intermediate storage, and hence + can be used in data communications or similar structures + such as Unix filters; + * Compresses data with efficiency comparable to the best + currently available general-purpose compression methods, + and in particular considerably better than the "compress" + program; + * Can be implemented readily in a manner not covered by + patents, and hence can be practiced freely; + + + +Deutsch Informational [Page 2] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + * Is compatible with the file format produced by the current + widely used gzip utility, in that conforming decompressors + will be able to read data produced by the existing gzip + compressor. + + The data format defined by this specification does not attempt to: + + * Allow random access to compressed data; + * Compress specialized data (e.g., raster graphics) as well + as the best currently available specialized algorithms. + + A simple counting argument shows that no lossless compression + algorithm can compress every possible input data set. For the + format defined here, the worst case expansion is 5 bytes per 32K- + byte block, i.e., a size increase of 0.015% for large data sets. + English text usually compresses by a factor of 2.5 to 3; + executable files usually compress somewhat less; graphical data + such as raster images may compress much more. + + 1.2. Intended audience + + This specification is intended for use by implementors of software + to compress data into "deflate" format and/or decompress data from + "deflate" format. + + The text of the specification assumes a basic background in + programming at the level of bits and other primitive data + representations. Familiarity with the technique of Huffman coding + is helpful but not required. + + 1.3. Scope + + The specification specifies a method for representing a sequence + of bytes as a (usually shorter) sequence of bits, and a method for + packing the latter bit sequence into bytes. + + 1.4. Compliance + + Unless otherwise indicated below, a compliant decompressor must be + able to accept and decompress any data set that conforms to all + the specifications presented here; a compliant compressor must + produce data sets that conform to all the specifications presented + here. + + 1.5. Definitions of terms and conventions used + + Byte: 8 bits stored or transmitted as a unit (same as an octet). + For this specification, a byte is exactly 8 bits, even on machines + + + +Deutsch Informational [Page 3] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + which store a character on a number of bits different from eight. + See below, for the numbering of bits within a byte. + + String: a sequence of arbitrary bytes. + + 1.6. Changes from previous versions + + There have been no technical changes to the deflate format since + version 1.1 of this specification. In version 1.2, some + terminology was changed. Version 1.3 is a conversion of the + specification to RFC style. + +2. Compressed representation overview + + A compressed data set consists of a series of blocks, corresponding + to successive blocks of input data. The block sizes are arbitrary, + except that non-compressible blocks are limited to 65,535 bytes. + + Each block is compressed using a combination of the LZ77 algorithm + and Huffman coding. The Huffman trees for each block are independent + of those for previous or subsequent blocks; the LZ77 algorithm may + use a reference to a duplicated string occurring in a previous block, + up to 32K input bytes before. + + Each block consists of two parts: a pair of Huffman code trees that + describe the representation of the compressed data part, and a + compressed data part. (The Huffman trees themselves are compressed + using Huffman encoding.) The compressed data consists of a series of + elements of two types: literal bytes (of strings that have not been + detected as duplicated within the previous 32K input bytes), and + pointers to duplicated strings, where a pointer is represented as a + pair . The representation used in the + "deflate" format limits distances to 32K bytes and lengths to 258 + bytes, but does not limit the size of a block, except for + uncompressible blocks, which are limited as noted above. + + Each type of value (literals, distances, and lengths) in the + compressed data is represented using a Huffman code, using one code + tree for literals and lengths and a separate code tree for distances. + The code trees for each block appear in a compact form just before + the compressed data for that block. + + + + + + + + + + +Deutsch Informational [Page 4] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + +3. Detailed specification + + 3.1. Overall conventions In the diagrams below, a box like this: + + +---+ + | | <-- the vertical bars might be missing + +---+ + + represents one byte; a box like this: + + +==============+ + | | + +==============+ + + represents a variable number of bytes. + + Bytes stored within a computer do not have a "bit order", since + they are always treated as a unit. However, a byte considered as + an integer between 0 and 255 does have a most- and least- + significant bit, and since we write numbers with the most- + significant digit on the left, we also write bytes with the most- + significant bit on the left. In the diagrams below, we number the + bits of a byte so that bit 0 is the least-significant bit, i.e., + the bits are numbered: + + +--------+ + |76543210| + +--------+ + + Within a computer, a number may occupy multiple bytes. All + multi-byte numbers in the format described here are stored with + the least-significant byte first (at the lower memory address). + For example, the decimal number 520 is stored as: + + 0 1 + +--------+--------+ + |00001000|00000010| + +--------+--------+ + ^ ^ + | | + | + more significant byte = 2 x 256 + + less significant byte = 8 + + 3.1.1. Packing into bytes + + This document does not address the issue of the order in which + bits of a byte are transmitted on a bit-sequential medium, + since the final data format described here is byte- rather than + + + +Deutsch Informational [Page 5] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + bit-oriented. However, we describe the compressed block format + in below, as a sequence of data elements of various bit + lengths, not a sequence of bytes. We must therefore specify + how to pack these data elements into bytes to form the final + compressed byte sequence: + + * Data elements are packed into bytes in order of + increasing bit number within the byte, i.e., starting + with the least-significant bit of the byte. + * Data elements other than Huffman codes are packed + starting with the least-significant bit of the data + element. + * Huffman codes are packed starting with the most- + significant bit of the code. + + In other words, if one were to print out the compressed data as + a sequence of bytes, starting with the first byte at the + *right* margin and proceeding to the *left*, with the most- + significant bit of each byte on the left as usual, one would be + able to parse the result from right to left, with fixed-width + elements in the correct MSB-to-LSB order and Huffman codes in + bit-reversed order (i.e., with the first bit of the code in the + relative LSB position). + + 3.2. Compressed block format + + 3.2.1. Synopsis of prefix and Huffman coding + + Prefix coding represents symbols from an a priori known + alphabet by bit sequences (codes), one code for each symbol, in + a manner such that different symbols may be represented by bit + sequences of different lengths, but a parser can always parse + an encoded string unambiguously symbol-by-symbol. + + We define a prefix code in terms of a binary tree in which the + two edges descending from each non-leaf node are labeled 0 and + 1 and in which the leaf nodes correspond one-for-one with (are + labeled with) the symbols of the alphabet; then the code for a + symbol is the sequence of 0's and 1's on the edges leading from + the root to the leaf labeled with that symbol. For example: + + + + + + + + + + + +Deutsch Informational [Page 6] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + /\ Symbol Code + 0 1 ------ ---- + / \ A 00 + /\ B B 1 + 0 1 C 011 + / \ D 010 + A /\ + 0 1 + / \ + D C + + A parser can decode the next symbol from an encoded input + stream by walking down the tree from the root, at each step + choosing the edge corresponding to the next input bit. + + Given an alphabet with known symbol frequencies, the Huffman + algorithm allows the construction of an optimal prefix code + (one which represents strings with those symbol frequencies + using the fewest bits of any possible prefix codes for that + alphabet). Such a code is called a Huffman code. (See + reference [1] in Chapter 5, references for additional + information on Huffman codes.) + + Note that in the "deflate" format, the Huffman codes for the + various alphabets must not exceed certain maximum code lengths. + This constraint complicates the algorithm for computing code + lengths from symbol frequencies. Again, see Chapter 5, + references for details. + + 3.2.2. Use of Huffman coding in the "deflate" format + + The Huffman codes used for each alphabet in the "deflate" + format have two additional rules: + + * All codes of a given bit length have lexicographically + consecutive values, in the same order as the symbols + they represent; + + * Shorter codes lexicographically precede longer codes. + + + + + + + + + + + + +Deutsch Informational [Page 7] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + We could recode the example above to follow this rule as + follows, assuming that the order of the alphabet is ABCD: + + Symbol Code + ------ ---- + A 10 + B 0 + C 110 + D 111 + + I.e., 0 precedes 10 which precedes 11x, and 110 and 111 are + lexicographically consecutive. + + Given this rule, we can define the Huffman code for an alphabet + just by giving the bit lengths of the codes for each symbol of + the alphabet in order; this is sufficient to determine the + actual codes. In our example, the code is completely defined + by the sequence of bit lengths (2, 1, 3, 3). The following + algorithm generates the codes as integers, intended to be read + from most- to least-significant bit. The code lengths are + initially in tree[I].Len; the codes are produced in + tree[I].Code. + + 1) Count the number of codes for each code length. Let + bl_count[N] be the number of codes of length N, N >= 1. + + 2) Find the numerical value of the smallest code for each + code length: + + code = 0; + bl_count[0] = 0; + for (bits = 1; bits <= MAX_BITS; bits++) { + code = (code + bl_count[bits-1]) << 1; + next_code[bits] = code; + } + + 3) Assign numerical values to all codes, using consecutive + values for all codes of the same length with the base + values determined at step 2. Codes that are never used + (which have a bit length of zero) must not be assigned a + value. + + for (n = 0; n <= max_code; n++) { + len = tree[n].Len; + if (len != 0) { + tree[n].Code = next_code[len]; + next_code[len]++; + } + + + +Deutsch Informational [Page 8] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + } + + Example: + + Consider the alphabet ABCDEFGH, with bit lengths (3, 3, 3, 3, + 3, 2, 4, 4). After step 1, we have: + + N bl_count[N] + - ----------- + 2 1 + 3 5 + 4 2 + + Step 2 computes the following next_code values: + + N next_code[N] + - ------------ + 1 0 + 2 0 + 3 2 + 4 14 + + Step 3 produces the following code values: + + Symbol Length Code + ------ ------ ---- + A 3 010 + B 3 011 + C 3 100 + D 3 101 + E 3 110 + F 2 00 + G 4 1110 + H 4 1111 + + 3.2.3. Details of block format + + Each block of compressed data begins with 3 header bits + containing the following data: + + first bit BFINAL + next 2 bits BTYPE + + Note that the header bits do not necessarily begin on a byte + boundary, since a block does not necessarily occupy an integral + number of bytes. + + + + + +Deutsch Informational [Page 9] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + BFINAL is set if and only if this is the last block of the data + set. + + BTYPE specifies how the data are compressed, as follows: + + 00 - no compression + 01 - compressed with fixed Huffman codes + 10 - compressed with dynamic Huffman codes + 11 - reserved (error) + + The only difference between the two compressed cases is how the + Huffman codes for the literal/length and distance alphabets are + defined. + + In all cases, the decoding algorithm for the actual data is as + follows: + + do + read block header from input stream. + if stored with no compression + skip any remaining bits in current partially + processed byte + read LEN and NLEN (see next section) + copy LEN bytes of data to output + otherwise + if compressed with dynamic Huffman codes + read representation of code trees (see + subsection below) + loop (until end of block code recognized) + decode literal/length value from input stream + if value < 256 + copy value (literal byte) to output stream + otherwise + if value = end of block (256) + break from loop + otherwise (value = 257..285) + decode distance from input stream + + move backwards distance bytes in the output + stream, and copy length bytes from this + position to the output stream. + end loop + while not last block + + Note that a duplicated string reference may refer to a string + in a previous block; i.e., the backward distance may cross one + or more block boundaries. However a distance cannot refer past + the beginning of the output stream. (An application using a + + + +Deutsch Informational [Page 10] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + preset dictionary might discard part of the output stream; a + distance can refer to that part of the output stream anyway) + Note also that the referenced string may overlap the current + position; for example, if the last 2 bytes decoded have values + X and Y, a string reference with + adds X,Y,X,Y,X to the output stream. + + We now specify each compression method in turn. + + 3.2.4. Non-compressed blocks (BTYPE=00) + + Any bits of input up to the next byte boundary are ignored. + The rest of the block consists of the following information: + + 0 1 2 3 4... + +---+---+---+---+================================+ + | LEN | NLEN |... LEN bytes of literal data...| + +---+---+---+---+================================+ + + LEN is the number of data bytes in the block. NLEN is the + one's complement of LEN. + + 3.2.5. Compressed blocks (length and distance codes) + + As noted above, encoded data blocks in the "deflate" format + consist of sequences of symbols drawn from three conceptually + distinct alphabets: either literal bytes, from the alphabet of + byte values (0..255), or pairs, + where the length is drawn from (3..258) and the distance is + drawn from (1..32,768). In fact, the literal and length + alphabets are merged into a single alphabet (0..285), where + values 0..255 represent literal bytes, the value 256 indicates + end-of-block, and values 257..285 represent length codes + (possibly in conjunction with extra bits following the symbol + code) as follows: + + + + + + + + + + + + + + + + +Deutsch Informational [Page 11] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + Extra Extra Extra + Code Bits Length(s) Code Bits Lengths Code Bits Length(s) + ---- ---- ------ ---- ---- ------- ---- ---- ------- + 257 0 3 267 1 15,16 277 4 67-82 + 258 0 4 268 1 17,18 278 4 83-98 + 259 0 5 269 2 19-22 279 4 99-114 + 260 0 6 270 2 23-26 280 4 115-130 + 261 0 7 271 2 27-30 281 5 131-162 + 262 0 8 272 2 31-34 282 5 163-194 + 263 0 9 273 3 35-42 283 5 195-226 + 264 0 10 274 3 43-50 284 5 227-257 + 265 1 11,12 275 3 51-58 285 0 258 + 266 1 13,14 276 3 59-66 + + The extra bits should be interpreted as a machine integer + stored with the most-significant bit first, e.g., bits 1110 + represent the value 14. + + Extra Extra Extra + Code Bits Dist Code Bits Dist Code Bits Distance + ---- ---- ---- ---- ---- ------ ---- ---- -------- + 0 0 1 10 4 33-48 20 9 1025-1536 + 1 0 2 11 4 49-64 21 9 1537-2048 + 2 0 3 12 5 65-96 22 10 2049-3072 + 3 0 4 13 5 97-128 23 10 3073-4096 + 4 1 5,6 14 6 129-192 24 11 4097-6144 + 5 1 7,8 15 6 193-256 25 11 6145-8192 + 6 2 9-12 16 7 257-384 26 12 8193-12288 + 7 2 13-16 17 7 385-512 27 12 12289-16384 + 8 3 17-24 18 8 513-768 28 13 16385-24576 + 9 3 25-32 19 8 769-1024 29 13 24577-32768 + + 3.2.6. Compression with fixed Huffman codes (BTYPE=01) + + The Huffman codes for the two alphabets are fixed, and are not + represented explicitly in the data. The Huffman code lengths + for the literal/length alphabet are: + + Lit Value Bits Codes + --------- ---- ----- + 0 - 143 8 00110000 through + 10111111 + 144 - 255 9 110010000 through + 111111111 + 256 - 279 7 0000000 through + 0010111 + 280 - 287 8 11000000 through + 11000111 + + + +Deutsch Informational [Page 12] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + The code lengths are sufficient to generate the actual codes, + as described above; we show the codes in the table for added + clarity. Literal/length values 286-287 will never actually + occur in the compressed data, but participate in the code + construction. + + Distance codes 0-31 are represented by (fixed-length) 5-bit + codes, with possible additional bits as shown in the table + shown in Paragraph 3.2.5, above. Note that distance codes 30- + 31 will never actually occur in the compressed data. + + 3.2.7. Compression with dynamic Huffman codes (BTYPE=10) + + The Huffman codes for the two alphabets appear in the block + immediately after the header bits and before the actual + compressed data, first the literal/length code and then the + distance code. Each code is defined by a sequence of code + lengths, as discussed in Paragraph 3.2.2, above. For even + greater compactness, the code length sequences themselves are + compressed using a Huffman code. The alphabet for code lengths + is as follows: + + 0 - 15: Represent code lengths of 0 - 15 + 16: Copy the previous code length 3 - 6 times. + The next 2 bits indicate repeat length + (0 = 3, ... , 3 = 6) + Example: Codes 8, 16 (+2 bits 11), + 16 (+2 bits 10) will expand to + 12 code lengths of 8 (1 + 6 + 5) + 17: Repeat a code length of 0 for 3 - 10 times. + (3 bits of length) + 18: Repeat a code length of 0 for 11 - 138 times + (7 bits of length) + + A code length of 0 indicates that the corresponding symbol in + the literal/length or distance alphabet will not occur in the + block, and should not participate in the Huffman code + construction algorithm given earlier. If only one distance + code is used, it is encoded using one bit, not zero bits; in + this case there is a single code length of one, with one unused + code. One distance code of zero bits means that there are no + distance codes used at all (the data is all literals). + + We can now define the format of the block: + + 5 Bits: HLIT, # of Literal/Length codes - 257 (257 - 286) + 5 Bits: HDIST, # of Distance codes - 1 (1 - 32) + 4 Bits: HCLEN, # of Code Length codes - 4 (4 - 19) + + + +Deutsch Informational [Page 13] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + (HCLEN + 4) x 3 bits: code lengths for the code length + alphabet given just above, in the order: 16, 17, 18, + 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 + + These code lengths are interpreted as 3-bit integers + (0-7); as above, a code length of 0 means the + corresponding symbol (literal/length or distance code + length) is not used. + + HLIT + 257 code lengths for the literal/length alphabet, + encoded using the code length Huffman code + + HDIST + 1 code lengths for the distance alphabet, + encoded using the code length Huffman code + + The actual compressed data of the block, + encoded using the literal/length and distance Huffman + codes + + The literal/length symbol 256 (end of data), + encoded using the literal/length Huffman code + + The code length repeat codes can cross from HLIT + 257 to the + HDIST + 1 code lengths. In other words, all code lengths form + a single sequence of HLIT + HDIST + 258 values. + + 3.3. Compliance + + A compressor may limit further the ranges of values specified in + the previous section and still be compliant; for example, it may + limit the range of backward pointers to some value smaller than + 32K. Similarly, a compressor may limit the size of blocks so that + a compressible block fits in memory. + + A compliant decompressor must accept the full range of possible + values defined in the previous section, and must accept blocks of + arbitrary size. + +4. Compression algorithm details + + While it is the intent of this document to define the "deflate" + compressed data format without reference to any particular + compression algorithm, the format is related to the compressed + formats produced by LZ77 (Lempel-Ziv 1977, see reference [2] below); + since many variations of LZ77 are patented, it is strongly + recommended that the implementor of a compressor follow the general + algorithm presented here, which is known not to be patented per se. + The material in this section is not part of the definition of the + + + +Deutsch Informational [Page 14] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + specification per se, and a compressor need not follow it in order to + be compliant. + + The compressor terminates a block when it determines that starting a + new block with fresh trees would be useful, or when the block size + fills up the compressor's block buffer. + + The compressor uses a chained hash table to find duplicated strings, + using a hash function that operates on 3-byte sequences. At any + given point during compression, let XYZ be the next 3 input bytes to + be examined (not necessarily all different, of course). First, the + compressor examines the hash chain for XYZ. If the chain is empty, + the compressor simply writes out X as a literal byte and advances one + byte in the input. If the hash chain is not empty, indicating that + the sequence XYZ (or, if we are unlucky, some other 3 bytes with the + same hash function value) has occurred recently, the compressor + compares all strings on the XYZ hash chain with the actual input data + sequence starting at the current point, and selects the longest + match. + + The compressor searches the hash chains starting with the most recent + strings, to favor small distances and thus take advantage of the + Huffman encoding. The hash chains are singly linked. There are no + deletions from the hash chains; the algorithm simply discards matches + that are too old. To avoid a worst-case situation, very long hash + chains are arbitrarily truncated at a certain length, determined by a + run-time parameter. + + To improve overall compression, the compressor optionally defers the + selection of matches ("lazy matching"): after a match of length N has + been found, the compressor searches for a longer match starting at + the next input byte. If it finds a longer match, it truncates the + previous match to a length of one (thus producing a single literal + byte) and then emits the longer match. Otherwise, it emits the + original match, and, as described above, advances N bytes before + continuing. + + Run-time parameters also control this "lazy match" procedure. If + compression ratio is most important, the compressor attempts a + complete second search regardless of the length of the first match. + In the normal case, if the current match is "long enough", the + compressor reduces the search for a longer match, thus speeding up + the process. If speed is most important, the compressor inserts new + strings in the hash table only when no match was found, or when the + match is not "too long". This degrades the compression ratio but + saves time since there are both fewer insertions and fewer searches. + + + + + +Deutsch Informational [Page 15] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + +5. References + + [1] Huffman, D. A., "A Method for the Construction of Minimum + Redundancy Codes", Proceedings of the Institute of Radio + Engineers, September 1952, Volume 40, Number 9, pp. 1098-1101. + + [2] Ziv J., Lempel A., "A Universal Algorithm for Sequential Data + Compression", IEEE Transactions on Information Theory, Vol. 23, + No. 3, pp. 337-343. + + [3] Gailly, J.-L., and Adler, M., ZLIB documentation and sources, + available in ftp://ftp.uu.net/pub/archiving/zip/doc/ + + [4] Gailly, J.-L., and Adler, M., GZIP documentation and sources, + available as gzip-*.tar in ftp://prep.ai.mit.edu/pub/gnu/ + + [5] Schwartz, E. S., and Kallick, B. "Generating a canonical prefix + encoding." Comm. ACM, 7,3 (Mar. 1964), pp. 166-169. + + [6] Hirschberg and Lelewer, "Efficient decoding of prefix codes," + Comm. ACM, 33,4, April 1990, pp. 449-459. + +6. Security Considerations + + Any data compression method involves the reduction of redundancy in + the data. Consequently, any corruption of the data is likely to have + severe effects and be difficult to correct. Uncompressed text, on + the other hand, will probably still be readable despite the presence + of some corrupted bytes. + + It is recommended that systems using this data format provide some + means of validating the integrity of the compressed data. See + reference [3], for example. + +7. Source code + + Source code for a C language implementation of a "deflate" compliant + compressor and decompressor is available within the zlib package at + ftp://ftp.uu.net/pub/archiving/zip/zlib/. + +8. Acknowledgements + + Trademarks cited in this document are the property of their + respective owners. + + Phil Katz designed the deflate format. Jean-Loup Gailly and Mark + Adler wrote the related software described in this specification. + Glenn Randers-Pehrson converted this document to RFC and HTML format. + + + +Deutsch Informational [Page 16] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + +9. Author's Address + + L. Peter Deutsch + Aladdin Enterprises + 203 Santa Margarita Ave. + Menlo Park, CA 94025 + + Phone: (415) 322-0103 (AM only) + FAX: (415) 322-1734 + EMail: + + Questions about the technical content of this specification can be + sent by email to: + + Jean-Loup Gailly and + Mark Adler + + Editorial comments on this specification can be sent by email to: + + L. Peter Deutsch and + Glenn Randers-Pehrson + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Deutsch Informational [Page 17] + diff --git a/externe_kniznice/zlib/doc/rfc1952.txt b/externe_kniznice/zlib/doc/rfc1952.txt new file mode 100644 index 0000000..a8e51b4 --- /dev/null +++ b/externe_kniznice/zlib/doc/rfc1952.txt @@ -0,0 +1,675 @@ + + + + + + +Network Working Group P. Deutsch +Request for Comments: 1952 Aladdin Enterprises +Category: Informational May 1996 + + + GZIP file format specification version 4.3 + +Status of This Memo + + This memo provides information for the Internet community. This memo + does not specify an Internet standard of any kind. Distribution of + this memo is unlimited. + +IESG Note: + + The IESG takes no position on the validity of any Intellectual + Property Rights statements contained in this document. + +Notices + + Copyright (c) 1996 L. Peter Deutsch + + Permission is granted to copy and distribute this document for any + purpose and without charge, including translations into other + languages and incorporation into compilations, provided that the + copyright notice and this notice are preserved, and that any + substantive changes or deletions from the original are clearly + marked. + + A pointer to the latest version of this and related documentation in + HTML format can be found at the URL + . + +Abstract + + This specification defines a lossless compressed data format that is + compatible with the widely used GZIP utility. The format includes a + cyclic redundancy check value for detecting data corruption. The + format presently uses the DEFLATE method of compression but can be + easily extended to use other compression methods. The format can be + implemented readily in a manner not covered by patents. + + + + + + + + + + +Deutsch Informational [Page 1] + +RFC 1952 GZIP File Format Specification May 1996 + + +Table of Contents + + 1. Introduction ................................................... 2 + 1.1. Purpose ................................................... 2 + 1.2. Intended audience ......................................... 3 + 1.3. Scope ..................................................... 3 + 1.4. Compliance ................................................ 3 + 1.5. Definitions of terms and conventions used ................. 3 + 1.6. Changes from previous versions ............................ 3 + 2. Detailed specification ......................................... 4 + 2.1. Overall conventions ....................................... 4 + 2.2. File format ............................................... 5 + 2.3. Member format ............................................. 5 + 2.3.1. Member header and trailer ........................... 6 + 2.3.1.1. Extra field ................................... 8 + 2.3.1.2. Compliance .................................... 9 + 3. References .................................................. 9 + 4. Security Considerations .................................... 10 + 5. Acknowledgements ........................................... 10 + 6. Author's Address ........................................... 10 + 7. Appendix: Jean-Loup Gailly's gzip utility .................. 11 + 8. Appendix: Sample CRC Code .................................. 11 + +1. Introduction + + 1.1. Purpose + + The purpose of this specification is to define a lossless + compressed data format that: + + * Is independent of CPU type, operating system, file system, + and character set, and hence can be used for interchange; + * Can compress or decompress a data stream (as opposed to a + randomly accessible file) to produce another data stream, + using only an a priori bounded amount of intermediate + storage, and hence can be used in data communications or + similar structures such as Unix filters; + * Compresses data with efficiency comparable to the best + currently available general-purpose compression methods, + and in particular considerably better than the "compress" + program; + * Can be implemented readily in a manner not covered by + patents, and hence can be practiced freely; + * Is compatible with the file format produced by the current + widely used gzip utility, in that conforming decompressors + will be able to read data produced by the existing gzip + compressor. + + + + +Deutsch Informational [Page 2] + +RFC 1952 GZIP File Format Specification May 1996 + + + The data format defined by this specification does not attempt to: + + * Provide random access to compressed data; + * Compress specialized data (e.g., raster graphics) as well as + the best currently available specialized algorithms. + + 1.2. Intended audience + + This specification is intended for use by implementors of software + to compress data into gzip format and/or decompress data from gzip + format. + + The text of the specification assumes a basic background in + programming at the level of bits and other primitive data + representations. + + 1.3. Scope + + The specification specifies a compression method and a file format + (the latter assuming only that a file can store a sequence of + arbitrary bytes). It does not specify any particular interface to + a file system or anything about character sets or encodings + (except for file names and comments, which are optional). + + 1.4. Compliance + + Unless otherwise indicated below, a compliant decompressor must be + able to accept and decompress any file that conforms to all the + specifications presented here; a compliant compressor must produce + files that conform to all the specifications presented here. The + material in the appendices is not part of the specification per se + and is not relevant to compliance. + + 1.5. Definitions of terms and conventions used + + byte: 8 bits stored or transmitted as a unit (same as an octet). + (For this specification, a byte is exactly 8 bits, even on + machines which store a character on a number of bits different + from 8.) See below for the numbering of bits within a byte. + + 1.6. Changes from previous versions + + There have been no technical changes to the gzip format since + version 4.1 of this specification. In version 4.2, some + terminology was changed, and the sample CRC code was rewritten for + clarity and to eliminate the requirement for the caller to do pre- + and post-conditioning. Version 4.3 is a conversion of the + specification to RFC style. + + + +Deutsch Informational [Page 3] + +RFC 1952 GZIP File Format Specification May 1996 + + +2. Detailed specification + + 2.1. Overall conventions + + In the diagrams below, a box like this: + + +---+ + | | <-- the vertical bars might be missing + +---+ + + represents one byte; a box like this: + + +==============+ + | | + +==============+ + + represents a variable number of bytes. + + Bytes stored within a computer do not have a "bit order", since + they are always treated as a unit. However, a byte considered as + an integer between 0 and 255 does have a most- and least- + significant bit, and since we write numbers with the most- + significant digit on the left, we also write bytes with the most- + significant bit on the left. In the diagrams below, we number the + bits of a byte so that bit 0 is the least-significant bit, i.e., + the bits are numbered: + + +--------+ + |76543210| + +--------+ + + This document does not address the issue of the order in which + bits of a byte are transmitted on a bit-sequential medium, since + the data format described here is byte- rather than bit-oriented. + + Within a computer, a number may occupy multiple bytes. All + multi-byte numbers in the format described here are stored with + the least-significant byte first (at the lower memory address). + For example, the decimal number 520 is stored as: + + 0 1 + +--------+--------+ + |00001000|00000010| + +--------+--------+ + ^ ^ + | | + | + more significant byte = 2 x 256 + + less significant byte = 8 + + + +Deutsch Informational [Page 4] + +RFC 1952 GZIP File Format Specification May 1996 + + + 2.2. File format + + A gzip file consists of a series of "members" (compressed data + sets). The format of each member is specified in the following + section. The members simply appear one after another in the file, + with no additional information before, between, or after them. + + 2.3. Member format + + Each member has the following structure: + + +---+---+---+---+---+---+---+---+---+---+ + |ID1|ID2|CM |FLG| MTIME |XFL|OS | (more-->) + +---+---+---+---+---+---+---+---+---+---+ + + (if FLG.FEXTRA set) + + +---+---+=================================+ + | XLEN |...XLEN bytes of "extra field"...| (more-->) + +---+---+=================================+ + + (if FLG.FNAME set) + + +=========================================+ + |...original file name, zero-terminated...| (more-->) + +=========================================+ + + (if FLG.FCOMMENT set) + + +===================================+ + |...file comment, zero-terminated...| (more-->) + +===================================+ + + (if FLG.FHCRC set) + + +---+---+ + | CRC16 | + +---+---+ + + +=======================+ + |...compressed blocks...| (more-->) + +=======================+ + + 0 1 2 3 4 5 6 7 + +---+---+---+---+---+---+---+---+ + | CRC32 | ISIZE | + +---+---+---+---+---+---+---+---+ + + + + +Deutsch Informational [Page 5] + +RFC 1952 GZIP File Format Specification May 1996 + + + 2.3.1. Member header and trailer + + ID1 (IDentification 1) + ID2 (IDentification 2) + These have the fixed values ID1 = 31 (0x1f, \037), ID2 = 139 + (0x8b, \213), to identify the file as being in gzip format. + + CM (Compression Method) + This identifies the compression method used in the file. CM + = 0-7 are reserved. CM = 8 denotes the "deflate" + compression method, which is the one customarily used by + gzip and which is documented elsewhere. + + FLG (FLaGs) + This flag byte is divided into individual bits as follows: + + bit 0 FTEXT + bit 1 FHCRC + bit 2 FEXTRA + bit 3 FNAME + bit 4 FCOMMENT + bit 5 reserved + bit 6 reserved + bit 7 reserved + + If FTEXT is set, the file is probably ASCII text. This is + an optional indication, which the compressor may set by + checking a small amount of the input data to see whether any + non-ASCII characters are present. In case of doubt, FTEXT + is cleared, indicating binary data. For systems which have + different file formats for ascii text and binary data, the + decompressor can use FTEXT to choose the appropriate format. + We deliberately do not specify the algorithm used to set + this bit, since a compressor always has the option of + leaving it cleared and a decompressor always has the option + of ignoring it and letting some other program handle issues + of data conversion. + + If FHCRC is set, a CRC16 for the gzip header is present, + immediately before the compressed data. The CRC16 consists + of the two least significant bytes of the CRC32 for all + bytes of the gzip header up to and not including the CRC16. + [The FHCRC bit was never set by versions of gzip up to + 1.2.4, even though it was documented with a different + meaning in gzip 1.2.4.] + + If FEXTRA is set, optional extra fields are present, as + described in a following section. + + + +Deutsch Informational [Page 6] + +RFC 1952 GZIP File Format Specification May 1996 + + + If FNAME is set, an original file name is present, + terminated by a zero byte. The name must consist of ISO + 8859-1 (LATIN-1) characters; on operating systems using + EBCDIC or any other character set for file names, the name + must be translated to the ISO LATIN-1 character set. This + is the original name of the file being compressed, with any + directory components removed, and, if the file being + compressed is on a file system with case insensitive names, + forced to lower case. There is no original file name if the + data was compressed from a source other than a named file; + for example, if the source was stdin on a Unix system, there + is no file name. + + If FCOMMENT is set, a zero-terminated file comment is + present. This comment is not interpreted; it is only + intended for human consumption. The comment must consist of + ISO 8859-1 (LATIN-1) characters. Line breaks should be + denoted by a single line feed character (10 decimal). + + Reserved FLG bits must be zero. + + MTIME (Modification TIME) + This gives the most recent modification time of the original + file being compressed. The time is in Unix format, i.e., + seconds since 00:00:00 GMT, Jan. 1, 1970. (Note that this + may cause problems for MS-DOS and other systems that use + local rather than Universal time.) If the compressed data + did not come from a file, MTIME is set to the time at which + compression started. MTIME = 0 means no time stamp is + available. + + XFL (eXtra FLags) + These flags are available for use by specific compression + methods. The "deflate" method (CM = 8) sets these flags as + follows: + + XFL = 2 - compressor used maximum compression, + slowest algorithm + XFL = 4 - compressor used fastest algorithm + + OS (Operating System) + This identifies the type of file system on which compression + took place. This may be useful in determining end-of-line + convention for text files. The currently defined values are + as follows: + + + + + + +Deutsch Informational [Page 7] + +RFC 1952 GZIP File Format Specification May 1996 + + + 0 - FAT filesystem (MS-DOS, OS/2, NT/Win32) + 1 - Amiga + 2 - VMS (or OpenVMS) + 3 - Unix + 4 - VM/CMS + 5 - Atari TOS + 6 - HPFS filesystem (OS/2, NT) + 7 - Macintosh + 8 - Z-System + 9 - CP/M + 10 - TOPS-20 + 11 - NTFS filesystem (NT) + 12 - QDOS + 13 - Acorn RISCOS + 255 - unknown + + XLEN (eXtra LENgth) + If FLG.FEXTRA is set, this gives the length of the optional + extra field. See below for details. + + CRC32 (CRC-32) + This contains a Cyclic Redundancy Check value of the + uncompressed data computed according to CRC-32 algorithm + used in the ISO 3309 standard and in section 8.1.1.6.2 of + ITU-T recommendation V.42. (See http://www.iso.ch for + ordering ISO documents. See gopher://info.itu.ch for an + online version of ITU-T V.42.) + + ISIZE (Input SIZE) + This contains the size of the original (uncompressed) input + data modulo 2^32. + + 2.3.1.1. Extra field + + If the FLG.FEXTRA bit is set, an "extra field" is present in + the header, with total length XLEN bytes. It consists of a + series of subfields, each of the form: + + +---+---+---+---+==================================+ + |SI1|SI2| LEN |... LEN bytes of subfield data ...| + +---+---+---+---+==================================+ + + SI1 and SI2 provide a subfield ID, typically two ASCII letters + with some mnemonic value. Jean-Loup Gailly + is maintaining a registry of subfield + IDs; please send him any subfield ID you wish to use. Subfield + IDs with SI2 = 0 are reserved for future use. The following + IDs are currently defined: + + + +Deutsch Informational [Page 8] + +RFC 1952 GZIP File Format Specification May 1996 + + + SI1 SI2 Data + ---------- ---------- ---- + 0x41 ('A') 0x70 ('P') Apollo file type information + + LEN gives the length of the subfield data, excluding the 4 + initial bytes. + + 2.3.1.2. Compliance + + A compliant compressor must produce files with correct ID1, + ID2, CM, CRC32, and ISIZE, but may set all the other fields in + the fixed-length part of the header to default values (255 for + OS, 0 for all others). The compressor must set all reserved + bits to zero. + + A compliant decompressor must check ID1, ID2, and CM, and + provide an error indication if any of these have incorrect + values. It must examine FEXTRA/XLEN, FNAME, FCOMMENT and FHCRC + at least so it can skip over the optional fields if they are + present. It need not examine any other part of the header or + trailer; in particular, a decompressor may ignore FTEXT and OS + and always produce binary output, and still be compliant. A + compliant decompressor must give an error indication if any + reserved bit is non-zero, since such a bit could indicate the + presence of a new field that would cause subsequent data to be + interpreted incorrectly. + +3. References + + [1] "Information Processing - 8-bit single-byte coded graphic + character sets - Part 1: Latin alphabet No.1" (ISO 8859-1:1987). + The ISO 8859-1 (Latin-1) character set is a superset of 7-bit + ASCII. Files defining this character set are available as + iso_8859-1.* in ftp://ftp.uu.net/graphics/png/documents/ + + [2] ISO 3309 + + [3] ITU-T recommendation V.42 + + [4] Deutsch, L.P.,"DEFLATE Compressed Data Format Specification", + available in ftp://ftp.uu.net/pub/archiving/zip/doc/ + + [5] Gailly, J.-L., GZIP documentation, available as gzip-*.tar in + ftp://prep.ai.mit.edu/pub/gnu/ + + [6] Sarwate, D.V., "Computation of Cyclic Redundancy Checks via Table + Look-Up", Communications of the ACM, 31(8), pp.1008-1013. + + + + +Deutsch Informational [Page 9] + +RFC 1952 GZIP File Format Specification May 1996 + + + [7] Schwaderer, W.D., "CRC Calculation", April 85 PC Tech Journal, + pp.118-133. + + [8] ftp://ftp.adelaide.edu.au/pub/rocksoft/papers/crc_v3.txt, + describing the CRC concept. + +4. Security Considerations + + Any data compression method involves the reduction of redundancy in + the data. Consequently, any corruption of the data is likely to have + severe effects and be difficult to correct. Uncompressed text, on + the other hand, will probably still be readable despite the presence + of some corrupted bytes. + + It is recommended that systems using this data format provide some + means of validating the integrity of the compressed data, such as by + setting and checking the CRC-32 check value. + +5. Acknowledgements + + Trademarks cited in this document are the property of their + respective owners. + + Jean-Loup Gailly designed the gzip format and wrote, with Mark Adler, + the related software described in this specification. Glenn + Randers-Pehrson converted this document to RFC and HTML format. + +6. Author's Address + + L. Peter Deutsch + Aladdin Enterprises + 203 Santa Margarita Ave. + Menlo Park, CA 94025 + + Phone: (415) 322-0103 (AM only) + FAX: (415) 322-1734 + EMail: + + Questions about the technical content of this specification can be + sent by email to: + + Jean-Loup Gailly and + Mark Adler + + Editorial comments on this specification can be sent by email to: + + L. Peter Deutsch and + Glenn Randers-Pehrson + + + +Deutsch Informational [Page 10] + +RFC 1952 GZIP File Format Specification May 1996 + + +7. Appendix: Jean-Loup Gailly's gzip utility + + The most widely used implementation of gzip compression, and the + original documentation on which this specification is based, were + created by Jean-Loup Gailly . Since this + implementation is a de facto standard, we mention some more of its + features here. Again, the material in this section is not part of + the specification per se, and implementations need not follow it to + be compliant. + + When compressing or decompressing a file, gzip preserves the + protection, ownership, and modification time attributes on the local + file system, since there is no provision for representing protection + attributes in the gzip file format itself. Since the file format + includes a modification time, the gzip decompressor provides a + command line switch that assigns the modification time from the file, + rather than the local modification time of the compressed input, to + the decompressed output. + +8. Appendix: Sample CRC Code + + The following sample code represents a practical implementation of + the CRC (Cyclic Redundancy Check). (See also ISO 3309 and ITU-T V.42 + for a formal specification.) + + The sample code is in the ANSI C programming language. Non C users + may find it easier to read with these hints: + + & Bitwise AND operator. + ^ Bitwise exclusive-OR operator. + >> Bitwise right shift operator. When applied to an + unsigned quantity, as here, right shift inserts zero + bit(s) at the left. + ! Logical NOT operator. + ++ "n++" increments the variable n. + 0xNNN 0x introduces a hexadecimal (base 16) constant. + Suffix L indicates a long value (at least 32 bits). + + /* Table of CRCs of all 8-bit messages. */ + unsigned long crc_table[256]; + + /* Flag: has the table been computed? Initially false. */ + int crc_table_computed = 0; + + /* Make the table for a fast CRC. */ + void make_crc_table(void) + { + unsigned long c; + + + +Deutsch Informational [Page 11] + +RFC 1952 GZIP File Format Specification May 1996 + + + int n, k; + for (n = 0; n < 256; n++) { + c = (unsigned long) n; + for (k = 0; k < 8; k++) { + if (c & 1) { + c = 0xedb88320L ^ (c >> 1); + } else { + c = c >> 1; + } + } + crc_table[n] = c; + } + crc_table_computed = 1; + } + + /* + Update a running crc with the bytes buf[0..len-1] and return + the updated crc. The crc should be initialized to zero. Pre- and + post-conditioning (one's complement) is performed within this + function so it shouldn't be done by the caller. Usage example: + + unsigned long crc = 0L; + + while (read_buffer(buffer, length) != EOF) { + crc = update_crc(crc, buffer, length); + } + if (crc != original_crc) error(); + */ + unsigned long update_crc(unsigned long crc, + unsigned char *buf, int len) + { + unsigned long c = crc ^ 0xffffffffL; + int n; + + if (!crc_table_computed) + make_crc_table(); + for (n = 0; n < len; n++) { + c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8); + } + return c ^ 0xffffffffL; + } + + /* Return the CRC of the bytes buf[0..len-1]. */ + unsigned long crc(unsigned char *buf, int len) + { + return update_crc(0L, buf, len); + } + + + + +Deutsch Informational [Page 12] + diff --git a/externe_kniznice/zlib/doc/txtvsbin.txt b/externe_kniznice/zlib/doc/txtvsbin.txt new file mode 100644 index 0000000..3d0f063 --- /dev/null +++ b/externe_kniznice/zlib/doc/txtvsbin.txt @@ -0,0 +1,107 @@ +A Fast Method for Identifying Plain Text Files +============================================== + + +Introduction +------------ + +Given a file coming from an unknown source, it is sometimes desirable +to find out whether the format of that file is plain text. Although +this may appear like a simple task, a fully accurate detection of the +file type requires heavy-duty semantic analysis on the file contents. +It is, however, possible to obtain satisfactory results by employing +various heuristics. + +Previous versions of PKZip and other zip-compatible compression tools +were using a crude detection scheme: if more than 80% (4/5) of the bytes +found in a certain buffer are within the range [7..127], the file is +labeled as plain text, otherwise it is labeled as binary. A prominent +limitation of this scheme is the restriction to Latin-based alphabets. +Other alphabets, like Greek, Cyrillic or Asian, make extensive use of +the bytes within the range [128..255], and texts using these alphabets +are most often misidentified by this scheme; in other words, the rate +of false negatives is sometimes too high, which means that the recall +is low. Another weakness of this scheme is a reduced precision, due to +the false positives that may occur when binary files containing large +amounts of textual characters are misidentified as plain text. + +In this article we propose a new, simple detection scheme that features +a much increased precision and a near-100% recall. This scheme is +designed to work on ASCII, Unicode and other ASCII-derived alphabets, +and it handles single-byte encodings (ISO-8859, MacRoman, KOI8, etc.) +and variable-sized encodings (ISO-2022, UTF-8, etc.). Wider encodings +(UCS-2/UTF-16 and UCS-4/UTF-32) are not handled, however. + + +The Algorithm +------------- + +The algorithm works by dividing the set of bytecodes [0..255] into three +categories: +- The white list of textual bytecodes: + 9 (TAB), 10 (LF), 13 (CR), 32 (SPACE) to 255. +- The gray list of tolerated bytecodes: + 7 (BEL), 8 (BS), 11 (VT), 12 (FF), 26 (SUB), 27 (ESC). +- The black list of undesired, non-textual bytecodes: + 0 (NUL) to 6, 14 to 31. + +If a file contains at least one byte that belongs to the white list and +no byte that belongs to the black list, then the file is categorized as +plain text; otherwise, it is categorized as binary. (The boundary case, +when the file is empty, automatically falls into the latter category.) + + +Rationale +--------- + +The idea behind this algorithm relies on two observations. + +The first observation is that, although the full range of 7-bit codes +[0..127] is properly specified by the ASCII standard, most control +characters in the range [0..31] are not used in practice. The only +widely-used, almost universally-portable control codes are 9 (TAB), +10 (LF) and 13 (CR). There are a few more control codes that are +recognized on a reduced range of platforms and text viewers/editors: +7 (BEL), 8 (BS), 11 (VT), 12 (FF), 26 (SUB) and 27 (ESC); but these +codes are rarely (if ever) used alone, without being accompanied by +some printable text. Even the newer, portable text formats such as +XML avoid using control characters outside the list mentioned here. + +The second observation is that most of the binary files tend to contain +control characters, especially 0 (NUL). Even though the older text +detection schemes observe the presence of non-ASCII codes from the range +[128..255], the precision rarely has to suffer if this upper range is +labeled as textual, because the files that are genuinely binary tend to +contain both control characters and codes from the upper range. On the +other hand, the upper range needs to be labeled as textual, because it +is used by virtually all ASCII extensions. In particular, this range is +used for encoding non-Latin scripts. + +Since there is no counting involved, other than simply observing the +presence or the absence of some byte values, the algorithm produces +consistent results, regardless what alphabet encoding is being used. +(If counting were involved, it could be possible to obtain different +results on a text encoded, say, using ISO-8859-16 versus UTF-8.) + +There is an extra category of plain text files that are "polluted" with +one or more black-listed codes, either by mistake or by peculiar design +considerations. In such cases, a scheme that tolerates a small fraction +of black-listed codes would provide an increased recall (i.e. more true +positives). This, however, incurs a reduced precision overall, since +false positives are more likely to appear in binary files that contain +large chunks of textual data. Furthermore, "polluted" plain text should +be regarded as binary by general-purpose text detection schemes, because +general-purpose text processing algorithms might not be applicable. +Under this premise, it is safe to say that our detection method provides +a near-100% recall. + +Experiments have been run on many files coming from various platforms +and applications. We tried plain text files, system logs, source code, +formatted office documents, compiled object code, etc. The results +confirm the optimistic assumptions about the capabilities of this +algorithm. + + +-- +Cosmin Truta +Last updated: 2006-May-28 diff --git a/externe_kniznice/zlib/examples/README.examples b/externe_kniznice/zlib/examples/README.examples new file mode 100644 index 0000000..56a3171 --- /dev/null +++ b/externe_kniznice/zlib/examples/README.examples @@ -0,0 +1,49 @@ +This directory contains examples of the use of zlib and other relevant +programs and documentation. + +enough.c + calculation and justification of ENOUGH parameter in inftrees.h + - calculates the maximum table space used in inflate tree + construction over all possible Huffman codes + +fitblk.c + compress just enough input to nearly fill a requested output size + - zlib isn't designed to do this, but fitblk does it anyway + +gun.c + uncompress a gzip file + - illustrates the use of inflateBack() for high speed file-to-file + decompression using call-back functions + - is approximately twice as fast as gzip -d + - also provides Unix uncompress functionality, again twice as fast + +gzappend.c + append to a gzip file + - illustrates the use of the Z_BLOCK flush parameter for inflate() + - illustrates the use of deflatePrime() to start at any bit + +gzjoin.c + join gzip files without recalculating the crc or recompressing + - illustrates the use of the Z_BLOCK flush parameter for inflate() + - illustrates the use of crc32_combine() + +gzlog.c +gzlog.h + efficiently and robustly maintain a message log file in gzip format + - illustrates use of raw deflate, Z_PARTIAL_FLUSH, deflatePrime(), + and deflateSetDictionary() + - illustrates use of a gzip header extra field + +zlib_how.html + painfully comprehensive description of zpipe.c (see below) + - describes in excruciating detail the use of deflate() and inflate() + +zpipe.c + reads and writes zlib streams from stdin to stdout + - illustrates the proper use of deflate() and inflate() + - deeply commented in zlib_how.html (see above) + +zran.c + index a zlib or gzip stream and randomly access it + - illustrates the use of Z_BLOCK, inflatePrime(), and + inflateSetDictionary() to provide random access diff --git a/externe_kniznice/zlib/examples/enough.c b/externe_kniznice/zlib/examples/enough.c new file mode 100644 index 0000000..b991144 --- /dev/null +++ b/externe_kniznice/zlib/examples/enough.c @@ -0,0 +1,572 @@ +/* enough.c -- determine the maximum size of inflate's Huffman code tables over + * all possible valid and complete Huffman codes, subject to a length limit. + * Copyright (C) 2007, 2008, 2012 Mark Adler + * Version 1.4 18 August 2012 Mark Adler + */ + +/* Version history: + 1.0 3 Jan 2007 First version (derived from codecount.c version 1.4) + 1.1 4 Jan 2007 Use faster incremental table usage computation + Prune examine() search on previously visited states + 1.2 5 Jan 2007 Comments clean up + As inflate does, decrease root for short codes + Refuse cases where inflate would increase root + 1.3 17 Feb 2008 Add argument for initial root table size + Fix bug for initial root table size == max - 1 + Use a macro to compute the history index + 1.4 18 Aug 2012 Avoid shifts more than bits in type (caused endless loop!) + Clean up comparisons of different types + Clean up code indentation + */ + +/* + Examine all possible Huffman codes for a given number of symbols and a + maximum code length in bits to determine the maximum table size for zilb's + inflate. Only complete Huffman codes are counted. + + Two codes are considered distinct if the vectors of the number of codes per + length are not identical. So permutations of the symbol assignments result + in the same code for the counting, as do permutations of the assignments of + the bit values to the codes (i.e. only canonical codes are counted). + + We build a code from shorter to longer lengths, determining how many symbols + are coded at each length. At each step, we have how many symbols remain to + be coded, what the last code length used was, and how many bit patterns of + that length remain unused. Then we add one to the code length and double the + number of unused patterns to graduate to the next code length. We then + assign all portions of the remaining symbols to that code length that + preserve the properties of a correct and eventually complete code. Those + properties are: we cannot use more bit patterns than are available; and when + all the symbols are used, there are exactly zero possible bit patterns + remaining. + + The inflate Huffman decoding algorithm uses two-level lookup tables for + speed. There is a single first-level table to decode codes up to root bits + in length (root == 9 in the current inflate implementation). The table + has 1 << root entries and is indexed by the next root bits of input. Codes + shorter than root bits have replicated table entries, so that the correct + entry is pointed to regardless of the bits that follow the short code. If + the code is longer than root bits, then the table entry points to a second- + level table. The size of that table is determined by the longest code with + that root-bit prefix. If that longest code has length len, then the table + has size 1 << (len - root), to index the remaining bits in that set of + codes. Each subsequent root-bit prefix then has its own sub-table. The + total number of table entries required by the code is calculated + incrementally as the number of codes at each bit length is populated. When + all of the codes are shorter than root bits, then root is reduced to the + longest code length, resulting in a single, smaller, one-level table. + + The inflate algorithm also provides for small values of root (relative to + the log2 of the number of symbols), where the shortest code has more bits + than root. In that case, root is increased to the length of the shortest + code. This program, by design, does not handle that case, so it is verified + that the number of symbols is less than 2^(root + 1). + + In order to speed up the examination (by about ten orders of magnitude for + the default arguments), the intermediate states in the build-up of a code + are remembered and previously visited branches are pruned. The memory + required for this will increase rapidly with the total number of symbols and + the maximum code length in bits. However this is a very small price to pay + for the vast speedup. + + First, all of the possible Huffman codes are counted, and reachable + intermediate states are noted by a non-zero count in a saved-results array. + Second, the intermediate states that lead to (root + 1) bit or longer codes + are used to look at all sub-codes from those junctures for their inflate + memory usage. (The amount of memory used is not affected by the number of + codes of root bits or less in length.) Third, the visited states in the + construction of those sub-codes and the associated calculation of the table + size is recalled in order to avoid recalculating from the same juncture. + Beginning the code examination at (root + 1) bit codes, which is enabled by + identifying the reachable nodes, accounts for about six of the orders of + magnitude of improvement for the default arguments. About another four + orders of magnitude come from not revisiting previous states. Out of + approximately 2x10^16 possible Huffman codes, only about 2x10^6 sub-codes + need to be examined to cover all of the possible table memory usage cases + for the default arguments of 286 symbols limited to 15-bit codes. + + Note that an unsigned long long type is used for counting. It is quite easy + to exceed the capacity of an eight-byte integer with a large number of + symbols and a large maximum code length, so multiple-precision arithmetic + would need to replace the unsigned long long arithmetic in that case. This + program will abort if an overflow occurs. The big_t type identifies where + the counting takes place. + + An unsigned long long type is also used for calculating the number of + possible codes remaining at the maximum length. This limits the maximum + code length to the number of bits in a long long minus the number of bits + needed to represent the symbols in a flat code. The code_t type identifies + where the bit pattern counting takes place. + */ + +#include +#include +#include +#include + +#define local static + +/* special data types */ +typedef unsigned long long big_t; /* type for code counting */ +typedef unsigned long long code_t; /* type for bit pattern counting */ +struct tab { /* type for been here check */ + size_t len; /* length of bit vector in char's */ + char *vec; /* allocated bit vector */ +}; + +/* The array for saving results, num[], is indexed with this triplet: + + syms: number of symbols remaining to code + left: number of available bit patterns at length len + len: number of bits in the codes currently being assigned + + Those indices are constrained thusly when saving results: + + syms: 3..totsym (totsym == total symbols to code) + left: 2..syms - 1, but only the evens (so syms == 8 -> 2, 4, 6) + len: 1..max - 1 (max == maximum code length in bits) + + syms == 2 is not saved since that immediately leads to a single code. left + must be even, since it represents the number of available bit patterns at + the current length, which is double the number at the previous length. + left ends at syms-1 since left == syms immediately results in a single code. + (left > sym is not allowed since that would result in an incomplete code.) + len is less than max, since the code completes immediately when len == max. + + The offset into the array is calculated for the three indices with the + first one (syms) being outermost, and the last one (len) being innermost. + We build the array with length max-1 lists for the len index, with syms-3 + of those for each symbol. There are totsym-2 of those, with each one + varying in length as a function of sym. See the calculation of index in + count() for the index, and the calculation of size in main() for the size + of the array. + + For the deflate example of 286 symbols limited to 15-bit codes, the array + has 284,284 entries, taking up 2.17 MB for an 8-byte big_t. More than + half of the space allocated for saved results is actually used -- not all + possible triplets are reached in the generation of valid Huffman codes. + */ + +/* The array for tracking visited states, done[], is itself indexed identically + to the num[] array as described above for the (syms, left, len) triplet. + Each element in the array is further indexed by the (mem, rem) doublet, + where mem is the amount of inflate table space used so far, and rem is the + remaining unused entries in the current inflate sub-table. Each indexed + element is simply one bit indicating whether the state has been visited or + not. Since the ranges for mem and rem are not known a priori, each bit + vector is of a variable size, and grows as needed to accommodate the visited + states. mem and rem are used to calculate a single index in a triangular + array. Since the range of mem is expected in the default case to be about + ten times larger than the range of rem, the array is skewed to reduce the + memory usage, with eight times the range for mem than for rem. See the + calculations for offset and bit in beenhere() for the details. + + For the deflate example of 286 symbols limited to 15-bit codes, the bit + vectors grow to total approximately 21 MB, in addition to the 4.3 MB done[] + array itself. + */ + +/* Globals to avoid propagating constants or constant pointers recursively */ +local int max; /* maximum allowed bit length for the codes */ +local int root; /* size of base code table in bits */ +local int large; /* largest code table so far */ +local size_t size; /* number of elements in num and done */ +local int *code; /* number of symbols assigned to each bit length */ +local big_t *num; /* saved results array for code counting */ +local struct tab *done; /* states already evaluated array */ + +/* Index function for num[] and done[] */ +#define INDEX(i,j,k) (((size_t)((i-1)>>1)*((i-2)>>1)+(j>>1)-1)*(max-1)+k-1) + +/* Free allocated space. Uses globals code, num, and done. */ +local void cleanup(void) +{ + size_t n; + + if (done != NULL) { + for (n = 0; n < size; n++) + if (done[n].len) + free(done[n].vec); + free(done); + } + if (num != NULL) + free(num); + if (code != NULL) + free(code); +} + +/* Return the number of possible Huffman codes using bit patterns of lengths + len through max inclusive, coding syms symbols, with left bit patterns of + length len unused -- return -1 if there is an overflow in the counting. + Keep a record of previous results in num to prevent repeating the same + calculation. Uses the globals max and num. */ +local big_t count(int syms, int len, int left) +{ + big_t sum; /* number of possible codes from this juncture */ + big_t got; /* value returned from count() */ + int least; /* least number of syms to use at this juncture */ + int most; /* most number of syms to use at this juncture */ + int use; /* number of bit patterns to use in next call */ + size_t index; /* index of this case in *num */ + + /* see if only one possible code */ + if (syms == left) + return 1; + + /* note and verify the expected state */ + assert(syms > left && left > 0 && len < max); + + /* see if we've done this one already */ + index = INDEX(syms, left, len); + got = num[index]; + if (got) + return got; /* we have -- return the saved result */ + + /* we need to use at least this many bit patterns so that the code won't be + incomplete at the next length (more bit patterns than symbols) */ + least = (left << 1) - syms; + if (least < 0) + least = 0; + + /* we can use at most this many bit patterns, lest there not be enough + available for the remaining symbols at the maximum length (if there were + no limit to the code length, this would become: most = left - 1) */ + most = (((code_t)left << (max - len)) - syms) / + (((code_t)1 << (max - len)) - 1); + + /* count all possible codes from this juncture and add them up */ + sum = 0; + for (use = least; use <= most; use++) { + got = count(syms - use, len + 1, (left - use) << 1); + sum += got; + if (got == (big_t)0 - 1 || sum < got) /* overflow */ + return (big_t)0 - 1; + } + + /* verify that all recursive calls are productive */ + assert(sum != 0); + + /* save the result and return it */ + num[index] = sum; + return sum; +} + +/* Return true if we've been here before, set to true if not. Set a bit in a + bit vector to indicate visiting this state. Each (syms,len,left) state + has a variable size bit vector indexed by (mem,rem). The bit vector is + lengthened if needed to allow setting the (mem,rem) bit. */ +local int beenhere(int syms, int len, int left, int mem, int rem) +{ + size_t index; /* index for this state's bit vector */ + size_t offset; /* offset in this state's bit vector */ + int bit; /* mask for this state's bit */ + size_t length; /* length of the bit vector in bytes */ + char *vector; /* new or enlarged bit vector */ + + /* point to vector for (syms,left,len), bit in vector for (mem,rem) */ + index = INDEX(syms, left, len); + mem -= 1 << root; + offset = (mem >> 3) + rem; + offset = ((offset * (offset + 1)) >> 1) + rem; + bit = 1 << (mem & 7); + + /* see if we've been here */ + length = done[index].len; + if (offset < length && (done[index].vec[offset] & bit) != 0) + return 1; /* done this! */ + + /* we haven't been here before -- set the bit to show we have now */ + + /* see if we need to lengthen the vector in order to set the bit */ + if (length <= offset) { + /* if we have one already, enlarge it, zero out the appended space */ + if (length) { + do { + length <<= 1; + } while (length <= offset); + vector = realloc(done[index].vec, length); + if (vector != NULL) + memset(vector + done[index].len, 0, length - done[index].len); + } + + /* otherwise we need to make a new vector and zero it out */ + else { + length = 1 << (len - root); + while (length <= offset) + length <<= 1; + vector = calloc(length, sizeof(char)); + } + + /* in either case, bail if we can't get the memory */ + if (vector == NULL) { + fputs("abort: unable to allocate enough memory\n", stderr); + cleanup(); + exit(1); + } + + /* install the new vector */ + done[index].len = length; + done[index].vec = vector; + } + + /* set the bit */ + done[index].vec[offset] |= bit; + return 0; +} + +/* Examine all possible codes from the given node (syms, len, left). Compute + the amount of memory required to build inflate's decoding tables, where the + number of code structures used so far is mem, and the number remaining in + the current sub-table is rem. Uses the globals max, code, root, large, and + done. */ +local void examine(int syms, int len, int left, int mem, int rem) +{ + int least; /* least number of syms to use at this juncture */ + int most; /* most number of syms to use at this juncture */ + int use; /* number of bit patterns to use in next call */ + + /* see if we have a complete code */ + if (syms == left) { + /* set the last code entry */ + code[len] = left; + + /* complete computation of memory used by this code */ + while (rem < left) { + left -= rem; + rem = 1 << (len - root); + mem += rem; + } + assert(rem == left); + + /* if this is a new maximum, show the entries used and the sub-code */ + if (mem > large) { + large = mem; + printf("max %d: ", mem); + for (use = root + 1; use <= max; use++) + if (code[use]) + printf("%d[%d] ", code[use], use); + putchar('\n'); + fflush(stdout); + } + + /* remove entries as we drop back down in the recursion */ + code[len] = 0; + return; + } + + /* prune the tree if we can */ + if (beenhere(syms, len, left, mem, rem)) + return; + + /* we need to use at least this many bit patterns so that the code won't be + incomplete at the next length (more bit patterns than symbols) */ + least = (left << 1) - syms; + if (least < 0) + least = 0; + + /* we can use at most this many bit patterns, lest there not be enough + available for the remaining symbols at the maximum length (if there were + no limit to the code length, this would become: most = left - 1) */ + most = (((code_t)left << (max - len)) - syms) / + (((code_t)1 << (max - len)) - 1); + + /* occupy least table spaces, creating new sub-tables as needed */ + use = least; + while (rem < use) { + use -= rem; + rem = 1 << (len - root); + mem += rem; + } + rem -= use; + + /* examine codes from here, updating table space as we go */ + for (use = least; use <= most; use++) { + code[len] = use; + examine(syms - use, len + 1, (left - use) << 1, + mem + (rem ? 1 << (len - root) : 0), rem << 1); + if (rem == 0) { + rem = 1 << (len - root); + mem += rem; + } + rem--; + } + + /* remove entries as we drop back down in the recursion */ + code[len] = 0; +} + +/* Look at all sub-codes starting with root + 1 bits. Look at only the valid + intermediate code states (syms, left, len). For each completed code, + calculate the amount of memory required by inflate to build the decoding + tables. Find the maximum amount of memory required and show the code that + requires that maximum. Uses the globals max, root, and num. */ +local void enough(int syms) +{ + int n; /* number of remaing symbols for this node */ + int left; /* number of unused bit patterns at this length */ + size_t index; /* index of this case in *num */ + + /* clear code */ + for (n = 0; n <= max; n++) + code[n] = 0; + + /* look at all (root + 1) bit and longer codes */ + large = 1 << root; /* base table */ + if (root < max) /* otherwise, there's only a base table */ + for (n = 3; n <= syms; n++) + for (left = 2; left < n; left += 2) + { + /* look at all reachable (root + 1) bit nodes, and the + resulting codes (complete at root + 2 or more) */ + index = INDEX(n, left, root + 1); + if (root + 1 < max && num[index]) /* reachable node */ + examine(n, root + 1, left, 1 << root, 0); + + /* also look at root bit codes with completions at root + 1 + bits (not saved in num, since complete), just in case */ + if (num[index - 1] && n <= left << 1) + examine((n - left) << 1, root + 1, (n - left) << 1, + 1 << root, 0); + } + + /* done */ + printf("done: maximum of %d table entries\n", large); +} + +/* + Examine and show the total number of possible Huffman codes for a given + maximum number of symbols, initial root table size, and maximum code length + in bits -- those are the command arguments in that order. The default + values are 286, 9, and 15 respectively, for the deflate literal/length code. + The possible codes are counted for each number of coded symbols from two to + the maximum. The counts for each of those and the total number of codes are + shown. The maximum number of inflate table entires is then calculated + across all possible codes. Each new maximum number of table entries and the + associated sub-code (starting at root + 1 == 10 bits) is shown. + + To count and examine Huffman codes that are not length-limited, provide a + maximum length equal to the number of symbols minus one. + + For the deflate literal/length code, use "enough". For the deflate distance + code, use "enough 30 6". + + This uses the %llu printf format to print big_t numbers, which assumes that + big_t is an unsigned long long. If the big_t type is changed (for example + to a multiple precision type), the method of printing will also need to be + updated. + */ +int main(int argc, char **argv) +{ + int syms; /* total number of symbols to code */ + int n; /* number of symbols to code for this run */ + big_t got; /* return value of count() */ + big_t sum; /* accumulated number of codes over n */ + code_t word; /* for counting bits in code_t */ + + /* set up globals for cleanup() */ + code = NULL; + num = NULL; + done = NULL; + + /* get arguments -- default to the deflate literal/length code */ + syms = 286; + root = 9; + max = 15; + if (argc > 1) { + syms = atoi(argv[1]); + if (argc > 2) { + root = atoi(argv[2]); + if (argc > 3) + max = atoi(argv[3]); + } + } + if (argc > 4 || syms < 2 || root < 1 || max < 1) { + fputs("invalid arguments, need: [sym >= 2 [root >= 1 [max >= 1]]]\n", + stderr); + return 1; + } + + /* if not restricting the code length, the longest is syms - 1 */ + if (max > syms - 1) + max = syms - 1; + + /* determine the number of bits in a code_t */ + for (n = 0, word = 1; word; n++, word <<= 1) + ; + + /* make sure that the calculation of most will not overflow */ + if (max > n || (code_t)(syms - 2) >= (((code_t)0 - 1) >> (max - 1))) { + fputs("abort: code length too long for internal types\n", stderr); + return 1; + } + + /* reject impossible code requests */ + if ((code_t)(syms - 1) > ((code_t)1 << max) - 1) { + fprintf(stderr, "%d symbols cannot be coded in %d bits\n", + syms, max); + return 1; + } + + /* allocate code vector */ + code = calloc(max + 1, sizeof(int)); + if (code == NULL) { + fputs("abort: unable to allocate enough memory\n", stderr); + return 1; + } + + /* determine size of saved results array, checking for overflows, + allocate and clear the array (set all to zero with calloc()) */ + if (syms == 2) /* iff max == 1 */ + num = NULL; /* won't be saving any results */ + else { + size = syms >> 1; + if (size > ((size_t)0 - 1) / (n = (syms - 1) >> 1) || + (size *= n, size > ((size_t)0 - 1) / (n = max - 1)) || + (size *= n, size > ((size_t)0 - 1) / sizeof(big_t)) || + (num = calloc(size, sizeof(big_t))) == NULL) { + fputs("abort: unable to allocate enough memory\n", stderr); + cleanup(); + return 1; + } + } + + /* count possible codes for all numbers of symbols, add up counts */ + sum = 0; + for (n = 2; n <= syms; n++) { + got = count(n, 1, 2); + sum += got; + if (got == (big_t)0 - 1 || sum < got) { /* overflow */ + fputs("abort: can't count that high!\n", stderr); + cleanup(); + return 1; + } + printf("%llu %d-codes\n", got, n); + } + printf("%llu total codes for 2 to %d symbols", sum, syms); + if (max < syms - 1) + printf(" (%d-bit length limit)\n", max); + else + puts(" (no length limit)"); + + /* allocate and clear done array for beenhere() */ + if (syms == 2) + done = NULL; + else if (size > ((size_t)0 - 1) / sizeof(struct tab) || + (done = calloc(size, sizeof(struct tab))) == NULL) { + fputs("abort: unable to allocate enough memory\n", stderr); + cleanup(); + return 1; + } + + /* find and show maximum inflate table usage */ + if (root > max) /* reduce root to max length */ + root = max; + if ((code_t)syms < ((code_t)1 << (root + 1))) + enough(syms); + else + puts("cannot handle minimum code lengths > root"); + + /* done */ + cleanup(); + return 0; +} diff --git a/externe_kniznice/zlib/examples/fitblk.c b/externe_kniznice/zlib/examples/fitblk.c new file mode 100644 index 0000000..c61de5c --- /dev/null +++ b/externe_kniznice/zlib/examples/fitblk.c @@ -0,0 +1,233 @@ +/* fitblk.c: example of fitting compressed output to a specified size + Not copyrighted -- provided to the public domain + Version 1.1 25 November 2004 Mark Adler */ + +/* Version history: + 1.0 24 Nov 2004 First version + 1.1 25 Nov 2004 Change deflateInit2() to deflateInit() + Use fixed-size, stack-allocated raw buffers + Simplify code moving compression to subroutines + Use assert() for internal errors + Add detailed description of approach + */ + +/* Approach to just fitting a requested compressed size: + + fitblk performs three compression passes on a portion of the input + data in order to determine how much of that input will compress to + nearly the requested output block size. The first pass generates + enough deflate blocks to produce output to fill the requested + output size plus a specfied excess amount (see the EXCESS define + below). The last deflate block may go quite a bit past that, but + is discarded. The second pass decompresses and recompresses just + the compressed data that fit in the requested plus excess sized + buffer. The deflate process is terminated after that amount of + input, which is less than the amount consumed on the first pass. + The last deflate block of the result will be of a comparable size + to the final product, so that the header for that deflate block and + the compression ratio for that block will be about the same as in + the final product. The third compression pass decompresses the + result of the second step, but only the compressed data up to the + requested size minus an amount to allow the compressed stream to + complete (see the MARGIN define below). That will result in a + final compressed stream whose length is less than or equal to the + requested size. Assuming sufficient input and a requested size + greater than a few hundred bytes, the shortfall will typically be + less than ten bytes. + + If the input is short enough that the first compression completes + before filling the requested output size, then that compressed + stream is return with no recompression. + + EXCESS is chosen to be just greater than the shortfall seen in a + two pass approach similar to the above. That shortfall is due to + the last deflate block compressing more efficiently with a smaller + header on the second pass. EXCESS is set to be large enough so + that there is enough uncompressed data for the second pass to fill + out the requested size, and small enough so that the final deflate + block of the second pass will be close in size to the final deflate + block of the third and final pass. MARGIN is chosen to be just + large enough to assure that the final compression has enough room + to complete in all cases. + */ + +#include +#include +#include +#include "zlib.h" + +#define local static + +/* print nastygram and leave */ +local void quit(char *why) +{ + fprintf(stderr, "fitblk abort: %s\n", why); + exit(1); +} + +#define RAWLEN 4096 /* intermediate uncompressed buffer size */ + +/* compress from file to def until provided buffer is full or end of + input reached; return last deflate() return value, or Z_ERRNO if + there was read error on the file */ +local int partcompress(FILE *in, z_streamp def) +{ + int ret, flush; + unsigned char raw[RAWLEN]; + + flush = Z_NO_FLUSH; + do { + def->avail_in = fread(raw, 1, RAWLEN, in); + if (ferror(in)) + return Z_ERRNO; + def->next_in = raw; + if (feof(in)) + flush = Z_FINISH; + ret = deflate(def, flush); + assert(ret != Z_STREAM_ERROR); + } while (def->avail_out != 0 && flush == Z_NO_FLUSH); + return ret; +} + +/* recompress from inf's input to def's output; the input for inf and + the output for def are set in those structures before calling; + return last deflate() return value, or Z_MEM_ERROR if inflate() + was not able to allocate enough memory when it needed to */ +local int recompress(z_streamp inf, z_streamp def) +{ + int ret, flush; + unsigned char raw[RAWLEN]; + + flush = Z_NO_FLUSH; + do { + /* decompress */ + inf->avail_out = RAWLEN; + inf->next_out = raw; + ret = inflate(inf, Z_NO_FLUSH); + assert(ret != Z_STREAM_ERROR && ret != Z_DATA_ERROR && + ret != Z_NEED_DICT); + if (ret == Z_MEM_ERROR) + return ret; + + /* compress what was decompresed until done or no room */ + def->avail_in = RAWLEN - inf->avail_out; + def->next_in = raw; + if (inf->avail_out != 0) + flush = Z_FINISH; + ret = deflate(def, flush); + assert(ret != Z_STREAM_ERROR); + } while (ret != Z_STREAM_END && def->avail_out != 0); + return ret; +} + +#define EXCESS 256 /* empirically determined stream overage */ +#define MARGIN 8 /* amount to back off for completion */ + +/* compress from stdin to fixed-size block on stdout */ +int main(int argc, char **argv) +{ + int ret; /* return code */ + unsigned size; /* requested fixed output block size */ + unsigned have; /* bytes written by deflate() call */ + unsigned char *blk; /* intermediate and final stream */ + unsigned char *tmp; /* close to desired size stream */ + z_stream def, inf; /* zlib deflate and inflate states */ + + /* get requested output size */ + if (argc != 2) + quit("need one argument: size of output block"); + ret = strtol(argv[1], argv + 1, 10); + if (argv[1][0] != 0) + quit("argument must be a number"); + if (ret < 8) /* 8 is minimum zlib stream size */ + quit("need positive size of 8 or greater"); + size = (unsigned)ret; + + /* allocate memory for buffers and compression engine */ + blk = malloc(size + EXCESS); + def.zalloc = Z_NULL; + def.zfree = Z_NULL; + def.opaque = Z_NULL; + ret = deflateInit(&def, Z_DEFAULT_COMPRESSION); + if (ret != Z_OK || blk == NULL) + quit("out of memory"); + + /* compress from stdin until output full, or no more input */ + def.avail_out = size + EXCESS; + def.next_out = blk; + ret = partcompress(stdin, &def); + if (ret == Z_ERRNO) + quit("error reading input"); + + /* if it all fit, then size was undersubscribed -- done! */ + if (ret == Z_STREAM_END && def.avail_out >= EXCESS) { + /* write block to stdout */ + have = size + EXCESS - def.avail_out; + if (fwrite(blk, 1, have, stdout) != have || ferror(stdout)) + quit("error writing output"); + + /* clean up and print results to stderr */ + ret = deflateEnd(&def); + assert(ret != Z_STREAM_ERROR); + free(blk); + fprintf(stderr, + "%u bytes unused out of %u requested (all input)\n", + size - have, size); + return 0; + } + + /* it didn't all fit -- set up for recompression */ + inf.zalloc = Z_NULL; + inf.zfree = Z_NULL; + inf.opaque = Z_NULL; + inf.avail_in = 0; + inf.next_in = Z_NULL; + ret = inflateInit(&inf); + tmp = malloc(size + EXCESS); + if (ret != Z_OK || tmp == NULL) + quit("out of memory"); + ret = deflateReset(&def); + assert(ret != Z_STREAM_ERROR); + + /* do first recompression close to the right amount */ + inf.avail_in = size + EXCESS; + inf.next_in = blk; + def.avail_out = size + EXCESS; + def.next_out = tmp; + ret = recompress(&inf, &def); + if (ret == Z_MEM_ERROR) + quit("out of memory"); + + /* set up for next reocmpression */ + ret = inflateReset(&inf); + assert(ret != Z_STREAM_ERROR); + ret = deflateReset(&def); + assert(ret != Z_STREAM_ERROR); + + /* do second and final recompression (third compression) */ + inf.avail_in = size - MARGIN; /* assure stream will complete */ + inf.next_in = tmp; + def.avail_out = size; + def.next_out = blk; + ret = recompress(&inf, &def); + if (ret == Z_MEM_ERROR) + quit("out of memory"); + assert(ret == Z_STREAM_END); /* otherwise MARGIN too small */ + + /* done -- write block to stdout */ + have = size - def.avail_out; + if (fwrite(blk, 1, have, stdout) != have || ferror(stdout)) + quit("error writing output"); + + /* clean up and print results to stderr */ + free(tmp); + ret = inflateEnd(&inf); + assert(ret != Z_STREAM_ERROR); + ret = deflateEnd(&def); + assert(ret != Z_STREAM_ERROR); + free(blk); + fprintf(stderr, + "%u bytes unused out of %u requested (%lu input)\n", + size - have, size, def.total_in); + return 0; +} diff --git a/externe_kniznice/zlib/examples/gun.c b/externe_kniznice/zlib/examples/gun.c new file mode 100644 index 0000000..be44fa5 --- /dev/null +++ b/externe_kniznice/zlib/examples/gun.c @@ -0,0 +1,702 @@ +/* gun.c -- simple gunzip to give an example of the use of inflateBack() + * Copyright (C) 2003, 2005, 2008, 2010, 2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + Version 1.7 12 August 2012 Mark Adler */ + +/* Version history: + 1.0 16 Feb 2003 First version for testing of inflateBack() + 1.1 21 Feb 2005 Decompress concatenated gzip streams + Remove use of "this" variable (C++ keyword) + Fix return value for in() + Improve allocation failure checking + Add typecasting for void * structures + Add -h option for command version and usage + Add a bunch of comments + 1.2 20 Mar 2005 Add Unix compress (LZW) decompression + Copy file attributes from input file to output file + 1.3 12 Jun 2005 Add casts for error messages [Oberhumer] + 1.4 8 Dec 2006 LZW decompression speed improvements + 1.5 9 Feb 2008 Avoid warning in latest version of gcc + 1.6 17 Jan 2010 Avoid signed/unsigned comparison warnings + 1.7 12 Aug 2012 Update for z_const usage in zlib 1.2.8 + */ + +/* + gun [ -t ] [ name ... ] + + decompresses the data in the named gzip files. If no arguments are given, + gun will decompress from stdin to stdout. The names must end in .gz, -gz, + .z, -z, _z, or .Z. The uncompressed data will be written to a file name + with the suffix stripped. On success, the original file is deleted. On + failure, the output file is deleted. For most failures, the command will + continue to process the remaining names on the command line. A memory + allocation failure will abort the command. If -t is specified, then the + listed files or stdin will be tested as gzip files for integrity (without + checking for a proper suffix), no output will be written, and no files + will be deleted. + + Like gzip, gun allows concatenated gzip streams and will decompress them, + writing all of the uncompressed data to the output. Unlike gzip, gun allows + an empty file on input, and will produce no error writing an empty output + file. + + gun will also decompress files made by Unix compress, which uses LZW + compression. These files are automatically detected by virtue of their + magic header bytes. Since the end of Unix compress stream is marked by the + end-of-file, they cannot be concantenated. If a Unix compress stream is + encountered in an input file, it is the last stream in that file. + + Like gunzip and uncompress, the file attributes of the original compressed + file are maintained in the final uncompressed file, to the extent that the + user permissions allow it. + + On my Mac OS X PowerPC G4, gun is almost twice as fast as gunzip (version + 1.2.4) is on the same file, when gun is linked with zlib 1.2.2. Also the + LZW decompression provided by gun is about twice as fast as the standard + Unix uncompress command. + */ + +/* external functions and related types and constants */ +#include /* fprintf() */ +#include /* malloc(), free() */ +#include /* strerror(), strcmp(), strlen(), memcpy() */ +#include /* errno */ +#include /* open() */ +#include /* read(), write(), close(), chown(), unlink() */ +#include +#include /* stat(), chmod() */ +#include /* utime() */ +#include "zlib.h" /* inflateBackInit(), inflateBack(), */ + /* inflateBackEnd(), crc32() */ + +/* function declaration */ +#define local static + +/* buffer constants */ +#define SIZE 32768U /* input and output buffer sizes */ +#define PIECE 16384 /* limits i/o chunks for 16-bit int case */ + +/* structure for infback() to pass to input function in() -- it maintains the + input file and a buffer of size SIZE */ +struct ind { + int infile; + unsigned char *inbuf; +}; + +/* Load input buffer, assumed to be empty, and return bytes loaded and a + pointer to them. read() is called until the buffer is full, or until it + returns end-of-file or error. Return 0 on error. */ +local unsigned in(void *in_desc, z_const unsigned char **buf) +{ + int ret; + unsigned len; + unsigned char *next; + struct ind *me = (struct ind *)in_desc; + + next = me->inbuf; + *buf = next; + len = 0; + do { + ret = PIECE; + if ((unsigned)ret > SIZE - len) + ret = (int)(SIZE - len); + ret = (int)read(me->infile, next, ret); + if (ret == -1) { + len = 0; + break; + } + next += ret; + len += ret; + } while (ret != 0 && len < SIZE); + return len; +} + +/* structure for infback() to pass to output function out() -- it maintains the + output file, a running CRC-32 check on the output and the total number of + bytes output, both for checking against the gzip trailer. (The length in + the gzip trailer is stored modulo 2^32, so it's ok if a long is 32 bits and + the output is greater than 4 GB.) */ +struct outd { + int outfile; + int check; /* true if checking crc and total */ + unsigned long crc; + unsigned long total; +}; + +/* Write output buffer and update the CRC-32 and total bytes written. write() + is called until all of the output is written or an error is encountered. + On success out() returns 0. For a write failure, out() returns 1. If the + output file descriptor is -1, then nothing is written. + */ +local int out(void *out_desc, unsigned char *buf, unsigned len) +{ + int ret; + struct outd *me = (struct outd *)out_desc; + + if (me->check) { + me->crc = crc32(me->crc, buf, len); + me->total += len; + } + if (me->outfile != -1) + do { + ret = PIECE; + if ((unsigned)ret > len) + ret = (int)len; + ret = (int)write(me->outfile, buf, ret); + if (ret == -1) + return 1; + buf += ret; + len -= ret; + } while (len != 0); + return 0; +} + +/* next input byte macro for use inside lunpipe() and gunpipe() */ +#define NEXT() (have ? 0 : (have = in(indp, &next)), \ + last = have ? (have--, (int)(*next++)) : -1) + +/* memory for gunpipe() and lunpipe() -- + the first 256 entries of prefix[] and suffix[] are never used, could + have offset the index, but it's faster to waste the memory */ +unsigned char inbuf[SIZE]; /* input buffer */ +unsigned char outbuf[SIZE]; /* output buffer */ +unsigned short prefix[65536]; /* index to LZW prefix string */ +unsigned char suffix[65536]; /* one-character LZW suffix */ +unsigned char match[65280 + 2]; /* buffer for reversed match or gzip + 32K sliding window */ + +/* throw out what's left in the current bits byte buffer (this is a vestigial + aspect of the compressed data format derived from an implementation that + made use of a special VAX machine instruction!) */ +#define FLUSHCODE() \ + do { \ + left = 0; \ + rem = 0; \ + if (chunk > have) { \ + chunk -= have; \ + have = 0; \ + if (NEXT() == -1) \ + break; \ + chunk--; \ + if (chunk > have) { \ + chunk = have = 0; \ + break; \ + } \ + } \ + have -= chunk; \ + next += chunk; \ + chunk = 0; \ + } while (0) + +/* Decompress a compress (LZW) file from indp to outfile. The compress magic + header (two bytes) has already been read and verified. There are have bytes + of buffered input at next. strm is used for passing error information back + to gunpipe(). + + lunpipe() will return Z_OK on success, Z_BUF_ERROR for an unexpected end of + file, read error, or write error (a write error indicated by strm->next_in + not equal to Z_NULL), or Z_DATA_ERROR for invalid input. + */ +local int lunpipe(unsigned have, z_const unsigned char *next, struct ind *indp, + int outfile, z_stream *strm) +{ + int last; /* last byte read by NEXT(), or -1 if EOF */ + unsigned chunk; /* bytes left in current chunk */ + int left; /* bits left in rem */ + unsigned rem; /* unused bits from input */ + int bits; /* current bits per code */ + unsigned code; /* code, table traversal index */ + unsigned mask; /* mask for current bits codes */ + int max; /* maximum bits per code for this stream */ + unsigned flags; /* compress flags, then block compress flag */ + unsigned end; /* last valid entry in prefix/suffix tables */ + unsigned temp; /* current code */ + unsigned prev; /* previous code */ + unsigned final; /* last character written for previous code */ + unsigned stack; /* next position for reversed string */ + unsigned outcnt; /* bytes in output buffer */ + struct outd outd; /* output structure */ + unsigned char *p; + + /* set up output */ + outd.outfile = outfile; + outd.check = 0; + + /* process remainder of compress header -- a flags byte */ + flags = NEXT(); + if (last == -1) + return Z_BUF_ERROR; + if (flags & 0x60) { + strm->msg = (char *)"unknown lzw flags set"; + return Z_DATA_ERROR; + } + max = flags & 0x1f; + if (max < 9 || max > 16) { + strm->msg = (char *)"lzw bits out of range"; + return Z_DATA_ERROR; + } + if (max == 9) /* 9 doesn't really mean 9 */ + max = 10; + flags &= 0x80; /* true if block compress */ + + /* clear table */ + bits = 9; + mask = 0x1ff; + end = flags ? 256 : 255; + + /* set up: get first 9-bit code, which is the first decompressed byte, but + don't create a table entry until the next code */ + if (NEXT() == -1) /* no compressed data is ok */ + return Z_OK; + final = prev = (unsigned)last; /* low 8 bits of code */ + if (NEXT() == -1) /* missing a bit */ + return Z_BUF_ERROR; + if (last & 1) { /* code must be < 256 */ + strm->msg = (char *)"invalid lzw code"; + return Z_DATA_ERROR; + } + rem = (unsigned)last >> 1; /* remaining 7 bits */ + left = 7; + chunk = bits - 2; /* 7 bytes left in this chunk */ + outbuf[0] = (unsigned char)final; /* write first decompressed byte */ + outcnt = 1; + + /* decode codes */ + stack = 0; + for (;;) { + /* if the table will be full after this, increment the code size */ + if (end >= mask && bits < max) { + FLUSHCODE(); + bits++; + mask <<= 1; + mask++; + } + + /* get a code of length bits */ + if (chunk == 0) /* decrement chunk modulo bits */ + chunk = bits; + code = rem; /* low bits of code */ + if (NEXT() == -1) { /* EOF is end of compressed data */ + /* write remaining buffered output */ + if (outcnt && out(&outd, outbuf, outcnt)) { + strm->next_in = outbuf; /* signal write error */ + return Z_BUF_ERROR; + } + return Z_OK; + } + code += (unsigned)last << left; /* middle (or high) bits of code */ + left += 8; + chunk--; + if (bits > left) { /* need more bits */ + if (NEXT() == -1) /* can't end in middle of code */ + return Z_BUF_ERROR; + code += (unsigned)last << left; /* high bits of code */ + left += 8; + chunk--; + } + code &= mask; /* mask to current code length */ + left -= bits; /* number of unused bits */ + rem = (unsigned)last >> (8 - left); /* unused bits from last byte */ + + /* process clear code (256) */ + if (code == 256 && flags) { + FLUSHCODE(); + bits = 9; /* initialize bits and mask */ + mask = 0x1ff; + end = 255; /* empty table */ + continue; /* get next code */ + } + + /* special code to reuse last match */ + temp = code; /* save the current code */ + if (code > end) { + /* Be picky on the allowed code here, and make sure that the code + we drop through (prev) will be a valid index so that random + input does not cause an exception. The code != end + 1 check is + empirically derived, and not checked in the original uncompress + code. If this ever causes a problem, that check could be safely + removed. Leaving this check in greatly improves gun's ability + to detect random or corrupted input after a compress header. + In any case, the prev > end check must be retained. */ + if (code != end + 1 || prev > end) { + strm->msg = (char *)"invalid lzw code"; + return Z_DATA_ERROR; + } + match[stack++] = (unsigned char)final; + code = prev; + } + + /* walk through linked list to generate output in reverse order */ + p = match + stack; + while (code >= 256) { + *p++ = suffix[code]; + code = prefix[code]; + } + stack = p - match; + match[stack++] = (unsigned char)code; + final = code; + + /* link new table entry */ + if (end < mask) { + end++; + prefix[end] = (unsigned short)prev; + suffix[end] = (unsigned char)final; + } + + /* set previous code for next iteration */ + prev = temp; + + /* write output in forward order */ + while (stack > SIZE - outcnt) { + while (outcnt < SIZE) + outbuf[outcnt++] = match[--stack]; + if (out(&outd, outbuf, outcnt)) { + strm->next_in = outbuf; /* signal write error */ + return Z_BUF_ERROR; + } + outcnt = 0; + } + p = match + stack; + do { + outbuf[outcnt++] = *--p; + } while (p > match); + stack = 0; + + /* loop for next code with final and prev as the last match, rem and + left provide the first 0..7 bits of the next code, end is the last + valid table entry */ + } +} + +/* Decompress a gzip file from infile to outfile. strm is assumed to have been + successfully initialized with inflateBackInit(). The input file may consist + of a series of gzip streams, in which case all of them will be decompressed + to the output file. If outfile is -1, then the gzip stream(s) integrity is + checked and nothing is written. + + The return value is a zlib error code: Z_MEM_ERROR if out of memory, + Z_DATA_ERROR if the header or the compressed data is invalid, or if the + trailer CRC-32 check or length doesn't match, Z_BUF_ERROR if the input ends + prematurely or a write error occurs, or Z_ERRNO if junk (not a another gzip + stream) follows a valid gzip stream. + */ +local int gunpipe(z_stream *strm, int infile, int outfile) +{ + int ret, first, last; + unsigned have, flags, len; + z_const unsigned char *next = NULL; + struct ind ind, *indp; + struct outd outd; + + /* setup input buffer */ + ind.infile = infile; + ind.inbuf = inbuf; + indp = &ind; + + /* decompress concatenated gzip streams */ + have = 0; /* no input data read in yet */ + first = 1; /* looking for first gzip header */ + strm->next_in = Z_NULL; /* so Z_BUF_ERROR means EOF */ + for (;;) { + /* look for the two magic header bytes for a gzip stream */ + if (NEXT() == -1) { + ret = Z_OK; + break; /* empty gzip stream is ok */ + } + if (last != 31 || (NEXT() != 139 && last != 157)) { + strm->msg = (char *)"incorrect header check"; + ret = first ? Z_DATA_ERROR : Z_ERRNO; + break; /* not a gzip or compress header */ + } + first = 0; /* next non-header is junk */ + + /* process a compress (LZW) file -- can't be concatenated after this */ + if (last == 157) { + ret = lunpipe(have, next, indp, outfile, strm); + break; + } + + /* process remainder of gzip header */ + ret = Z_BUF_ERROR; + if (NEXT() != 8) { /* only deflate method allowed */ + if (last == -1) break; + strm->msg = (char *)"unknown compression method"; + ret = Z_DATA_ERROR; + break; + } + flags = NEXT(); /* header flags */ + NEXT(); /* discard mod time, xflgs, os */ + NEXT(); + NEXT(); + NEXT(); + NEXT(); + NEXT(); + if (last == -1) break; + if (flags & 0xe0) { + strm->msg = (char *)"unknown header flags set"; + ret = Z_DATA_ERROR; + break; + } + if (flags & 4) { /* extra field */ + len = NEXT(); + len += (unsigned)(NEXT()) << 8; + if (last == -1) break; + while (len > have) { + len -= have; + have = 0; + if (NEXT() == -1) break; + len--; + } + if (last == -1) break; + have -= len; + next += len; + } + if (flags & 8) /* file name */ + while (NEXT() != 0 && last != -1) + ; + if (flags & 16) /* comment */ + while (NEXT() != 0 && last != -1) + ; + if (flags & 2) { /* header crc */ + NEXT(); + NEXT(); + } + if (last == -1) break; + + /* set up output */ + outd.outfile = outfile; + outd.check = 1; + outd.crc = crc32(0L, Z_NULL, 0); + outd.total = 0; + + /* decompress data to output */ + strm->next_in = next; + strm->avail_in = have; + ret = inflateBack(strm, in, indp, out, &outd); + if (ret != Z_STREAM_END) break; + next = strm->next_in; + have = strm->avail_in; + strm->next_in = Z_NULL; /* so Z_BUF_ERROR means EOF */ + + /* check trailer */ + ret = Z_BUF_ERROR; + if (NEXT() != (int)(outd.crc & 0xff) || + NEXT() != (int)((outd.crc >> 8) & 0xff) || + NEXT() != (int)((outd.crc >> 16) & 0xff) || + NEXT() != (int)((outd.crc >> 24) & 0xff)) { + /* crc error */ + if (last != -1) { + strm->msg = (char *)"incorrect data check"; + ret = Z_DATA_ERROR; + } + break; + } + if (NEXT() != (int)(outd.total & 0xff) || + NEXT() != (int)((outd.total >> 8) & 0xff) || + NEXT() != (int)((outd.total >> 16) & 0xff) || + NEXT() != (int)((outd.total >> 24) & 0xff)) { + /* length error */ + if (last != -1) { + strm->msg = (char *)"incorrect length check"; + ret = Z_DATA_ERROR; + } + break; + } + + /* go back and look for another gzip stream */ + } + + /* clean up and return */ + return ret; +} + +/* Copy file attributes, from -> to, as best we can. This is best effort, so + no errors are reported. The mode bits, including suid, sgid, and the sticky + bit are copied (if allowed), the owner's user id and group id are copied + (again if allowed), and the access and modify times are copied. */ +local void copymeta(char *from, char *to) +{ + struct stat was; + struct utimbuf when; + + /* get all of from's Unix meta data, return if not a regular file */ + if (stat(from, &was) != 0 || (was.st_mode & S_IFMT) != S_IFREG) + return; + + /* set to's mode bits, ignore errors */ + (void)chmod(to, was.st_mode & 07777); + + /* copy owner's user and group, ignore errors */ + (void)chown(to, was.st_uid, was.st_gid); + + /* copy access and modify times, ignore errors */ + when.actime = was.st_atime; + when.modtime = was.st_mtime; + (void)utime(to, &when); +} + +/* Decompress the file inname to the file outnname, of if test is true, just + decompress without writing and check the gzip trailer for integrity. If + inname is NULL or an empty string, read from stdin. If outname is NULL or + an empty string, write to stdout. strm is a pre-initialized inflateBack + structure. When appropriate, copy the file attributes from inname to + outname. + + gunzip() returns 1 if there is an out-of-memory error or an unexpected + return code from gunpipe(). Otherwise it returns 0. + */ +local int gunzip(z_stream *strm, char *inname, char *outname, int test) +{ + int ret; + int infile, outfile; + + /* open files */ + if (inname == NULL || *inname == 0) { + inname = "-"; + infile = 0; /* stdin */ + } + else { + infile = open(inname, O_RDONLY, 0); + if (infile == -1) { + fprintf(stderr, "gun cannot open %s\n", inname); + return 0; + } + } + if (test) + outfile = -1; + else if (outname == NULL || *outname == 0) { + outname = "-"; + outfile = 1; /* stdout */ + } + else { + outfile = open(outname, O_CREAT | O_TRUNC | O_WRONLY, 0666); + if (outfile == -1) { + close(infile); + fprintf(stderr, "gun cannot create %s\n", outname); + return 0; + } + } + errno = 0; + + /* decompress */ + ret = gunpipe(strm, infile, outfile); + if (outfile > 2) close(outfile); + if (infile > 2) close(infile); + + /* interpret result */ + switch (ret) { + case Z_OK: + case Z_ERRNO: + if (infile > 2 && outfile > 2) { + copymeta(inname, outname); /* copy attributes */ + unlink(inname); + } + if (ret == Z_ERRNO) + fprintf(stderr, "gun warning: trailing garbage ignored in %s\n", + inname); + break; + case Z_DATA_ERROR: + if (outfile > 2) unlink(outname); + fprintf(stderr, "gun data error on %s: %s\n", inname, strm->msg); + break; + case Z_MEM_ERROR: + if (outfile > 2) unlink(outname); + fprintf(stderr, "gun out of memory error--aborting\n"); + return 1; + case Z_BUF_ERROR: + if (outfile > 2) unlink(outname); + if (strm->next_in != Z_NULL) { + fprintf(stderr, "gun write error on %s: %s\n", + outname, strerror(errno)); + } + else if (errno) { + fprintf(stderr, "gun read error on %s: %s\n", + inname, strerror(errno)); + } + else { + fprintf(stderr, "gun unexpected end of file on %s\n", + inname); + } + break; + default: + if (outfile > 2) unlink(outname); + fprintf(stderr, "gun internal error--aborting\n"); + return 1; + } + return 0; +} + +/* Process the gun command line arguments. See the command syntax near the + beginning of this source file. */ +int main(int argc, char **argv) +{ + int ret, len, test; + char *outname; + unsigned char *window; + z_stream strm; + + /* initialize inflateBack state for repeated use */ + window = match; /* reuse LZW match buffer */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + ret = inflateBackInit(&strm, 15, window); + if (ret != Z_OK) { + fprintf(stderr, "gun out of memory error--aborting\n"); + return 1; + } + + /* decompress each file to the same name with the suffix removed */ + argc--; + argv++; + test = 0; + if (argc && strcmp(*argv, "-h") == 0) { + fprintf(stderr, "gun 1.6 (17 Jan 2010)\n"); + fprintf(stderr, "Copyright (C) 2003-2010 Mark Adler\n"); + fprintf(stderr, "usage: gun [-t] [file1.gz [file2.Z ...]]\n"); + return 0; + } + if (argc && strcmp(*argv, "-t") == 0) { + test = 1; + argc--; + argv++; + } + if (argc) + do { + if (test) + outname = NULL; + else { + len = (int)strlen(*argv); + if (strcmp(*argv + len - 3, ".gz") == 0 || + strcmp(*argv + len - 3, "-gz") == 0) + len -= 3; + else if (strcmp(*argv + len - 2, ".z") == 0 || + strcmp(*argv + len - 2, "-z") == 0 || + strcmp(*argv + len - 2, "_z") == 0 || + strcmp(*argv + len - 2, ".Z") == 0) + len -= 2; + else { + fprintf(stderr, "gun error: no gz type on %s--skipping\n", + *argv); + continue; + } + outname = malloc(len + 1); + if (outname == NULL) { + fprintf(stderr, "gun out of memory error--aborting\n"); + ret = 1; + break; + } + memcpy(outname, *argv, len); + outname[len] = 0; + } + ret = gunzip(&strm, *argv, outname, test); + if (outname != NULL) free(outname); + if (ret) break; + } while (argv++, --argc); + else + ret = gunzip(&strm, NULL, NULL, test); + + /* clean up */ + inflateBackEnd(&strm); + return ret; +} diff --git a/externe_kniznice/zlib/examples/gzappend.c b/externe_kniznice/zlib/examples/gzappend.c new file mode 100644 index 0000000..662dec3 --- /dev/null +++ b/externe_kniznice/zlib/examples/gzappend.c @@ -0,0 +1,504 @@ +/* gzappend -- command to append to a gzip file + + Copyright (C) 2003, 2012 Mark Adler, all rights reserved + version 1.2, 11 Oct 2012 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + +/* + * Change history: + * + * 1.0 19 Oct 2003 - First version + * 1.1 4 Nov 2003 - Expand and clarify some comments and notes + * - Add version and copyright to help + * - Send help to stdout instead of stderr + * - Add some preemptive typecasts + * - Add L to constants in lseek() calls + * - Remove some debugging information in error messages + * - Use new data_type definition for zlib 1.2.1 + * - Simplfy and unify file operations + * - Finish off gzip file in gztack() + * - Use deflatePrime() instead of adding empty blocks + * - Keep gzip file clean on appended file read errors + * - Use in-place rotate instead of auxiliary buffer + * (Why you ask? Because it was fun to write!) + * 1.2 11 Oct 2012 - Fix for proper z_const usage + * - Check for input buffer malloc failure + */ + +/* + gzappend takes a gzip file and appends to it, compressing files from the + command line or data from stdin. The gzip file is written to directly, to + avoid copying that file, in case it's large. Note that this results in the + unfriendly behavior that if gzappend fails, the gzip file is corrupted. + + This program was written to illustrate the use of the new Z_BLOCK option of + zlib 1.2.x's inflate() function. This option returns from inflate() at each + block boundary to facilitate locating and modifying the last block bit at + the start of the final deflate block. Also whether using Z_BLOCK or not, + another required feature of zlib 1.2.x is that inflate() now provides the + number of unusued bits in the last input byte used. gzappend will not work + with versions of zlib earlier than 1.2.1. + + gzappend first decompresses the gzip file internally, discarding all but + the last 32K of uncompressed data, and noting the location of the last block + bit and the number of unused bits in the last byte of the compressed data. + The gzip trailer containing the CRC-32 and length of the uncompressed data + is verified. This trailer will be later overwritten. + + Then the last block bit is cleared by seeking back in the file and rewriting + the byte that contains it. Seeking forward, the last byte of the compressed + data is saved along with the number of unused bits to initialize deflate. + + A deflate process is initialized, using the last 32K of the uncompressed + data from the gzip file to initialize the dictionary. If the total + uncompressed data was less than 32K, then all of it is used to initialize + the dictionary. The deflate output bit buffer is also initialized with the + last bits from the original deflate stream. From here on, the data to + append is simply compressed using deflate, and written to the gzip file. + When that is complete, the new CRC-32 and uncompressed length are written + as the trailer of the gzip file. + */ + +#include +#include +#include +#include +#include +#include "zlib.h" + +#define local static +#define LGCHUNK 14 +#define CHUNK (1U << LGCHUNK) +#define DSIZE 32768U + +/* print an error message and terminate with extreme prejudice */ +local void bye(char *msg1, char *msg2) +{ + fprintf(stderr, "gzappend error: %s%s\n", msg1, msg2); + exit(1); +} + +/* return the greatest common divisor of a and b using Euclid's algorithm, + modified to be fast when one argument much greater than the other, and + coded to avoid unnecessary swapping */ +local unsigned gcd(unsigned a, unsigned b) +{ + unsigned c; + + while (a && b) + if (a > b) { + c = b; + while (a - c >= c) + c <<= 1; + a -= c; + } + else { + c = a; + while (b - c >= c) + c <<= 1; + b -= c; + } + return a + b; +} + +/* rotate list[0..len-1] left by rot positions, in place */ +local void rotate(unsigned char *list, unsigned len, unsigned rot) +{ + unsigned char tmp; + unsigned cycles; + unsigned char *start, *last, *to, *from; + + /* normalize rot and handle degenerate cases */ + if (len < 2) return; + if (rot >= len) rot %= len; + if (rot == 0) return; + + /* pointer to last entry in list */ + last = list + (len - 1); + + /* do simple left shift by one */ + if (rot == 1) { + tmp = *list; + memcpy(list, list + 1, len - 1); + *last = tmp; + return; + } + + /* do simple right shift by one */ + if (rot == len - 1) { + tmp = *last; + memmove(list + 1, list, len - 1); + *list = tmp; + return; + } + + /* otherwise do rotate as a set of cycles in place */ + cycles = gcd(len, rot); /* number of cycles */ + do { + start = from = list + cycles; /* start index is arbitrary */ + tmp = *from; /* save entry to be overwritten */ + for (;;) { + to = from; /* next step in cycle */ + from += rot; /* go right rot positions */ + if (from > last) from -= len; /* (pointer better not wrap) */ + if (from == start) break; /* all but one shifted */ + *to = *from; /* shift left */ + } + *to = tmp; /* complete the circle */ + } while (--cycles); +} + +/* structure for gzip file read operations */ +typedef struct { + int fd; /* file descriptor */ + int size; /* 1 << size is bytes in buf */ + unsigned left; /* bytes available at next */ + unsigned char *buf; /* buffer */ + z_const unsigned char *next; /* next byte in buffer */ + char *name; /* file name for error messages */ +} file; + +/* reload buffer */ +local int readin(file *in) +{ + int len; + + len = read(in->fd, in->buf, 1 << in->size); + if (len == -1) bye("error reading ", in->name); + in->left = (unsigned)len; + in->next = in->buf; + return len; +} + +/* read from file in, exit if end-of-file */ +local int readmore(file *in) +{ + if (readin(in) == 0) bye("unexpected end of ", in->name); + return 0; +} + +#define read1(in) (in->left == 0 ? readmore(in) : 0, \ + in->left--, *(in->next)++) + +/* skip over n bytes of in */ +local void skip(file *in, unsigned n) +{ + unsigned bypass; + + if (n > in->left) { + n -= in->left; + bypass = n & ~((1U << in->size) - 1); + if (bypass) { + if (lseek(in->fd, (off_t)bypass, SEEK_CUR) == -1) + bye("seeking ", in->name); + n -= bypass; + } + readmore(in); + if (n > in->left) + bye("unexpected end of ", in->name); + } + in->left -= n; + in->next += n; +} + +/* read a four-byte unsigned integer, little-endian, from in */ +unsigned long read4(file *in) +{ + unsigned long val; + + val = read1(in); + val += (unsigned)read1(in) << 8; + val += (unsigned long)read1(in) << 16; + val += (unsigned long)read1(in) << 24; + return val; +} + +/* skip over gzip header */ +local void gzheader(file *in) +{ + int flags; + unsigned n; + + if (read1(in) != 31 || read1(in) != 139) bye(in->name, " not a gzip file"); + if (read1(in) != 8) bye("unknown compression method in", in->name); + flags = read1(in); + if (flags & 0xe0) bye("unknown header flags set in", in->name); + skip(in, 6); + if (flags & 4) { + n = read1(in); + n += (unsigned)(read1(in)) << 8; + skip(in, n); + } + if (flags & 8) while (read1(in) != 0) ; + if (flags & 16) while (read1(in) != 0) ; + if (flags & 2) skip(in, 2); +} + +/* decompress gzip file "name", return strm with a deflate stream ready to + continue compression of the data in the gzip file, and return a file + descriptor pointing to where to write the compressed data -- the deflate + stream is initialized to compress using level "level" */ +local int gzscan(char *name, z_stream *strm, int level) +{ + int ret, lastbit, left, full; + unsigned have; + unsigned long crc, tot; + unsigned char *window; + off_t lastoff, end; + file gz; + + /* open gzip file */ + gz.name = name; + gz.fd = open(name, O_RDWR, 0); + if (gz.fd == -1) bye("cannot open ", name); + gz.buf = malloc(CHUNK); + if (gz.buf == NULL) bye("out of memory", ""); + gz.size = LGCHUNK; + gz.left = 0; + + /* skip gzip header */ + gzheader(&gz); + + /* prepare to decompress */ + window = malloc(DSIZE); + if (window == NULL) bye("out of memory", ""); + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; + strm->opaque = Z_NULL; + ret = inflateInit2(strm, -15); + if (ret != Z_OK) bye("out of memory", " or library mismatch"); + + /* decompress the deflate stream, saving append information */ + lastbit = 0; + lastoff = lseek(gz.fd, 0L, SEEK_CUR) - gz.left; + left = 0; + strm->avail_in = gz.left; + strm->next_in = gz.next; + crc = crc32(0L, Z_NULL, 0); + have = full = 0; + do { + /* if needed, get more input */ + if (strm->avail_in == 0) { + readmore(&gz); + strm->avail_in = gz.left; + strm->next_in = gz.next; + } + + /* set up output to next available section of sliding window */ + strm->avail_out = DSIZE - have; + strm->next_out = window + have; + + /* inflate and check for errors */ + ret = inflate(strm, Z_BLOCK); + if (ret == Z_STREAM_ERROR) bye("internal stream error!", ""); + if (ret == Z_MEM_ERROR) bye("out of memory", ""); + if (ret == Z_DATA_ERROR) + bye("invalid compressed data--format violated in", name); + + /* update crc and sliding window pointer */ + crc = crc32(crc, window + have, DSIZE - have - strm->avail_out); + if (strm->avail_out) + have = DSIZE - strm->avail_out; + else { + have = 0; + full = 1; + } + + /* process end of block */ + if (strm->data_type & 128) { + if (strm->data_type & 64) + left = strm->data_type & 0x1f; + else { + lastbit = strm->data_type & 0x1f; + lastoff = lseek(gz.fd, 0L, SEEK_CUR) - strm->avail_in; + } + } + } while (ret != Z_STREAM_END); + inflateEnd(strm); + gz.left = strm->avail_in; + gz.next = strm->next_in; + + /* save the location of the end of the compressed data */ + end = lseek(gz.fd, 0L, SEEK_CUR) - gz.left; + + /* check gzip trailer and save total for deflate */ + if (crc != read4(&gz)) + bye("invalid compressed data--crc mismatch in ", name); + tot = strm->total_out; + if ((tot & 0xffffffffUL) != read4(&gz)) + bye("invalid compressed data--length mismatch in", name); + + /* if not at end of file, warn */ + if (gz.left || readin(&gz)) + fprintf(stderr, + "gzappend warning: junk at end of gzip file overwritten\n"); + + /* clear last block bit */ + lseek(gz.fd, lastoff - (lastbit != 0), SEEK_SET); + if (read(gz.fd, gz.buf, 1) != 1) bye("reading after seek on ", name); + *gz.buf = (unsigned char)(*gz.buf ^ (1 << ((8 - lastbit) & 7))); + lseek(gz.fd, -1L, SEEK_CUR); + if (write(gz.fd, gz.buf, 1) != 1) bye("writing after seek to ", name); + + /* if window wrapped, build dictionary from window by rotating */ + if (full) { + rotate(window, DSIZE, have); + have = DSIZE; + } + + /* set up deflate stream with window, crc, total_in, and leftover bits */ + ret = deflateInit2(strm, level, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY); + if (ret != Z_OK) bye("out of memory", ""); + deflateSetDictionary(strm, window, have); + strm->adler = crc; + strm->total_in = tot; + if (left) { + lseek(gz.fd, --end, SEEK_SET); + if (read(gz.fd, gz.buf, 1) != 1) bye("reading after seek on ", name); + deflatePrime(strm, 8 - left, *gz.buf); + } + lseek(gz.fd, end, SEEK_SET); + + /* clean up and return */ + free(window); + free(gz.buf); + return gz.fd; +} + +/* append file "name" to gzip file gd using deflate stream strm -- if last + is true, then finish off the deflate stream at the end */ +local void gztack(char *name, int gd, z_stream *strm, int last) +{ + int fd, len, ret; + unsigned left; + unsigned char *in, *out; + + /* open file to compress and append */ + fd = 0; + if (name != NULL) { + fd = open(name, O_RDONLY, 0); + if (fd == -1) + fprintf(stderr, "gzappend warning: %s not found, skipping ...\n", + name); + } + + /* allocate buffers */ + in = malloc(CHUNK); + out = malloc(CHUNK); + if (in == NULL || out == NULL) bye("out of memory", ""); + + /* compress input file and append to gzip file */ + do { + /* get more input */ + len = read(fd, in, CHUNK); + if (len == -1) { + fprintf(stderr, + "gzappend warning: error reading %s, skipping rest ...\n", + name); + len = 0; + } + strm->avail_in = (unsigned)len; + strm->next_in = in; + if (len) strm->adler = crc32(strm->adler, in, (unsigned)len); + + /* compress and write all available output */ + do { + strm->avail_out = CHUNK; + strm->next_out = out; + ret = deflate(strm, last && len == 0 ? Z_FINISH : Z_NO_FLUSH); + left = CHUNK - strm->avail_out; + while (left) { + len = write(gd, out + CHUNK - strm->avail_out - left, left); + if (len == -1) bye("writing gzip file", ""); + left -= (unsigned)len; + } + } while (strm->avail_out == 0 && ret != Z_STREAM_END); + } while (len != 0); + + /* write trailer after last entry */ + if (last) { + deflateEnd(strm); + out[0] = (unsigned char)(strm->adler); + out[1] = (unsigned char)(strm->adler >> 8); + out[2] = (unsigned char)(strm->adler >> 16); + out[3] = (unsigned char)(strm->adler >> 24); + out[4] = (unsigned char)(strm->total_in); + out[5] = (unsigned char)(strm->total_in >> 8); + out[6] = (unsigned char)(strm->total_in >> 16); + out[7] = (unsigned char)(strm->total_in >> 24); + len = 8; + do { + ret = write(gd, out + 8 - len, len); + if (ret == -1) bye("writing gzip file", ""); + len -= ret; + } while (len); + close(gd); + } + + /* clean up and return */ + free(out); + free(in); + if (fd > 0) close(fd); +} + +/* process the compression level option if present, scan the gzip file, and + append the specified files, or append the data from stdin if no other file + names are provided on the command line -- the gzip file must be writable + and seekable */ +int main(int argc, char **argv) +{ + int gd, level; + z_stream strm; + + /* ignore command name */ + argc--; argv++; + + /* provide usage if no arguments */ + if (*argv == NULL) { + printf( + "gzappend 1.2 (11 Oct 2012) Copyright (C) 2003, 2012 Mark Adler\n" + ); + printf( + "usage: gzappend [-level] file.gz [ addthis [ andthis ... ]]\n"); + return 0; + } + + /* set compression level */ + level = Z_DEFAULT_COMPRESSION; + if (argv[0][0] == '-') { + if (argv[0][1] < '0' || argv[0][1] > '9' || argv[0][2] != 0) + bye("invalid compression level", ""); + level = argv[0][1] - '0'; + if (*++argv == NULL) bye("no gzip file name after options", ""); + } + + /* prepare to append to gzip file */ + gd = gzscan(*argv++, &strm, level); + + /* append files on command line, or from stdin if none */ + if (*argv == NULL) + gztack(NULL, gd, &strm, 1); + else + do { + gztack(*argv, gd, &strm, argv[1] == NULL); + } while (*++argv != NULL); + return 0; +} diff --git a/externe_kniznice/zlib/examples/gzjoin.c b/externe_kniznice/zlib/examples/gzjoin.c new file mode 100644 index 0000000..89e8098 --- /dev/null +++ b/externe_kniznice/zlib/examples/gzjoin.c @@ -0,0 +1,449 @@ +/* gzjoin -- command to join gzip files into one gzip file + + Copyright (C) 2004, 2005, 2012 Mark Adler, all rights reserved + version 1.2, 14 Aug 2012 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + +/* + * Change history: + * + * 1.0 11 Dec 2004 - First version + * 1.1 12 Jun 2005 - Changed ssize_t to long for portability + * 1.2 14 Aug 2012 - Clean up for z_const usage + */ + +/* + gzjoin takes one or more gzip files on the command line and writes out a + single gzip file that will uncompress to the concatenation of the + uncompressed data from the individual gzip files. gzjoin does this without + having to recompress any of the data and without having to calculate a new + crc32 for the concatenated uncompressed data. gzjoin does however have to + decompress all of the input data in order to find the bits in the compressed + data that need to be modified to concatenate the streams. + + gzjoin does not do an integrity check on the input gzip files other than + checking the gzip header and decompressing the compressed data. They are + otherwise assumed to be complete and correct. + + Each joint between gzip files removes at least 18 bytes of previous trailer + and subsequent header, and inserts an average of about three bytes to the + compressed data in order to connect the streams. The output gzip file + has a minimal ten-byte gzip header with no file name or modification time. + + This program was written to illustrate the use of the Z_BLOCK option of + inflate() and the crc32_combine() function. gzjoin will not compile with + versions of zlib earlier than 1.2.3. + */ + +#include /* fputs(), fprintf(), fwrite(), putc() */ +#include /* exit(), malloc(), free() */ +#include /* open() */ +#include /* close(), read(), lseek() */ +#include "zlib.h" + /* crc32(), crc32_combine(), inflateInit2(), inflate(), inflateEnd() */ + +#define local static + +/* exit with an error (return a value to allow use in an expression) */ +local int bail(char *why1, char *why2) +{ + fprintf(stderr, "gzjoin error: %s%s, output incomplete\n", why1, why2); + exit(1); + return 0; +} + +/* -- simple buffered file input with access to the buffer -- */ + +#define CHUNK 32768 /* must be a power of two and fit in unsigned */ + +/* bin buffered input file type */ +typedef struct { + char *name; /* name of file for error messages */ + int fd; /* file descriptor */ + unsigned left; /* bytes remaining at next */ + unsigned char *next; /* next byte to read */ + unsigned char *buf; /* allocated buffer of length CHUNK */ +} bin; + +/* close a buffered file and free allocated memory */ +local void bclose(bin *in) +{ + if (in != NULL) { + if (in->fd != -1) + close(in->fd); + if (in->buf != NULL) + free(in->buf); + free(in); + } +} + +/* open a buffered file for input, return a pointer to type bin, or NULL on + failure */ +local bin *bopen(char *name) +{ + bin *in; + + in = malloc(sizeof(bin)); + if (in == NULL) + return NULL; + in->buf = malloc(CHUNK); + in->fd = open(name, O_RDONLY, 0); + if (in->buf == NULL || in->fd == -1) { + bclose(in); + return NULL; + } + in->left = 0; + in->next = in->buf; + in->name = name; + return in; +} + +/* load buffer from file, return -1 on read error, 0 or 1 on success, with + 1 indicating that end-of-file was reached */ +local int bload(bin *in) +{ + long len; + + if (in == NULL) + return -1; + if (in->left != 0) + return 0; + in->next = in->buf; + do { + len = (long)read(in->fd, in->buf + in->left, CHUNK - in->left); + if (len < 0) + return -1; + in->left += (unsigned)len; + } while (len != 0 && in->left < CHUNK); + return len == 0 ? 1 : 0; +} + +/* get a byte from the file, bail if end of file */ +#define bget(in) (in->left ? 0 : bload(in), \ + in->left ? (in->left--, *(in->next)++) : \ + bail("unexpected end of file on ", in->name)) + +/* get a four-byte little-endian unsigned integer from file */ +local unsigned long bget4(bin *in) +{ + unsigned long val; + + val = bget(in); + val += (unsigned long)(bget(in)) << 8; + val += (unsigned long)(bget(in)) << 16; + val += (unsigned long)(bget(in)) << 24; + return val; +} + +/* skip bytes in file */ +local void bskip(bin *in, unsigned skip) +{ + /* check pointer */ + if (in == NULL) + return; + + /* easy case -- skip bytes in buffer */ + if (skip <= in->left) { + in->left -= skip; + in->next += skip; + return; + } + + /* skip what's in buffer, discard buffer contents */ + skip -= in->left; + in->left = 0; + + /* seek past multiples of CHUNK bytes */ + if (skip > CHUNK) { + unsigned left; + + left = skip & (CHUNK - 1); + if (left == 0) { + /* exact number of chunks: seek all the way minus one byte to check + for end-of-file with a read */ + lseek(in->fd, skip - 1, SEEK_CUR); + if (read(in->fd, in->buf, 1) != 1) + bail("unexpected end of file on ", in->name); + return; + } + + /* skip the integral chunks, update skip with remainder */ + lseek(in->fd, skip - left, SEEK_CUR); + skip = left; + } + + /* read more input and skip remainder */ + bload(in); + if (skip > in->left) + bail("unexpected end of file on ", in->name); + in->left -= skip; + in->next += skip; +} + +/* -- end of buffered input functions -- */ + +/* skip the gzip header from file in */ +local void gzhead(bin *in) +{ + int flags; + + /* verify gzip magic header and compression method */ + if (bget(in) != 0x1f || bget(in) != 0x8b || bget(in) != 8) + bail(in->name, " is not a valid gzip file"); + + /* get and verify flags */ + flags = bget(in); + if ((flags & 0xe0) != 0) + bail("unknown reserved bits set in ", in->name); + + /* skip modification time, extra flags, and os */ + bskip(in, 6); + + /* skip extra field if present */ + if (flags & 4) { + unsigned len; + + len = bget(in); + len += (unsigned)(bget(in)) << 8; + bskip(in, len); + } + + /* skip file name if present */ + if (flags & 8) + while (bget(in) != 0) + ; + + /* skip comment if present */ + if (flags & 16) + while (bget(in) != 0) + ; + + /* skip header crc if present */ + if (flags & 2) + bskip(in, 2); +} + +/* write a four-byte little-endian unsigned integer to out */ +local void put4(unsigned long val, FILE *out) +{ + putc(val & 0xff, out); + putc((val >> 8) & 0xff, out); + putc((val >> 16) & 0xff, out); + putc((val >> 24) & 0xff, out); +} + +/* Load up zlib stream from buffered input, bail if end of file */ +local void zpull(z_streamp strm, bin *in) +{ + if (in->left == 0) + bload(in); + if (in->left == 0) + bail("unexpected end of file on ", in->name); + strm->avail_in = in->left; + strm->next_in = in->next; +} + +/* Write header for gzip file to out and initialize trailer. */ +local void gzinit(unsigned long *crc, unsigned long *tot, FILE *out) +{ + fwrite("\x1f\x8b\x08\0\0\0\0\0\0\xff", 1, 10, out); + *crc = crc32(0L, Z_NULL, 0); + *tot = 0; +} + +/* Copy the compressed data from name, zeroing the last block bit of the last + block if clr is true, and adding empty blocks as needed to get to a byte + boundary. If clr is false, then the last block becomes the last block of + the output, and the gzip trailer is written. crc and tot maintains the + crc and length (modulo 2^32) of the output for the trailer. The resulting + gzip file is written to out. gzinit() must be called before the first call + of gzcopy() to write the gzip header and to initialize crc and tot. */ +local void gzcopy(char *name, int clr, unsigned long *crc, unsigned long *tot, + FILE *out) +{ + int ret; /* return value from zlib functions */ + int pos; /* where the "last block" bit is in byte */ + int last; /* true if processing the last block */ + bin *in; /* buffered input file */ + unsigned char *start; /* start of compressed data in buffer */ + unsigned char *junk; /* buffer for uncompressed data -- discarded */ + z_off_t len; /* length of uncompressed data (support > 4 GB) */ + z_stream strm; /* zlib inflate stream */ + + /* open gzip file and skip header */ + in = bopen(name); + if (in == NULL) + bail("could not open ", name); + gzhead(in); + + /* allocate buffer for uncompressed data and initialize raw inflate + stream */ + junk = malloc(CHUNK); + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, -15); + if (junk == NULL || ret != Z_OK) + bail("out of memory", ""); + + /* inflate and copy compressed data, clear last-block bit if requested */ + len = 0; + zpull(&strm, in); + start = in->next; + last = start[0] & 1; + if (last && clr) + start[0] &= ~1; + strm.avail_out = 0; + for (;;) { + /* if input used and output done, write used input and get more */ + if (strm.avail_in == 0 && strm.avail_out != 0) { + fwrite(start, 1, strm.next_in - start, out); + start = in->buf; + in->left = 0; + zpull(&strm, in); + } + + /* decompress -- return early when end-of-block reached */ + strm.avail_out = CHUNK; + strm.next_out = junk; + ret = inflate(&strm, Z_BLOCK); + switch (ret) { + case Z_MEM_ERROR: + bail("out of memory", ""); + case Z_DATA_ERROR: + bail("invalid compressed data in ", in->name); + } + + /* update length of uncompressed data */ + len += CHUNK - strm.avail_out; + + /* check for block boundary (only get this when block copied out) */ + if (strm.data_type & 128) { + /* if that was the last block, then done */ + if (last) + break; + + /* number of unused bits in last byte */ + pos = strm.data_type & 7; + + /* find the next last-block bit */ + if (pos != 0) { + /* next last-block bit is in last used byte */ + pos = 0x100 >> pos; + last = strm.next_in[-1] & pos; + if (last && clr) + in->buf[strm.next_in - in->buf - 1] &= ~pos; + } + else { + /* next last-block bit is in next unused byte */ + if (strm.avail_in == 0) { + /* don't have that byte yet -- get it */ + fwrite(start, 1, strm.next_in - start, out); + start = in->buf; + in->left = 0; + zpull(&strm, in); + } + last = strm.next_in[0] & 1; + if (last && clr) + in->buf[strm.next_in - in->buf] &= ~1; + } + } + } + + /* update buffer with unused input */ + in->left = strm.avail_in; + in->next = in->buf + (strm.next_in - in->buf); + + /* copy used input, write empty blocks to get to byte boundary */ + pos = strm.data_type & 7; + fwrite(start, 1, in->next - start - 1, out); + last = in->next[-1]; + if (pos == 0 || !clr) + /* already at byte boundary, or last file: write last byte */ + putc(last, out); + else { + /* append empty blocks to last byte */ + last &= ((0x100 >> pos) - 1); /* assure unused bits are zero */ + if (pos & 1) { + /* odd -- append an empty stored block */ + putc(last, out); + if (pos == 1) + putc(0, out); /* two more bits in block header */ + fwrite("\0\0\xff\xff", 1, 4, out); + } + else { + /* even -- append 1, 2, or 3 empty fixed blocks */ + switch (pos) { + case 6: + putc(last | 8, out); + last = 0; + case 4: + putc(last | 0x20, out); + last = 0; + case 2: + putc(last | 0x80, out); + putc(0, out); + } + } + } + + /* update crc and tot */ + *crc = crc32_combine(*crc, bget4(in), len); + *tot += (unsigned long)len; + + /* clean up */ + inflateEnd(&strm); + free(junk); + bclose(in); + + /* write trailer if this is the last gzip file */ + if (!clr) { + put4(*crc, out); + put4(*tot, out); + } +} + +/* join the gzip files on the command line, write result to stdout */ +int main(int argc, char **argv) +{ + unsigned long crc, tot; /* running crc and total uncompressed length */ + + /* skip command name */ + argc--; + argv++; + + /* show usage if no arguments */ + if (argc == 0) { + fputs("gzjoin usage: gzjoin f1.gz [f2.gz [f3.gz ...]] > fjoin.gz\n", + stderr); + return 0; + } + + /* join gzip files on command line and write to stdout */ + gzinit(&crc, &tot, stdout); + while (argc--) + gzcopy(*argv++, argc, &crc, &tot, stdout); + + /* done */ + return 0; +} diff --git a/externe_kniznice/zlib/examples/gzlog.c b/externe_kniznice/zlib/examples/gzlog.c new file mode 100644 index 0000000..b8c2927 --- /dev/null +++ b/externe_kniznice/zlib/examples/gzlog.c @@ -0,0 +1,1059 @@ +/* + * gzlog.c + * Copyright (C) 2004, 2008, 2012, 2016 Mark Adler, all rights reserved + * For conditions of distribution and use, see copyright notice in gzlog.h + * version 2.2, 14 Aug 2012 + */ + +/* + gzlog provides a mechanism for frequently appending short strings to a gzip + file that is efficient both in execution time and compression ratio. The + strategy is to write the short strings in an uncompressed form to the end of + the gzip file, only compressing when the amount of uncompressed data has + reached a given threshold. + + gzlog also provides protection against interruptions in the process due to + system crashes. The status of the operation is recorded in an extra field + in the gzip file, and is only updated once the gzip file is brought to a + valid state. The last data to be appended or compressed is saved in an + auxiliary file, so that if the operation is interrupted, it can be completed + the next time an append operation is attempted. + + gzlog maintains another auxiliary file with the last 32K of data from the + compressed portion, which is preloaded for the compression of the subsequent + data. This minimizes the impact to the compression ratio of appending. + */ + +/* + Operations Concept: + + Files (log name "foo"): + foo.gz -- gzip file with the complete log + foo.add -- last message to append or last data to compress + foo.dict -- dictionary of the last 32K of data for next compression + foo.temp -- temporary dictionary file for compression after this one + foo.lock -- lock file for reading and writing the other files + foo.repairs -- log file for log file recovery operations (not compressed) + + gzip file structure: + - fixed-length (no file name) header with extra field (see below) + - compressed data ending initially with empty stored block + - uncompressed data filling out originally empty stored block and + subsequent stored blocks as needed (16K max each) + - gzip trailer + - no junk at end (no other gzip streams) + + When appending data, the information in the first three items above plus the + foo.add file are sufficient to recover an interrupted append operation. The + extra field has the necessary information to restore the start of the last + stored block and determine where to append the data in the foo.add file, as + well as the crc and length of the gzip data before the append operation. + + The foo.add file is created before the gzip file is marked for append, and + deleted after the gzip file is marked as complete. So if the append + operation is interrupted, the data to add will still be there. If due to + some external force, the foo.add file gets deleted between when the append + operation was interrupted and when recovery is attempted, the gzip file will + still be restored, but without the appended data. + + When compressing data, the information in the first two items above plus the + foo.add file are sufficient to recover an interrupted compress operation. + The extra field has the necessary information to find the end of the + compressed data, and contains both the crc and length of just the compressed + data and of the complete set of data including the contents of the foo.add + file. + + Again, the foo.add file is maintained during the compress operation in case + of an interruption. If in the unlikely event the foo.add file with the data + to be compressed is missing due to some external force, a gzip file with + just the previous compressed data will be reconstructed. In this case, all + of the data that was to be compressed is lost (approximately one megabyte). + This will not occur if all that happened was an interruption of the compress + operation. + + The third state that is marked is the replacement of the old dictionary with + the new dictionary after a compress operation. Once compression is + complete, the gzip file is marked as being in the replace state. This + completes the gzip file, so an interrupt after being so marked does not + result in recompression. Then the dictionary file is replaced, and the gzip + file is marked as completed. This state prevents the possibility of + restarting compression with the wrong dictionary file. + + All three operations are wrapped by a lock/unlock procedure. In order to + gain exclusive access to the log files, first a foo.lock file must be + exclusively created. When all operations are complete, the lock is + released by deleting the foo.lock file. If when attempting to create the + lock file, it already exists and the modify time of the lock file is more + than five minutes old (set by the PATIENCE define below), then the old + lock file is considered stale and deleted, and the exclusive creation of + the lock file is retried. To assure that there are no false assessments + of the staleness of the lock file, the operations periodically touch the + lock file to update the modified date. + + Following is the definition of the extra field with all of the information + required to enable the above append and compress operations and their + recovery if interrupted. Multi-byte values are stored little endian + (consistent with the gzip format). File pointers are eight bytes long. + The crc's and lengths for the gzip trailer are four bytes long. (Note that + the length at the end of a gzip file is used for error checking only, and + for large files is actually the length modulo 2^32.) The stored block + length is two bytes long. The gzip extra field two-byte identification is + "ap" for append. It is assumed that writing the extra field to the file is + an "atomic" operation. That is, either all of the extra field is written + to the file, or none of it is, if the operation is interrupted right at the + point of updating the extra field. This is a reasonable assumption, since + the extra field is within the first 52 bytes of the file, which is smaller + than any expected block size for a mass storage device (usually 512 bytes or + larger). + + Extra field (35 bytes): + - Pointer to first stored block length -- this points to the two-byte length + of the first stored block, which is followed by the two-byte, one's + complement of that length. The stored block length is preceded by the + three-bit header of the stored block, which is the actual start of the + stored block in the deflate format. See the bit offset field below. + - Pointer to the last stored block length. This is the same as above, but + for the last stored block of the uncompressed data in the gzip file. + Initially this is the same as the first stored block length pointer. + When the stored block gets to 16K (see the MAX_STORE define), then a new + stored block as added, at which point the last stored block length pointer + is different from the first stored block length pointer. When they are + different, the first bit of the last stored block header is eight bits, or + one byte back from the block length. + - Compressed data crc and length. This is the crc and length of the data + that is in the compressed portion of the deflate stream. These are used + only in the event that the foo.add file containing the data to compress is + lost after a compress operation is interrupted. + - Total data crc and length. This is the crc and length of all of the data + stored in the gzip file, compressed and uncompressed. It is used to + reconstruct the gzip trailer when compressing, as well as when recovering + interrupted operations. + - Final stored block length. This is used to quickly find where to append, + and allows the restoration of the original final stored block state when + an append operation is interrupted. + - First stored block start as the number of bits back from the final stored + block first length byte. This value is in the range of 3..10, and is + stored as the low three bits of the final byte of the extra field after + subtracting three (0..7). This allows the last-block bit of the stored + block header to be updated when a new stored block is added, for the case + when the first stored block and the last stored block are the same. (When + they are different, the numbers of bits back is known to be eight.) This + also allows for new compressed data to be appended to the old compressed + data in the compress operation, overwriting the previous first stored + block, or for the compressed data to be terminated and a valid gzip file + reconstructed on the off chance that a compression operation was + interrupted and the data to compress in the foo.add file was deleted. + - The operation in process. This is the next two bits in the last byte (the + bits under the mask 0x18). The are interpreted as 0: nothing in process, + 1: append in process, 2: compress in process, 3: replace in process. + - The top three bits of the last byte in the extra field are reserved and + are currently set to zero. + + Main procedure: + - Exclusively create the foo.lock file using the O_CREAT and O_EXCL modes of + the system open() call. If the modify time of an existing lock file is + more than PATIENCE seconds old, then the lock file is deleted and the + exclusive create is retried. + - Load the extra field from the foo.gz file, and see if an operation was in + progress but not completed. If so, apply the recovery procedure below. + - Perform the append procedure with the provided data. + - If the uncompressed data in the foo.gz file is 1MB or more, apply the + compress procedure. + - Delete the foo.lock file. + + Append procedure: + - Put what to append in the foo.add file so that the operation can be + restarted if this procedure is interrupted. + - Mark the foo.gz extra field with the append operation in progress. + + Restore the original last-block bit and stored block length of the last + stored block from the information in the extra field, in case a previous + append operation was interrupted. + - Append the provided data to the last stored block, creating new stored + blocks as needed and updating the stored blocks last-block bits and + lengths. + - Update the crc and length with the new data, and write the gzip trailer. + - Write over the extra field (with a single write operation) with the new + pointers, lengths, and crc's, and mark the gzip file as not in process. + Though there is still a foo.add file, it will be ignored since nothing + is in process. If a foo.add file is leftover from a previously + completed operation, it is truncated when writing new data to it. + - Delete the foo.add file. + + Compress and replace procedures: + - Read all of the uncompressed data in the stored blocks in foo.gz and write + it to foo.add. Also write foo.temp with the last 32K of that data to + provide a dictionary for the next invocation of this procedure. + - Rewrite the extra field marking foo.gz with a compression in process. + * If there is no data provided to compress (due to a missing foo.add file + when recovering), reconstruct and truncate the foo.gz file to contain + only the previous compressed data and proceed to the step after the next + one. Otherwise ... + - Compress the data with the dictionary in foo.dict, and write to the + foo.gz file starting at the bit immediately following the last previously + compressed block. If there is no foo.dict, proceed anyway with the + compression at slightly reduced efficiency. (For the foo.dict file to be + missing requires some external failure beyond simply the interruption of + a compress operation.) During this process, the foo.lock file is + periodically touched to assure that that file is not considered stale by + another process before we're done. The deflation is terminated with a + non-last empty static block (10 bits long), that is then located and + written over by a last-bit-set empty stored block. + - Append the crc and length of the data in the gzip file (previously + calculated during the append operations). + - Write over the extra field with the updated stored block offsets, bits + back, crc's, and lengths, and mark foo.gz as in process for a replacement + of the dictionary. + @ Delete the foo.add file. + - Replace foo.dict with foo.temp. + - Write over the extra field, marking foo.gz as complete. + + Recovery procedure: + - If not a replace recovery, read in the foo.add file, and provide that data + to the appropriate recovery below. If there is no foo.add file, provide + a zero data length to the recovery. In that case, the append recovery + restores the foo.gz to the previous compressed + uncompressed data state. + For the the compress recovery, a missing foo.add file results in foo.gz + being restored to the previous compressed-only data state. + - Append recovery: + - Pick up append at + step above + - Compress recovery: + - Pick up compress at * step above + - Replace recovery: + - Pick up compress at @ step above + - Log the repair with a date stamp in foo.repairs + */ + +#include +#include /* rename, fopen, fprintf, fclose */ +#include /* malloc, free */ +#include /* strlen, strrchr, strcpy, strncpy, strcmp */ +#include /* open */ +#include /* lseek, read, write, close, unlink, sleep, */ + /* ftruncate, fsync */ +#include /* errno */ +#include /* time, ctime */ +#include /* stat */ +#include /* utimes */ +#include "zlib.h" /* crc32 */ + +#include "gzlog.h" /* header for external access */ + +#define local static +typedef unsigned int uint; +typedef unsigned long ulong; + +/* Macro for debugging to deterministically force recovery operations */ +#ifdef GZLOG_DEBUG + #include /* longjmp */ + jmp_buf gzlog_jump; /* where to go back to */ + int gzlog_bail = 0; /* which point to bail at (1..8) */ + int gzlog_count = -1; /* number of times through to wait */ +# define BAIL(n) do { if (n == gzlog_bail && gzlog_count-- == 0) \ + longjmp(gzlog_jump, gzlog_bail); } while (0) +#else +# define BAIL(n) +#endif + +/* how old the lock file can be in seconds before considering it stale */ +#define PATIENCE 300 + +/* maximum stored block size in Kbytes -- must be in 1..63 */ +#define MAX_STORE 16 + +/* number of stored Kbytes to trigger compression (must be >= 32 to allow + dictionary construction, and <= 204 * MAX_STORE, in order for >> 10 to + discard the stored block headers contribution of five bytes each) */ +#define TRIGGER 1024 + +/* size of a deflate dictionary (this cannot be changed) */ +#define DICT 32768U + +/* values for the operation (2 bits) */ +#define NO_OP 0 +#define APPEND_OP 1 +#define COMPRESS_OP 2 +#define REPLACE_OP 3 + +/* macros to extract little-endian integers from an unsigned byte buffer */ +#define PULL2(p) ((p)[0]+((uint)((p)[1])<<8)) +#define PULL4(p) (PULL2(p)+((ulong)PULL2(p+2)<<16)) +#define PULL8(p) (PULL4(p)+((off_t)PULL4(p+4)<<32)) + +/* macros to store integers into a byte buffer in little-endian order */ +#define PUT2(p,a) do {(p)[0]=a;(p)[1]=(a)>>8;} while(0) +#define PUT4(p,a) do {PUT2(p,a);PUT2(p+2,a>>16);} while(0) +#define PUT8(p,a) do {PUT4(p,a);PUT4(p+4,a>>32);} while(0) + +/* internal structure for log information */ +#define LOGID "\106\035\172" /* should be three non-zero characters */ +struct log { + char id[4]; /* contains LOGID to detect inadvertent overwrites */ + int fd; /* file descriptor for .gz file, opened read/write */ + char *path; /* allocated path, e.g. "/var/log/foo" or "foo" */ + char *end; /* end of path, for appending suffices such as ".gz" */ + off_t first; /* offset of first stored block first length byte */ + int back; /* location of first block id in bits back from first */ + uint stored; /* bytes currently in last stored block */ + off_t last; /* offset of last stored block first length byte */ + ulong ccrc; /* crc of compressed data */ + ulong clen; /* length (modulo 2^32) of compressed data */ + ulong tcrc; /* crc of total data */ + ulong tlen; /* length (modulo 2^32) of total data */ + time_t lock; /* last modify time of our lock file */ +}; + +/* gzip header for gzlog */ +local unsigned char log_gzhead[] = { + 0x1f, 0x8b, /* magic gzip id */ + 8, /* compression method is deflate */ + 4, /* there is an extra field (no file name) */ + 0, 0, 0, 0, /* no modification time provided */ + 0, 0xff, /* no extra flags, no OS specified */ + 39, 0, 'a', 'p', 35, 0 /* extra field with "ap" subfield */ + /* 35 is EXTRA, 39 is EXTRA + 4 */ +}; + +#define HEAD sizeof(log_gzhead) /* should be 16 */ + +/* initial gzip extra field content (52 == HEAD + EXTRA + 1) */ +local unsigned char log_gzext[] = { + 52, 0, 0, 0, 0, 0, 0, 0, /* offset of first stored block length */ + 52, 0, 0, 0, 0, 0, 0, 0, /* offset of last stored block length */ + 0, 0, 0, 0, 0, 0, 0, 0, /* compressed data crc and length */ + 0, 0, 0, 0, 0, 0, 0, 0, /* total data crc and length */ + 0, 0, /* final stored block data length */ + 5 /* op is NO_OP, last bit 8 bits back */ +}; + +#define EXTRA sizeof(log_gzext) /* should be 35 */ + +/* initial gzip data and trailer */ +local unsigned char log_gzbody[] = { + 1, 0, 0, 0xff, 0xff, /* empty stored block (last) */ + 0, 0, 0, 0, /* crc */ + 0, 0, 0, 0 /* uncompressed length */ +}; + +#define BODY sizeof(log_gzbody) + +/* Exclusively create foo.lock in order to negotiate exclusive access to the + foo.* files. If the modify time of an existing lock file is greater than + PATIENCE seconds in the past, then consider the lock file to have been + abandoned, delete it, and try the exclusive create again. Save the lock + file modify time for verification of ownership. Return 0 on success, or -1 + on failure, usually due to an access restriction or invalid path. Note that + if stat() or unlink() fails, it may be due to another process noticing the + abandoned lock file a smidge sooner and deleting it, so those are not + flagged as an error. */ +local int log_lock(struct log *log) +{ + int fd; + struct stat st; + + strcpy(log->end, ".lock"); + while ((fd = open(log->path, O_CREAT | O_EXCL, 0644)) < 0) { + if (errno != EEXIST) + return -1; + if (stat(log->path, &st) == 0 && time(NULL) - st.st_mtime > PATIENCE) { + unlink(log->path); + continue; + } + sleep(2); /* relinquish the CPU for two seconds while waiting */ + } + close(fd); + if (stat(log->path, &st) == 0) + log->lock = st.st_mtime; + return 0; +} + +/* Update the modify time of the lock file to now, in order to prevent another + task from thinking that the lock is stale. Save the lock file modify time + for verification of ownership. */ +local void log_touch(struct log *log) +{ + struct stat st; + + strcpy(log->end, ".lock"); + utimes(log->path, NULL); + if (stat(log->path, &st) == 0) + log->lock = st.st_mtime; +} + +/* Check the log file modify time against what is expected. Return true if + this is not our lock. If it is our lock, touch it to keep it. */ +local int log_check(struct log *log) +{ + struct stat st; + + strcpy(log->end, ".lock"); + if (stat(log->path, &st) || st.st_mtime != log->lock) + return 1; + log_touch(log); + return 0; +} + +/* Unlock a previously acquired lock, but only if it's ours. */ +local void log_unlock(struct log *log) +{ + if (log_check(log)) + return; + strcpy(log->end, ".lock"); + unlink(log->path); + log->lock = 0; +} + +/* Check the gzip header and read in the extra field, filling in the values in + the log structure. Return op on success or -1 if the gzip header was not as + expected. op is the current operation in progress last written to the extra + field. This assumes that the gzip file has already been opened, with the + file descriptor log->fd. */ +local int log_head(struct log *log) +{ + int op; + unsigned char buf[HEAD + EXTRA]; + + if (lseek(log->fd, 0, SEEK_SET) < 0 || + read(log->fd, buf, HEAD + EXTRA) != HEAD + EXTRA || + memcmp(buf, log_gzhead, HEAD)) { + return -1; + } + log->first = PULL8(buf + HEAD); + log->last = PULL8(buf + HEAD + 8); + log->ccrc = PULL4(buf + HEAD + 16); + log->clen = PULL4(buf + HEAD + 20); + log->tcrc = PULL4(buf + HEAD + 24); + log->tlen = PULL4(buf + HEAD + 28); + log->stored = PULL2(buf + HEAD + 32); + log->back = 3 + (buf[HEAD + 34] & 7); + op = (buf[HEAD + 34] >> 3) & 3; + return op; +} + +/* Write over the extra field contents, marking the operation as op. Use fsync + to assure that the device is written to, and in the requested order. This + operation, and only this operation, is assumed to be atomic in order to + assure that the log is recoverable in the event of an interruption at any + point in the process. Return -1 if the write to foo.gz failed. */ +local int log_mark(struct log *log, int op) +{ + int ret; + unsigned char ext[EXTRA]; + + PUT8(ext, log->first); + PUT8(ext + 8, log->last); + PUT4(ext + 16, log->ccrc); + PUT4(ext + 20, log->clen); + PUT4(ext + 24, log->tcrc); + PUT4(ext + 28, log->tlen); + PUT2(ext + 32, log->stored); + ext[34] = log->back - 3 + (op << 3); + fsync(log->fd); + ret = lseek(log->fd, HEAD, SEEK_SET) < 0 || + write(log->fd, ext, EXTRA) != EXTRA ? -1 : 0; + fsync(log->fd); + return ret; +} + +/* Rewrite the last block header bits and subsequent zero bits to get to a byte + boundary, setting the last block bit if last is true, and then write the + remainder of the stored block header (length and one's complement). Leave + the file pointer after the end of the last stored block data. Return -1 if + there is a read or write failure on the foo.gz file */ +local int log_last(struct log *log, int last) +{ + int back, len, mask; + unsigned char buf[6]; + + /* determine the locations of the bytes and bits to modify */ + back = log->last == log->first ? log->back : 8; + len = back > 8 ? 2 : 1; /* bytes back from log->last */ + mask = 0x80 >> ((back - 1) & 7); /* mask for block last-bit */ + + /* get the byte to modify (one or two back) into buf[0] -- don't need to + read the byte if the last-bit is eight bits back, since in that case + the entire byte will be modified */ + buf[0] = 0; + if (back != 8 && (lseek(log->fd, log->last - len, SEEK_SET) < 0 || + read(log->fd, buf, 1) != 1)) + return -1; + + /* change the last-bit of the last stored block as requested -- note + that all bits above the last-bit are set to zero, per the type bits + of a stored block being 00 and per the convention that the bits to + bring the stream to a byte boundary are also zeros */ + buf[1] = 0; + buf[2 - len] = (*buf & (mask - 1)) + (last ? mask : 0); + + /* write the modified stored block header and lengths, move the file + pointer to after the last stored block data */ + PUT2(buf + 2, log->stored); + PUT2(buf + 4, log->stored ^ 0xffff); + return lseek(log->fd, log->last - len, SEEK_SET) < 0 || + write(log->fd, buf + 2 - len, len + 4) != len + 4 || + lseek(log->fd, log->stored, SEEK_CUR) < 0 ? -1 : 0; +} + +/* Append len bytes from data to the locked and open log file. len may be zero + if recovering and no .add file was found. In that case, the previous state + of the foo.gz file is restored. The data is appended uncompressed in + deflate stored blocks. Return -1 if there was an error reading or writing + the foo.gz file. */ +local int log_append(struct log *log, unsigned char *data, size_t len) +{ + uint put; + off_t end; + unsigned char buf[8]; + + /* set the last block last-bit and length, in case recovering an + interrupted append, then position the file pointer to append to the + block */ + if (log_last(log, 1)) + return -1; + + /* append, adding stored blocks and updating the offset of the last stored + block as needed, and update the total crc and length */ + while (len) { + /* append as much as we can to the last block */ + put = (MAX_STORE << 10) - log->stored; + if (put > len) + put = (uint)len; + if (put) { + if (write(log->fd, data, put) != put) + return -1; + BAIL(1); + log->tcrc = crc32(log->tcrc, data, put); + log->tlen += put; + log->stored += put; + data += put; + len -= put; + } + + /* if we need to, add a new empty stored block */ + if (len) { + /* mark current block as not last */ + if (log_last(log, 0)) + return -1; + + /* point to new, empty stored block */ + log->last += 4 + log->stored + 1; + log->stored = 0; + } + + /* mark last block as last, update its length */ + if (log_last(log, 1)) + return -1; + BAIL(2); + } + + /* write the new crc and length trailer, and truncate just in case (could + be recovering from partial append with a missing foo.add file) */ + PUT4(buf, log->tcrc); + PUT4(buf + 4, log->tlen); + if (write(log->fd, buf, 8) != 8 || + (end = lseek(log->fd, 0, SEEK_CUR)) < 0 || ftruncate(log->fd, end)) + return -1; + + /* write the extra field, marking the log file as done, delete .add file */ + if (log_mark(log, NO_OP)) + return -1; + strcpy(log->end, ".add"); + unlink(log->path); /* ignore error, since may not exist */ + return 0; +} + +/* Replace the foo.dict file with the foo.temp file. Also delete the foo.add + file, since the compress operation may have been interrupted before that was + done. Returns 1 if memory could not be allocated, or -1 if reading or + writing foo.gz fails, or if the rename fails for some reason other than + foo.temp not existing. foo.temp not existing is a permitted error, since + the replace operation may have been interrupted after the rename is done, + but before foo.gz is marked as complete. */ +local int log_replace(struct log *log) +{ + int ret; + char *dest; + + /* delete foo.add file */ + strcpy(log->end, ".add"); + unlink(log->path); /* ignore error, since may not exist */ + BAIL(3); + + /* rename foo.name to foo.dict, replacing foo.dict if it exists */ + strcpy(log->end, ".dict"); + dest = malloc(strlen(log->path) + 1); + if (dest == NULL) + return -2; + strcpy(dest, log->path); + strcpy(log->end, ".temp"); + ret = rename(log->path, dest); + free(dest); + if (ret && errno != ENOENT) + return -1; + BAIL(4); + + /* mark the foo.gz file as done */ + return log_mark(log, NO_OP); +} + +/* Compress the len bytes at data and append the compressed data to the + foo.gz deflate data immediately after the previous compressed data. This + overwrites the previous uncompressed data, which was stored in foo.add + and is the data provided in data[0..len-1]. If this operation is + interrupted, it picks up at the start of this routine, with the foo.add + file read in again. If there is no data to compress (len == 0), then we + simply terminate the foo.gz file after the previously compressed data, + appending a final empty stored block and the gzip trailer. Return -1 if + reading or writing the log.gz file failed, or -2 if there was a memory + allocation failure. */ +local int log_compress(struct log *log, unsigned char *data, size_t len) +{ + int fd; + uint got, max; + ssize_t dict; + off_t end; + z_stream strm; + unsigned char buf[DICT]; + + /* compress and append compressed data */ + if (len) { + /* set up for deflate, allocating memory */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + if (deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, -15, 8, + Z_DEFAULT_STRATEGY) != Z_OK) + return -2; + + /* read in dictionary (last 32K of data that was compressed) */ + strcpy(log->end, ".dict"); + fd = open(log->path, O_RDONLY, 0); + if (fd >= 0) { + dict = read(fd, buf, DICT); + close(fd); + if (dict < 0) { + deflateEnd(&strm); + return -1; + } + if (dict) + deflateSetDictionary(&strm, buf, (uint)dict); + } + log_touch(log); + + /* prime deflate with last bits of previous block, position write + pointer to write those bits and overwrite what follows */ + if (lseek(log->fd, log->first - (log->back > 8 ? 2 : 1), + SEEK_SET) < 0 || + read(log->fd, buf, 1) != 1 || lseek(log->fd, -1, SEEK_CUR) < 0) { + deflateEnd(&strm); + return -1; + } + deflatePrime(&strm, (8 - log->back) & 7, *buf); + + /* compress, finishing with a partial non-last empty static block */ + strm.next_in = data; + max = (((uint)0 - 1) >> 1) + 1; /* in case int smaller than size_t */ + do { + strm.avail_in = len > max ? max : (uint)len; + len -= strm.avail_in; + do { + strm.avail_out = DICT; + strm.next_out = buf; + deflate(&strm, len ? Z_NO_FLUSH : Z_PARTIAL_FLUSH); + got = DICT - strm.avail_out; + if (got && write(log->fd, buf, got) != got) { + deflateEnd(&strm); + return -1; + } + log_touch(log); + } while (strm.avail_out == 0); + } while (len); + deflateEnd(&strm); + BAIL(5); + + /* find start of empty static block -- scanning backwards the first one + bit is the second bit of the block, if the last byte is zero, then + we know the byte before that has a one in the top bit, since an + empty static block is ten bits long */ + if ((log->first = lseek(log->fd, -1, SEEK_CUR)) < 0 || + read(log->fd, buf, 1) != 1) + return -1; + log->first++; + if (*buf) { + log->back = 1; + while ((*buf & ((uint)1 << (8 - log->back++))) == 0) + ; /* guaranteed to terminate, since *buf != 0 */ + } + else + log->back = 10; + + /* update compressed crc and length */ + log->ccrc = log->tcrc; + log->clen = log->tlen; + } + else { + /* no data to compress -- fix up existing gzip stream */ + log->tcrc = log->ccrc; + log->tlen = log->clen; + } + + /* complete and truncate gzip stream */ + log->last = log->first; + log->stored = 0; + PUT4(buf, log->tcrc); + PUT4(buf + 4, log->tlen); + if (log_last(log, 1) || write(log->fd, buf, 8) != 8 || + (end = lseek(log->fd, 0, SEEK_CUR)) < 0 || ftruncate(log->fd, end)) + return -1; + BAIL(6); + + /* mark as being in the replace operation */ + if (log_mark(log, REPLACE_OP)) + return -1; + + /* execute the replace operation and mark the file as done */ + return log_replace(log); +} + +/* log a repair record to the .repairs file */ +local void log_log(struct log *log, int op, char *record) +{ + time_t now; + FILE *rec; + + now = time(NULL); + strcpy(log->end, ".repairs"); + rec = fopen(log->path, "a"); + if (rec == NULL) + return; + fprintf(rec, "%.24s %s recovery: %s\n", ctime(&now), op == APPEND_OP ? + "append" : (op == COMPRESS_OP ? "compress" : "replace"), record); + fclose(rec); + return; +} + +/* Recover the interrupted operation op. First read foo.add for recovering an + append or compress operation. Return -1 if there was an error reading or + writing foo.gz or reading an existing foo.add, or -2 if there was a memory + allocation failure. */ +local int log_recover(struct log *log, int op) +{ + int fd, ret = 0; + unsigned char *data = NULL; + size_t len = 0; + struct stat st; + + /* log recovery */ + log_log(log, op, "start"); + + /* load foo.add file if expected and present */ + if (op == APPEND_OP || op == COMPRESS_OP) { + strcpy(log->end, ".add"); + if (stat(log->path, &st) == 0 && st.st_size) { + len = (size_t)(st.st_size); + if ((off_t)len != st.st_size || + (data = malloc(st.st_size)) == NULL) { + log_log(log, op, "allocation failure"); + return -2; + } + if ((fd = open(log->path, O_RDONLY, 0)) < 0) { + log_log(log, op, ".add file read failure"); + return -1; + } + ret = (size_t)read(fd, data, len) != len; + close(fd); + if (ret) { + log_log(log, op, ".add file read failure"); + return -1; + } + log_log(log, op, "loaded .add file"); + } + else + log_log(log, op, "missing .add file!"); + } + + /* recover the interrupted operation */ + switch (op) { + case APPEND_OP: + ret = log_append(log, data, len); + break; + case COMPRESS_OP: + ret = log_compress(log, data, len); + break; + case REPLACE_OP: + ret = log_replace(log); + } + + /* log status */ + log_log(log, op, ret ? "failure" : "complete"); + + /* clean up */ + if (data != NULL) + free(data); + return ret; +} + +/* Close the foo.gz file (if open) and release the lock. */ +local void log_close(struct log *log) +{ + if (log->fd >= 0) + close(log->fd); + log->fd = -1; + log_unlock(log); +} + +/* Open foo.gz, verify the header, and load the extra field contents, after + first creating the foo.lock file to gain exclusive access to the foo.* + files. If foo.gz does not exist or is empty, then write the initial header, + extra, and body content of an empty foo.gz log file. If there is an error + creating the lock file due to access restrictions, or an error reading or + writing the foo.gz file, or if the foo.gz file is not a proper log file for + this object (e.g. not a gzip file or does not contain the expected extra + field), then return true. If there is an error, the lock is released. + Otherwise, the lock is left in place. */ +local int log_open(struct log *log) +{ + int op; + + /* release open file resource if left over -- can occur if lock lost + between gzlog_open() and gzlog_write() */ + if (log->fd >= 0) + close(log->fd); + log->fd = -1; + + /* negotiate exclusive access */ + if (log_lock(log) < 0) + return -1; + + /* open the log file, foo.gz */ + strcpy(log->end, ".gz"); + log->fd = open(log->path, O_RDWR | O_CREAT, 0644); + if (log->fd < 0) { + log_close(log); + return -1; + } + + /* if new, initialize foo.gz with an empty log, delete old dictionary */ + if (lseek(log->fd, 0, SEEK_END) == 0) { + if (write(log->fd, log_gzhead, HEAD) != HEAD || + write(log->fd, log_gzext, EXTRA) != EXTRA || + write(log->fd, log_gzbody, BODY) != BODY) { + log_close(log); + return -1; + } + strcpy(log->end, ".dict"); + unlink(log->path); + } + + /* verify log file and load extra field information */ + if ((op = log_head(log)) < 0) { + log_close(log); + return -1; + } + + /* check for interrupted process and if so, recover */ + if (op != NO_OP && log_recover(log, op)) { + log_close(log); + return -1; + } + + /* touch the lock file to prevent another process from grabbing it */ + log_touch(log); + return 0; +} + +/* See gzlog.h for the description of the external methods below */ +gzlog *gzlog_open(char *path) +{ + size_t n; + struct log *log; + + /* check arguments */ + if (path == NULL || *path == 0) + return NULL; + + /* allocate and initialize log structure */ + log = malloc(sizeof(struct log)); + if (log == NULL) + return NULL; + strcpy(log->id, LOGID); + log->fd = -1; + + /* save path and end of path for name construction */ + n = strlen(path); + log->path = malloc(n + 9); /* allow for ".repairs" */ + if (log->path == NULL) { + free(log); + return NULL; + } + strcpy(log->path, path); + log->end = log->path + n; + + /* gain exclusive access and verify log file -- may perform a + recovery operation if needed */ + if (log_open(log)) { + free(log->path); + free(log); + return NULL; + } + + /* return pointer to log structure */ + return log; +} + +/* gzlog_compress() return values: + 0: all good + -1: file i/o error (usually access issue) + -2: memory allocation failure + -3: invalid log pointer argument */ +int gzlog_compress(gzlog *logd) +{ + int fd, ret; + uint block; + size_t len, next; + unsigned char *data, buf[5]; + struct log *log = logd; + + /* check arguments */ + if (log == NULL || strcmp(log->id, LOGID)) + return -3; + + /* see if we lost the lock -- if so get it again and reload the extra + field information (it probably changed), recover last operation if + necessary */ + if (log_check(log) && log_open(log)) + return -1; + + /* create space for uncompressed data */ + len = ((size_t)(log->last - log->first) & ~(((size_t)1 << 10) - 1)) + + log->stored; + if ((data = malloc(len)) == NULL) + return -2; + + /* do statement here is just a cheap trick for error handling */ + do { + /* read in the uncompressed data */ + if (lseek(log->fd, log->first - 1, SEEK_SET) < 0) + break; + next = 0; + while (next < len) { + if (read(log->fd, buf, 5) != 5) + break; + block = PULL2(buf + 1); + if (next + block > len || + read(log->fd, (char *)data + next, block) != block) + break; + next += block; + } + if (lseek(log->fd, 0, SEEK_CUR) != log->last + 4 + log->stored) + break; + log_touch(log); + + /* write the uncompressed data to the .add file */ + strcpy(log->end, ".add"); + fd = open(log->path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd < 0) + break; + ret = (size_t)write(fd, data, len) != len; + if (ret | close(fd)) + break; + log_touch(log); + + /* write the dictionary for the next compress to the .temp file */ + strcpy(log->end, ".temp"); + fd = open(log->path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd < 0) + break; + next = DICT > len ? len : DICT; + ret = (size_t)write(fd, (char *)data + len - next, next) != next; + if (ret | close(fd)) + break; + log_touch(log); + + /* roll back to compressed data, mark the compress in progress */ + log->last = log->first; + log->stored = 0; + if (log_mark(log, COMPRESS_OP)) + break; + BAIL(7); + + /* compress and append the data (clears mark) */ + ret = log_compress(log, data, len); + free(data); + return ret; + } while (0); + + /* broke out of do above on i/o error */ + free(data); + return -1; +} + +/* gzlog_write() return values: + 0: all good + -1: file i/o error (usually access issue) + -2: memory allocation failure + -3: invalid log pointer argument */ +int gzlog_write(gzlog *logd, void *data, size_t len) +{ + int fd, ret; + struct log *log = logd; + + /* check arguments */ + if (log == NULL || strcmp(log->id, LOGID)) + return -3; + if (data == NULL || len <= 0) + return 0; + + /* see if we lost the lock -- if so get it again and reload the extra + field information (it probably changed), recover last operation if + necessary */ + if (log_check(log) && log_open(log)) + return -1; + + /* create and write .add file */ + strcpy(log->end, ".add"); + fd = open(log->path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd < 0) + return -1; + ret = (size_t)write(fd, data, len) != len; + if (ret | close(fd)) + return -1; + log_touch(log); + + /* mark log file with append in progress */ + if (log_mark(log, APPEND_OP)) + return -1; + BAIL(8); + + /* append data (clears mark) */ + if (log_append(log, data, len)) + return -1; + + /* check to see if it's time to compress -- if not, then done */ + if (((log->last - log->first) >> 10) + (log->stored >> 10) < TRIGGER) + return 0; + + /* time to compress */ + return gzlog_compress(log); +} + +/* gzlog_close() return values: + 0: ok + -3: invalid log pointer argument */ +int gzlog_close(gzlog *logd) +{ + struct log *log = logd; + + /* check arguments */ + if (log == NULL || strcmp(log->id, LOGID)) + return -3; + + /* close the log file and release the lock */ + log_close(log); + + /* free structure and return */ + if (log->path != NULL) + free(log->path); + strcpy(log->id, "bad"); + free(log); + return 0; +} diff --git a/externe_kniznice/zlib/examples/gzlog.h b/externe_kniznice/zlib/examples/gzlog.h new file mode 100644 index 0000000..86f0cec --- /dev/null +++ b/externe_kniznice/zlib/examples/gzlog.h @@ -0,0 +1,91 @@ +/* gzlog.h + Copyright (C) 2004, 2008, 2012 Mark Adler, all rights reserved + version 2.2, 14 Aug 2012 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + +/* Version History: + 1.0 26 Nov 2004 First version + 2.0 25 Apr 2008 Complete redesign for recovery of interrupted operations + Interface changed slightly in that now path is a prefix + Compression now occurs as needed during gzlog_write() + gzlog_write() now always leaves the log file as valid gzip + 2.1 8 Jul 2012 Fix argument checks in gzlog_compress() and gzlog_write() + 2.2 14 Aug 2012 Clean up signed comparisons + */ + +/* + The gzlog object allows writing short messages to a gzipped log file, + opening the log file locked for small bursts, and then closing it. The log + object works by appending stored (uncompressed) data to the gzip file until + 1 MB has been accumulated. At that time, the stored data is compressed, and + replaces the uncompressed data in the file. The log file is truncated to + its new size at that time. After each write operation, the log file is a + valid gzip file that can decompressed to recover what was written. + + The gzlog operations can be interupted at any point due to an application or + system crash, and the log file will be recovered the next time the log is + opened with gzlog_open(). + */ + +#ifndef GZLOG_H +#define GZLOG_H + +/* gzlog object type */ +typedef void gzlog; + +/* Open a gzlog object, creating the log file if it does not exist. Return + NULL on error. Note that gzlog_open() could take a while to complete if it + has to wait to verify that a lock is stale (possibly for five minutes), or + if there is significant contention with other instantiations of this object + when locking the resource. path is the prefix of the file names created by + this object. If path is "foo", then the log file will be "foo.gz", and + other auxiliary files will be created and destroyed during the process: + "foo.dict" for a compression dictionary, "foo.temp" for a temporary (next) + dictionary, "foo.add" for data being added or compressed, "foo.lock" for the + lock file, and "foo.repairs" to log recovery operations performed due to + interrupted gzlog operations. A gzlog_open() followed by a gzlog_close() + will recover a previously interrupted operation, if any. */ +gzlog *gzlog_open(char *path); + +/* Write to a gzlog object. Return zero on success, -1 if there is a file i/o + error on any of the gzlog files (this should not happen if gzlog_open() + succeeded, unless the device has run out of space or leftover auxiliary + files have permissions or ownership that prevent their use), -2 if there is + a memory allocation failure, or -3 if the log argument is invalid (e.g. if + it was not created by gzlog_open()). This function will write data to the + file uncompressed, until 1 MB has been accumulated, at which time that data + will be compressed. The log file will be a valid gzip file upon successful + return. */ +int gzlog_write(gzlog *log, void *data, size_t len); + +/* Force compression of any uncompressed data in the log. This should be used + sparingly, if at all. The main application would be when a log file will + not be appended to again. If this is used to compress frequently while + appending, it will both significantly increase the execution time and + reduce the compression ratio. The return codes are the same as for + gzlog_write(). */ +int gzlog_compress(gzlog *log); + +/* Close a gzlog object. Return zero on success, -3 if the log argument is + invalid. The log object is freed, and so cannot be referenced again. */ +int gzlog_close(gzlog *log); + +#endif diff --git a/externe_kniznice/zlib/examples/zlib_how.html b/externe_kniznice/zlib/examples/zlib_how.html new file mode 100644 index 0000000..444ff1c --- /dev/null +++ b/externe_kniznice/zlib/examples/zlib_how.html @@ -0,0 +1,545 @@ + + + + +zlib Usage Example + + + +

    zlib Usage Example

    +We often get questions about how the deflate() and inflate() functions should be used. +Users wonder when they should provide more input, when they should use more output, +what to do with a Z_BUF_ERROR, how to make sure the process terminates properly, and +so on. So for those who have read zlib.h (a few times), and +would like further edification, below is an annotated example in C of simple routines to compress and decompress +from an input file to an output file using deflate() and inflate() respectively. The +annotations are interspersed between lines of the code. So please read between the lines. +We hope this helps explain some of the intricacies of zlib. +

    +Without further adieu, here is the program zpipe.c: +

    
    +/* zpipe.c: example of proper use of zlib's inflate() and deflate()
    +   Not copyrighted -- provided to the public domain
    +   Version 1.4  11 December 2005  Mark Adler */
    +
    +/* Version history:
    +   1.0  30 Oct 2004  First version
    +   1.1   8 Nov 2004  Add void casting for unused return values
    +                     Use switch statement for inflate() return values
    +   1.2   9 Nov 2004  Add assertions to document zlib guarantees
    +   1.3   6 Apr 2005  Remove incorrect assertion in inf()
    +   1.4  11 Dec 2005  Add hack to avoid MSDOS end-of-line conversions
    +                     Avoid some compiler warnings for input and output buffers
    + */
    +
    +We now include the header files for the required definitions. From +stdio.h we use fopen(), fread(), fwrite(), +feof(), ferror(), and fclose() for file i/o, and +fputs() for error messages. From string.h we use +strcmp() for command line argument processing. +From assert.h we use the assert() macro. +From zlib.h +we use the basic compression functions deflateInit(), +deflate(), and deflateEnd(), and the basic decompression +functions inflateInit(), inflate(), and +inflateEnd(). +
    
    +#include <stdio.h>
    +#include <string.h>
    +#include <assert.h>
    +#include "zlib.h"
    +
    +This is an ugly hack required to avoid corruption of the input and output data on +Windows/MS-DOS systems. Without this, those systems would assume that the input and output +files are text, and try to convert the end-of-line characters from one standard to +another. That would corrupt binary data, and in particular would render the compressed data unusable. +This sets the input and output to binary which suppresses the end-of-line conversions. +SET_BINARY_MODE() will be used later on stdin and stdout, at the beginning of main(). +
    
    +#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
    +#  include <fcntl.h>
    +#  include <io.h>
    +#  define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
    +#else
    +#  define SET_BINARY_MODE(file)
    +#endif
    +
    +CHUNK is simply the buffer size for feeding data to and pulling data +from the zlib routines. Larger buffer sizes would be more efficient, +especially for inflate(). If the memory is available, buffers sizes +on the order of 128K or 256K bytes should be used. +
    
    +#define CHUNK 16384
    +
    +The def() routine compresses data from an input file to an output file. The output data +will be in the zlib format, which is different from the gzip or zip +formats. The zlib format has a very small header of only two bytes to identify it as +a zlib stream and to provide decoding information, and a four-byte trailer with a fast +check value to verify the integrity of the uncompressed data after decoding. +
    
    +/* Compress from file source to file dest until EOF on source.
    +   def() returns Z_OK on success, Z_MEM_ERROR if memory could not be
    +   allocated for processing, Z_STREAM_ERROR if an invalid compression
    +   level is supplied, Z_VERSION_ERROR if the version of zlib.h and the
    +   version of the library linked do not match, or Z_ERRNO if there is
    +   an error reading or writing the files. */
    +int def(FILE *source, FILE *dest, int level)
    +{
    +
    +Here are the local variables for def(). ret will be used for zlib +return codes. flush will keep track of the current flushing state for deflate(), +which is either no flushing, or flush to completion after the end of the input file is reached. +have is the amount of data returned from deflate(). The strm structure +is used to pass information to and from the zlib routines, and to maintain the +deflate() state. in and out are the input and output buffers for +deflate(). +
    
    +    int ret, flush;
    +    unsigned have;
    +    z_stream strm;
    +    unsigned char in[CHUNK];
    +    unsigned char out[CHUNK];
    +
    +The first thing we do is to initialize the zlib state for compression using +deflateInit(). This must be done before the first use of deflate(). +The zalloc, zfree, and opaque fields in the strm +structure must be initialized before calling deflateInit(). Here they are +set to the zlib constant Z_NULL to request that zlib use +the default memory allocation routines. An application may also choose to provide +custom memory allocation routines here. deflateInit() will allocate on the +order of 256K bytes for the internal state. +(See zlib Technical Details.) +

    +deflateInit() is called with a pointer to the structure to be initialized and +the compression level, which is an integer in the range of -1 to 9. Lower compression +levels result in faster execution, but less compression. Higher levels result in +greater compression, but slower execution. The zlib constant Z_DEFAULT_COMPRESSION, +equal to -1, +provides a good compromise between compression and speed and is equivalent to level 6. +Level 0 actually does no compression at all, and in fact expands the data slightly to produce +the zlib format (it is not a byte-for-byte copy of the input). +More advanced applications of zlib +may use deflateInit2() here instead. Such an application may want to reduce how +much memory will be used, at some price in compression. Or it may need to request a +gzip header and trailer instead of a zlib header and trailer, or raw +encoding with no header or trailer at all. +

    +We must check the return value of deflateInit() against the zlib constant +Z_OK to make sure that it was able to +allocate memory for the internal state, and that the provided arguments were valid. +deflateInit() will also check that the version of zlib that the zlib.h +file came from matches the version of zlib actually linked with the program. This +is especially important for environments in which zlib is a shared library. +

    +Note that an application can initialize multiple, independent zlib streams, which can +operate in parallel. The state information maintained in the structure allows the zlib +routines to be reentrant. +

    
    +    /* allocate deflate state */
    +    strm.zalloc = Z_NULL;
    +    strm.zfree = Z_NULL;
    +    strm.opaque = Z_NULL;
    +    ret = deflateInit(&strm, level);
    +    if (ret != Z_OK)
    +        return ret;
    +
    +With the pleasantries out of the way, now we can get down to business. The outer do-loop +reads all of the input file and exits at the bottom of the loop once end-of-file is reached. +This loop contains the only call of deflate(). So we must make sure that all of the +input data has been processed and that all of the output data has been generated and consumed +before we fall out of the loop at the bottom. +
    
    +    /* compress until end of file */
    +    do {
    +
    +We start off by reading data from the input file. The number of bytes read is put directly +into avail_in, and a pointer to those bytes is put into next_in. We also +check to see if end-of-file on the input has been reached. If we are at the end of file, then flush is set to the +zlib constant Z_FINISH, which is later passed to deflate() to +indicate that this is the last chunk of input data to compress. We need to use feof() +to check for end-of-file as opposed to seeing if fewer than CHUNK bytes have been read. The +reason is that if the input file length is an exact multiple of CHUNK, we will miss +the fact that we got to the end-of-file, and not know to tell deflate() to finish +up the compressed stream. If we are not yet at the end of the input, then the zlib +constant Z_NO_FLUSH will be passed to deflate to indicate that we are still +in the middle of the uncompressed data. +

    +If there is an error in reading from the input file, the process is aborted with +deflateEnd() being called to free the allocated zlib state before returning +the error. We wouldn't want a memory leak, now would we? deflateEnd() can be called +at any time after the state has been initialized. Once that's done, deflateInit() (or +deflateInit2()) would have to be called to start a new compression process. There is +no point here in checking the deflateEnd() return code. The deallocation can't fail. +

    
    +        strm.avail_in = fread(in, 1, CHUNK, source);
    +        if (ferror(source)) {
    +            (void)deflateEnd(&strm);
    +            return Z_ERRNO;
    +        }
    +        flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
    +        strm.next_in = in;
    +
    +The inner do-loop passes our chunk of input data to deflate(), and then +keeps calling deflate() until it is done producing output. Once there is no more +new output, deflate() is guaranteed to have consumed all of the input, i.e., +avail_in will be zero. +
    
    +        /* run deflate() on input until output buffer not full, finish
    +           compression if all of source has been read in */
    +        do {
    +
    +Output space is provided to deflate() by setting avail_out to the number +of available output bytes and next_out to a pointer to that space. +
    
    +            strm.avail_out = CHUNK;
    +            strm.next_out = out;
    +
    +Now we call the compression engine itself, deflate(). It takes as many of the +avail_in bytes at next_in as it can process, and writes as many as +avail_out bytes to next_out. Those counters and pointers are then +updated past the input data consumed and the output data written. It is the amount of +output space available that may limit how much input is consumed. +Hence the inner loop to make sure that +all of the input is consumed by providing more output space each time. Since avail_in +and next_in are updated by deflate(), we don't have to mess with those +between deflate() calls until it's all used up. +

    +The parameters to deflate() are a pointer to the strm structure containing +the input and output information and the internal compression engine state, and a parameter +indicating whether and how to flush data to the output. Normally deflate will consume +several K bytes of input data before producing any output (except for the header), in order +to accumulate statistics on the data for optimum compression. It will then put out a burst of +compressed data, and proceed to consume more input before the next burst. Eventually, +deflate() +must be told to terminate the stream, complete the compression with provided input data, and +write out the trailer check value. deflate() will continue to compress normally as long +as the flush parameter is Z_NO_FLUSH. Once the Z_FINISH parameter is provided, +deflate() will begin to complete the compressed output stream. However depending on how +much output space is provided, deflate() may have to be called several times until it +has provided the complete compressed stream, even after it has consumed all of the input. The flush +parameter must continue to be Z_FINISH for those subsequent calls. +

    +There are other values of the flush parameter that are used in more advanced applications. You can +force deflate() to produce a burst of output that encodes all of the input data provided +so far, even if it wouldn't have otherwise, for example to control data latency on a link with +compressed data. You can also ask that deflate() do that as well as erase any history up to +that point so that what follows can be decompressed independently, for example for random access +applications. Both requests will degrade compression by an amount depending on how often such +requests are made. +

    +deflate() has a return value that can indicate errors, yet we do not check it here. Why +not? Well, it turns out that deflate() can do no wrong here. Let's go through +deflate()'s return values and dispense with them one by one. The possible values are +Z_OK, Z_STREAM_END, Z_STREAM_ERROR, or Z_BUF_ERROR. Z_OK +is, well, ok. Z_STREAM_END is also ok and will be returned for the last call of +deflate(). This is already guaranteed by calling deflate() with Z_FINISH +until it has no more output. Z_STREAM_ERROR is only possible if the stream is not +initialized properly, but we did initialize it properly. There is no harm in checking for +Z_STREAM_ERROR here, for example to check for the possibility that some +other part of the application inadvertently clobbered the memory containing the zlib state. +Z_BUF_ERROR will be explained further below, but +suffice it to say that this is simply an indication that deflate() could not consume +more input or produce more output. deflate() can be called again with more output space +or more available input, which it will be in this code. +

    
    +            ret = deflate(&strm, flush);    /* no bad return value */
    +            assert(ret != Z_STREAM_ERROR);  /* state not clobbered */
    +
    +Now we compute how much output deflate() provided on the last call, which is the +difference between how much space was provided before the call, and how much output space +is still available after the call. Then that data, if any, is written to the output file. +We can then reuse the output buffer for the next call of deflate(). Again if there +is a file i/o error, we call deflateEnd() before returning to avoid a memory leak. +
    
    +            have = CHUNK - strm.avail_out;
    +            if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
    +                (void)deflateEnd(&strm);
    +                return Z_ERRNO;
    +            }
    +
    +The inner do-loop is repeated until the last deflate() call fails to fill the +provided output buffer. Then we know that deflate() has done as much as it can with +the provided input, and that all of that input has been consumed. We can then fall out of this +loop and reuse the input buffer. +

    +The way we tell that deflate() has no more output is by seeing that it did not fill +the output buffer, leaving avail_out greater than zero. However suppose that +deflate() has no more output, but just so happened to exactly fill the output buffer! +avail_out is zero, and we can't tell that deflate() has done all it can. +As far as we know, deflate() +has more output for us. So we call it again. But now deflate() produces no output +at all, and avail_out remains unchanged as CHUNK. That deflate() call +wasn't able to do anything, either consume input or produce output, and so it returns +Z_BUF_ERROR. (See, I told you I'd cover this later.) However this is not a problem at +all. Now we finally have the desired indication that deflate() is really done, +and so we drop out of the inner loop to provide more input to deflate(). +

    +With flush set to Z_FINISH, this final set of deflate() calls will +complete the output stream. Once that is done, subsequent calls of deflate() would return +Z_STREAM_ERROR if the flush parameter is not Z_FINISH, and do no more processing +until the state is reinitialized. +

    +Some applications of zlib have two loops that call deflate() +instead of the single inner loop we have here. The first loop would call +without flushing and feed all of the data to deflate(). The second loop would call +deflate() with no more +data and the Z_FINISH parameter to complete the process. As you can see from this +example, that can be avoided by simply keeping track of the current flush state. +

    
    +        } while (strm.avail_out == 0);
    +        assert(strm.avail_in == 0);     /* all input will be used */
    +
    +Now we check to see if we have already processed all of the input file. That information was +saved in the flush variable, so we see if that was set to Z_FINISH. If so, +then we're done and we fall out of the outer loop. We're guaranteed to get Z_STREAM_END +from the last deflate() call, since we ran it until the last chunk of input was +consumed and all of the output was generated. +
    
    +        /* done when last data in file processed */
    +    } while (flush != Z_FINISH);
    +    assert(ret == Z_STREAM_END);        /* stream will be complete */
    +
    +The process is complete, but we still need to deallocate the state to avoid a memory leak +(or rather more like a memory hemorrhage if you didn't do this). Then +finally we can return with a happy return value. +
    
    +    /* clean up and return */
    +    (void)deflateEnd(&strm);
    +    return Z_OK;
    +}
    +
    +Now we do the same thing for decompression in the inf() routine. inf() +decompresses what is hopefully a valid zlib stream from the input file and writes the +uncompressed data to the output file. Much of the discussion above for def() +applies to inf() as well, so the discussion here will focus on the differences between +the two. +
    
    +/* Decompress from file source to file dest until stream ends or EOF.
    +   inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be
    +   allocated for processing, Z_DATA_ERROR if the deflate data is
    +   invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and
    +   the version of the library linked do not match, or Z_ERRNO if there
    +   is an error reading or writing the files. */
    +int inf(FILE *source, FILE *dest)
    +{
    +
    +The local variables have the same functionality as they do for def(). The +only difference is that there is no flush variable, since inflate() +can tell from the zlib stream itself when the stream is complete. +
    
    +    int ret;
    +    unsigned have;
    +    z_stream strm;
    +    unsigned char in[CHUNK];
    +    unsigned char out[CHUNK];
    +
    +The initialization of the state is the same, except that there is no compression level, +of course, and two more elements of the structure are initialized. avail_in +and next_in must be initialized before calling inflateInit(). This +is because the application has the option to provide the start of the zlib stream in +order for inflateInit() to have access to information about the compression +method to aid in memory allocation. In the current implementation of zlib +(up through versions 1.2.x), the method-dependent memory allocations are deferred to the first call of +inflate() anyway. However those fields must be initialized since later versions +of zlib that provide more compression methods may take advantage of this interface. +In any case, no decompression is performed by inflateInit(), so the +avail_out and next_out fields do not need to be initialized before calling. +

    +Here avail_in is set to zero and next_in is set to Z_NULL to +indicate that no input data is being provided. +

    
    +    /* allocate inflate state */
    +    strm.zalloc = Z_NULL;
    +    strm.zfree = Z_NULL;
    +    strm.opaque = Z_NULL;
    +    strm.avail_in = 0;
    +    strm.next_in = Z_NULL;
    +    ret = inflateInit(&strm);
    +    if (ret != Z_OK)
    +        return ret;
    +
    +The outer do-loop decompresses input until inflate() indicates +that it has reached the end of the compressed data and has produced all of the uncompressed +output. This is in contrast to def() which processes all of the input file. +If end-of-file is reached before the compressed data self-terminates, then the compressed +data is incomplete and an error is returned. +
    
    +    /* decompress until deflate stream ends or end of file */
    +    do {
    +
    +We read input data and set the strm structure accordingly. If we've reached the +end of the input file, then we leave the outer loop and report an error, since the +compressed data is incomplete. Note that we may read more data than is eventually consumed +by inflate(), if the input file continues past the zlib stream. +For applications where zlib streams are embedded in other data, this routine would +need to be modified to return the unused data, or at least indicate how much of the input +data was not used, so the application would know where to pick up after the zlib stream. +
    
    +        strm.avail_in = fread(in, 1, CHUNK, source);
    +        if (ferror(source)) {
    +            (void)inflateEnd(&strm);
    +            return Z_ERRNO;
    +        }
    +        if (strm.avail_in == 0)
    +            break;
    +        strm.next_in = in;
    +
    +The inner do-loop has the same function it did in def(), which is to +keep calling inflate() until has generated all of the output it can with the +provided input. +
    
    +        /* run inflate() on input until output buffer not full */
    +        do {
    +
    +Just like in def(), the same output space is provided for each call of inflate(). +
    
    +            strm.avail_out = CHUNK;
    +            strm.next_out = out;
    +
    +Now we run the decompression engine itself. There is no need to adjust the flush parameter, since +the zlib format is self-terminating. The main difference here is that there are +return values that we need to pay attention to. Z_DATA_ERROR +indicates that inflate() detected an error in the zlib compressed data format, +which means that either the data is not a zlib stream to begin with, or that the data was +corrupted somewhere along the way since it was compressed. The other error to be processed is +Z_MEM_ERROR, which can occur since memory allocation is deferred until inflate() +needs it, unlike deflate(), whose memory is allocated at the start by deflateInit(). +

    +Advanced applications may use +deflateSetDictionary() to prime deflate() with a set of likely data to improve the +first 32K or so of compression. This is noted in the zlib header, so inflate() +requests that that dictionary be provided before it can start to decompress. Without the dictionary, +correct decompression is not possible. For this routine, we have no idea what the dictionary is, +so the Z_NEED_DICT indication is converted to a Z_DATA_ERROR. +

    +inflate() can also return Z_STREAM_ERROR, which should not be possible here, +but could be checked for as noted above for def(). Z_BUF_ERROR does not need to be +checked for here, for the same reasons noted for def(). Z_STREAM_END will be +checked for later. +

    
    +            ret = inflate(&strm, Z_NO_FLUSH);
    +            assert(ret != Z_STREAM_ERROR);  /* state not clobbered */
    +            switch (ret) {
    +            case Z_NEED_DICT:
    +                ret = Z_DATA_ERROR;     /* and fall through */
    +            case Z_DATA_ERROR:
    +            case Z_MEM_ERROR:
    +                (void)inflateEnd(&strm);
    +                return ret;
    +            }
    +
    +The output of inflate() is handled identically to that of deflate(). +
    
    +            have = CHUNK - strm.avail_out;
    +            if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
    +                (void)inflateEnd(&strm);
    +                return Z_ERRNO;
    +            }
    +
    +The inner do-loop ends when inflate() has no more output as indicated +by not filling the output buffer, just as for deflate(). In this case, we cannot +assert that strm.avail_in will be zero, since the deflate stream may end before the file +does. +
    
    +        } while (strm.avail_out == 0);
    +
    +The outer do-loop ends when inflate() reports that it has reached the +end of the input zlib stream, has completed the decompression and integrity +check, and has provided all of the output. This is indicated by the inflate() +return value Z_STREAM_END. The inner loop is guaranteed to leave ret +equal to Z_STREAM_END if the last chunk of the input file read contained the end +of the zlib stream. So if the return value is not Z_STREAM_END, the +loop continues to read more input. +
    
    +        /* done when inflate() says it's done */
    +    } while (ret != Z_STREAM_END);
    +
    +At this point, decompression successfully completed, or we broke out of the loop due to no +more data being available from the input file. If the last inflate() return value +is not Z_STREAM_END, then the zlib stream was incomplete and a data error +is returned. Otherwise, we return with a happy return value. Of course, inflateEnd() +is called first to avoid a memory leak. +
    
    +    /* clean up and return */
    +    (void)inflateEnd(&strm);
    +    return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
    +}
    +
    +That ends the routines that directly use zlib. The following routines make this +a command-line program by running data through the above routines from stdin to +stdout, and handling any errors reported by def() or inf(). +

    +zerr() is used to interpret the possible error codes from def() +and inf(), as detailed in their comments above, and print out an error message. +Note that these are only a subset of the possible return values from deflate() +and inflate(). +

    
    +/* report a zlib or i/o error */
    +void zerr(int ret)
    +{
    +    fputs("zpipe: ", stderr);
    +    switch (ret) {
    +    case Z_ERRNO:
    +        if (ferror(stdin))
    +            fputs("error reading stdin\n", stderr);
    +        if (ferror(stdout))
    +            fputs("error writing stdout\n", stderr);
    +        break;
    +    case Z_STREAM_ERROR:
    +        fputs("invalid compression level\n", stderr);
    +        break;
    +    case Z_DATA_ERROR:
    +        fputs("invalid or incomplete deflate data\n", stderr);
    +        break;
    +    case Z_MEM_ERROR:
    +        fputs("out of memory\n", stderr);
    +        break;
    +    case Z_VERSION_ERROR:
    +        fputs("zlib version mismatch!\n", stderr);
    +    }
    +}
    +
    +Here is the main() routine used to test def() and inf(). The +zpipe command is simply a compression pipe from stdin to stdout, if +no arguments are given, or it is a decompression pipe if zpipe -d is used. If any other +arguments are provided, no compression or decompression is performed. Instead a usage +message is displayed. Examples are zpipe < foo.txt > foo.txt.z to compress, and +zpipe -d < foo.txt.z > foo.txt to decompress. +
    
    +/* compress or decompress from stdin to stdout */
    +int main(int argc, char **argv)
    +{
    +    int ret;
    +
    +    /* avoid end-of-line conversions */
    +    SET_BINARY_MODE(stdin);
    +    SET_BINARY_MODE(stdout);
    +
    +    /* do compression if no arguments */
    +    if (argc == 1) {
    +        ret = def(stdin, stdout, Z_DEFAULT_COMPRESSION);
    +        if (ret != Z_OK)
    +            zerr(ret);
    +        return ret;
    +    }
    +
    +    /* do decompression if -d specified */
    +    else if (argc == 2 && strcmp(argv[1], "-d") == 0) {
    +        ret = inf(stdin, stdout);
    +        if (ret != Z_OK)
    +            zerr(ret);
    +        return ret;
    +    }
    +
    +    /* otherwise, report usage */
    +    else {
    +        fputs("zpipe usage: zpipe [-d] < source > dest\n", stderr);
    +        return 1;
    +    }
    +}
    +
    +
    +Copyright (c) 2004, 2005 by Mark Adler
    Last modified 11 December 2005
    + + diff --git a/externe_kniznice/zlib/examples/zpipe.c b/externe_kniznice/zlib/examples/zpipe.c new file mode 100644 index 0000000..83535d1 --- /dev/null +++ b/externe_kniznice/zlib/examples/zpipe.c @@ -0,0 +1,205 @@ +/* zpipe.c: example of proper use of zlib's inflate() and deflate() + Not copyrighted -- provided to the public domain + Version 1.4 11 December 2005 Mark Adler */ + +/* Version history: + 1.0 30 Oct 2004 First version + 1.1 8 Nov 2004 Add void casting for unused return values + Use switch statement for inflate() return values + 1.2 9 Nov 2004 Add assertions to document zlib guarantees + 1.3 6 Apr 2005 Remove incorrect assertion in inf() + 1.4 11 Dec 2005 Add hack to avoid MSDOS end-of-line conversions + Avoid some compiler warnings for input and output buffers + */ + +#include +#include +#include +#include "zlib.h" + +#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) +# include +# include +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +#define CHUNK 16384 + +/* Compress from file source to file dest until EOF on source. + def() returns Z_OK on success, Z_MEM_ERROR if memory could not be + allocated for processing, Z_STREAM_ERROR if an invalid compression + level is supplied, Z_VERSION_ERROR if the version of zlib.h and the + version of the library linked do not match, or Z_ERRNO if there is + an error reading or writing the files. */ +int def(FILE *source, FILE *dest, int level) +{ + int ret, flush; + unsigned have; + z_stream strm; + unsigned char in[CHUNK]; + unsigned char out[CHUNK]; + + /* allocate deflate state */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + ret = deflateInit(&strm, level); + if (ret != Z_OK) + return ret; + + /* compress until end of file */ + do { + strm.avail_in = fread(in, 1, CHUNK, source); + if (ferror(source)) { + (void)deflateEnd(&strm); + return Z_ERRNO; + } + flush = feof(source) ? Z_FINISH : Z_NO_FLUSH; + strm.next_in = in; + + /* run deflate() on input until output buffer not full, finish + compression if all of source has been read in */ + do { + strm.avail_out = CHUNK; + strm.next_out = out; + ret = deflate(&strm, flush); /* no bad return value */ + assert(ret != Z_STREAM_ERROR); /* state not clobbered */ + have = CHUNK - strm.avail_out; + if (fwrite(out, 1, have, dest) != have || ferror(dest)) { + (void)deflateEnd(&strm); + return Z_ERRNO; + } + } while (strm.avail_out == 0); + assert(strm.avail_in == 0); /* all input will be used */ + + /* done when last data in file processed */ + } while (flush != Z_FINISH); + assert(ret == Z_STREAM_END); /* stream will be complete */ + + /* clean up and return */ + (void)deflateEnd(&strm); + return Z_OK; +} + +/* Decompress from file source to file dest until stream ends or EOF. + inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be + allocated for processing, Z_DATA_ERROR if the deflate data is + invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and + the version of the library linked do not match, or Z_ERRNO if there + is an error reading or writing the files. */ +int inf(FILE *source, FILE *dest) +{ + int ret; + unsigned have; + z_stream strm; + unsigned char in[CHUNK]; + unsigned char out[CHUNK]; + + /* allocate inflate state */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit(&strm); + if (ret != Z_OK) + return ret; + + /* decompress until deflate stream ends or end of file */ + do { + strm.avail_in = fread(in, 1, CHUNK, source); + if (ferror(source)) { + (void)inflateEnd(&strm); + return Z_ERRNO; + } + if (strm.avail_in == 0) + break; + strm.next_in = in; + + /* run inflate() on input until output buffer not full */ + do { + strm.avail_out = CHUNK; + strm.next_out = out; + ret = inflate(&strm, Z_NO_FLUSH); + assert(ret != Z_STREAM_ERROR); /* state not clobbered */ + switch (ret) { + case Z_NEED_DICT: + ret = Z_DATA_ERROR; /* and fall through */ + case Z_DATA_ERROR: + case Z_MEM_ERROR: + (void)inflateEnd(&strm); + return ret; + } + have = CHUNK - strm.avail_out; + if (fwrite(out, 1, have, dest) != have || ferror(dest)) { + (void)inflateEnd(&strm); + return Z_ERRNO; + } + } while (strm.avail_out == 0); + + /* done when inflate() says it's done */ + } while (ret != Z_STREAM_END); + + /* clean up and return */ + (void)inflateEnd(&strm); + return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR; +} + +/* report a zlib or i/o error */ +void zerr(int ret) +{ + fputs("zpipe: ", stderr); + switch (ret) { + case Z_ERRNO: + if (ferror(stdin)) + fputs("error reading stdin\n", stderr); + if (ferror(stdout)) + fputs("error writing stdout\n", stderr); + break; + case Z_STREAM_ERROR: + fputs("invalid compression level\n", stderr); + break; + case Z_DATA_ERROR: + fputs("invalid or incomplete deflate data\n", stderr); + break; + case Z_MEM_ERROR: + fputs("out of memory\n", stderr); + break; + case Z_VERSION_ERROR: + fputs("zlib version mismatch!\n", stderr); + } +} + +/* compress or decompress from stdin to stdout */ +int main(int argc, char **argv) +{ + int ret; + + /* avoid end-of-line conversions */ + SET_BINARY_MODE(stdin); + SET_BINARY_MODE(stdout); + + /* do compression if no arguments */ + if (argc == 1) { + ret = def(stdin, stdout, Z_DEFAULT_COMPRESSION); + if (ret != Z_OK) + zerr(ret); + return ret; + } + + /* do decompression if -d specified */ + else if (argc == 2 && strcmp(argv[1], "-d") == 0) { + ret = inf(stdin, stdout); + if (ret != Z_OK) + zerr(ret); + return ret; + } + + /* otherwise, report usage */ + else { + fputs("zpipe usage: zpipe [-d] < source > dest\n", stderr); + return 1; + } +} diff --git a/externe_kniznice/zlib/examples/zran.c b/externe_kniznice/zlib/examples/zran.c new file mode 100644 index 0000000..4fec659 --- /dev/null +++ b/externe_kniznice/zlib/examples/zran.c @@ -0,0 +1,409 @@ +/* zran.c -- example of zlib/gzip stream indexing and random access + * Copyright (C) 2005, 2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + Version 1.1 29 Sep 2012 Mark Adler */ + +/* Version History: + 1.0 29 May 2005 First version + 1.1 29 Sep 2012 Fix memory reallocation error + */ + +/* Illustrate the use of Z_BLOCK, inflatePrime(), and inflateSetDictionary() + for random access of a compressed file. A file containing a zlib or gzip + stream is provided on the command line. The compressed stream is decoded in + its entirety, and an index built with access points about every SPAN bytes + in the uncompressed output. The compressed file is left open, and can then + be read randomly, having to decompress on the average SPAN/2 uncompressed + bytes before getting to the desired block of data. + + An access point can be created at the start of any deflate block, by saving + the starting file offset and bit of that block, and the 32K bytes of + uncompressed data that precede that block. Also the uncompressed offset of + that block is saved to provide a referece for locating a desired starting + point in the uncompressed stream. build_index() works by decompressing the + input zlib or gzip stream a block at a time, and at the end of each block + deciding if enough uncompressed data has gone by to justify the creation of + a new access point. If so, that point is saved in a data structure that + grows as needed to accommodate the points. + + To use the index, an offset in the uncompressed data is provided, for which + the latest access point at or preceding that offset is located in the index. + The input file is positioned to the specified location in the index, and if + necessary the first few bits of the compressed data is read from the file. + inflate is initialized with those bits and the 32K of uncompressed data, and + the decompression then proceeds until the desired offset in the file is + reached. Then the decompression continues to read the desired uncompressed + data from the file. + + Another approach would be to generate the index on demand. In that case, + requests for random access reads from the compressed data would try to use + the index, but if a read far enough past the end of the index is required, + then further index entries would be generated and added. + + There is some fair bit of overhead to starting inflation for the random + access, mainly copying the 32K byte dictionary. So if small pieces of the + file are being accessed, it would make sense to implement a cache to hold + some lookahead and avoid many calls to extract() for small lengths. + + Another way to build an index would be to use inflateCopy(). That would + not be constrained to have access points at block boundaries, but requires + more memory per access point, and also cannot be saved to file due to the + use of pointers in the state. The approach here allows for storage of the + index in a file. + */ + +#include +#include +#include +#include "zlib.h" + +#define local static + +#define SPAN 1048576L /* desired distance between access points */ +#define WINSIZE 32768U /* sliding window size */ +#define CHUNK 16384 /* file input buffer size */ + +/* access point entry */ +struct point { + off_t out; /* corresponding offset in uncompressed data */ + off_t in; /* offset in input file of first full byte */ + int bits; /* number of bits (1-7) from byte at in - 1, or 0 */ + unsigned char window[WINSIZE]; /* preceding 32K of uncompressed data */ +}; + +/* access point list */ +struct access { + int have; /* number of list entries filled in */ + int size; /* number of list entries allocated */ + struct point *list; /* allocated list */ +}; + +/* Deallocate an index built by build_index() */ +local void free_index(struct access *index) +{ + if (index != NULL) { + free(index->list); + free(index); + } +} + +/* Add an entry to the access point list. If out of memory, deallocate the + existing list and return NULL. */ +local struct access *addpoint(struct access *index, int bits, + off_t in, off_t out, unsigned left, unsigned char *window) +{ + struct point *next; + + /* if list is empty, create it (start with eight points) */ + if (index == NULL) { + index = malloc(sizeof(struct access)); + if (index == NULL) return NULL; + index->list = malloc(sizeof(struct point) << 3); + if (index->list == NULL) { + free(index); + return NULL; + } + index->size = 8; + index->have = 0; + } + + /* if list is full, make it bigger */ + else if (index->have == index->size) { + index->size <<= 1; + next = realloc(index->list, sizeof(struct point) * index->size); + if (next == NULL) { + free_index(index); + return NULL; + } + index->list = next; + } + + /* fill in entry and increment how many we have */ + next = index->list + index->have; + next->bits = bits; + next->in = in; + next->out = out; + if (left) + memcpy(next->window, window + WINSIZE - left, left); + if (left < WINSIZE) + memcpy(next->window + left, window, WINSIZE - left); + index->have++; + + /* return list, possibly reallocated */ + return index; +} + +/* Make one entire pass through the compressed stream and build an index, with + access points about every span bytes of uncompressed output -- span is + chosen to balance the speed of random access against the memory requirements + of the list, about 32K bytes per access point. Note that data after the end + of the first zlib or gzip stream in the file is ignored. build_index() + returns the number of access points on success (>= 1), Z_MEM_ERROR for out + of memory, Z_DATA_ERROR for an error in the input file, or Z_ERRNO for a + file read error. On success, *built points to the resulting index. */ +local int build_index(FILE *in, off_t span, struct access **built) +{ + int ret; + off_t totin, totout; /* our own total counters to avoid 4GB limit */ + off_t last; /* totout value of last access point */ + struct access *index; /* access points being generated */ + z_stream strm; + unsigned char input[CHUNK]; + unsigned char window[WINSIZE]; + + /* initialize inflate */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, 47); /* automatic zlib or gzip decoding */ + if (ret != Z_OK) + return ret; + + /* inflate the input, maintain a sliding window, and build an index -- this + also validates the integrity of the compressed data using the check + information at the end of the gzip or zlib stream */ + totin = totout = last = 0; + index = NULL; /* will be allocated by first addpoint() */ + strm.avail_out = 0; + do { + /* get some compressed data from input file */ + strm.avail_in = fread(input, 1, CHUNK, in); + if (ferror(in)) { + ret = Z_ERRNO; + goto build_index_error; + } + if (strm.avail_in == 0) { + ret = Z_DATA_ERROR; + goto build_index_error; + } + strm.next_in = input; + + /* process all of that, or until end of stream */ + do { + /* reset sliding window if necessary */ + if (strm.avail_out == 0) { + strm.avail_out = WINSIZE; + strm.next_out = window; + } + + /* inflate until out of input, output, or at end of block -- + update the total input and output counters */ + totin += strm.avail_in; + totout += strm.avail_out; + ret = inflate(&strm, Z_BLOCK); /* return at end of block */ + totin -= strm.avail_in; + totout -= strm.avail_out; + if (ret == Z_NEED_DICT) + ret = Z_DATA_ERROR; + if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR) + goto build_index_error; + if (ret == Z_STREAM_END) + break; + + /* if at end of block, consider adding an index entry (note that if + data_type indicates an end-of-block, then all of the + uncompressed data from that block has been delivered, and none + of the compressed data after that block has been consumed, + except for up to seven bits) -- the totout == 0 provides an + entry point after the zlib or gzip header, and assures that the + index always has at least one access point; we avoid creating an + access point after the last block by checking bit 6 of data_type + */ + if ((strm.data_type & 128) && !(strm.data_type & 64) && + (totout == 0 || totout - last > span)) { + index = addpoint(index, strm.data_type & 7, totin, + totout, strm.avail_out, window); + if (index == NULL) { + ret = Z_MEM_ERROR; + goto build_index_error; + } + last = totout; + } + } while (strm.avail_in != 0); + } while (ret != Z_STREAM_END); + + /* clean up and return index (release unused entries in list) */ + (void)inflateEnd(&strm); + index->list = realloc(index->list, sizeof(struct point) * index->have); + index->size = index->have; + *built = index; + return index->size; + + /* return error */ + build_index_error: + (void)inflateEnd(&strm); + if (index != NULL) + free_index(index); + return ret; +} + +/* Use the index to read len bytes from offset into buf, return bytes read or + negative for error (Z_DATA_ERROR or Z_MEM_ERROR). If data is requested past + the end of the uncompressed data, then extract() will return a value less + than len, indicating how much as actually read into buf. This function + should not return a data error unless the file was modified since the index + was generated. extract() may also return Z_ERRNO if there is an error on + reading or seeking the input file. */ +local int extract(FILE *in, struct access *index, off_t offset, + unsigned char *buf, int len) +{ + int ret, skip; + z_stream strm; + struct point *here; + unsigned char input[CHUNK]; + unsigned char discard[WINSIZE]; + + /* proceed only if something reasonable to do */ + if (len < 0) + return 0; + + /* find where in stream to start */ + here = index->list; + ret = index->have; + while (--ret && here[1].out <= offset) + here++; + + /* initialize file and inflate state to start there */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, -15); /* raw inflate */ + if (ret != Z_OK) + return ret; + ret = fseeko(in, here->in - (here->bits ? 1 : 0), SEEK_SET); + if (ret == -1) + goto extract_ret; + if (here->bits) { + ret = getc(in); + if (ret == -1) { + ret = ferror(in) ? Z_ERRNO : Z_DATA_ERROR; + goto extract_ret; + } + (void)inflatePrime(&strm, here->bits, ret >> (8 - here->bits)); + } + (void)inflateSetDictionary(&strm, here->window, WINSIZE); + + /* skip uncompressed bytes until offset reached, then satisfy request */ + offset -= here->out; + strm.avail_in = 0; + skip = 1; /* while skipping to offset */ + do { + /* define where to put uncompressed data, and how much */ + if (offset == 0 && skip) { /* at offset now */ + strm.avail_out = len; + strm.next_out = buf; + skip = 0; /* only do this once */ + } + if (offset > WINSIZE) { /* skip WINSIZE bytes */ + strm.avail_out = WINSIZE; + strm.next_out = discard; + offset -= WINSIZE; + } + else if (offset != 0) { /* last skip */ + strm.avail_out = (unsigned)offset; + strm.next_out = discard; + offset = 0; + } + + /* uncompress until avail_out filled, or end of stream */ + do { + if (strm.avail_in == 0) { + strm.avail_in = fread(input, 1, CHUNK, in); + if (ferror(in)) { + ret = Z_ERRNO; + goto extract_ret; + } + if (strm.avail_in == 0) { + ret = Z_DATA_ERROR; + goto extract_ret; + } + strm.next_in = input; + } + ret = inflate(&strm, Z_NO_FLUSH); /* normal inflate */ + if (ret == Z_NEED_DICT) + ret = Z_DATA_ERROR; + if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR) + goto extract_ret; + if (ret == Z_STREAM_END) + break; + } while (strm.avail_out != 0); + + /* if reach end of stream, then don't keep trying to get more */ + if (ret == Z_STREAM_END) + break; + + /* do until offset reached and requested data read, or stream ends */ + } while (skip); + + /* compute number of uncompressed bytes read after offset */ + ret = skip ? 0 : len - strm.avail_out; + + /* clean up and return bytes read or error */ + extract_ret: + (void)inflateEnd(&strm); + return ret; +} + +/* Demonstrate the use of build_index() and extract() by processing the file + provided on the command line, and the extracting 16K from about 2/3rds of + the way through the uncompressed output, and writing that to stdout. */ +int main(int argc, char **argv) +{ + int len; + off_t offset; + FILE *in; + struct access *index = NULL; + unsigned char buf[CHUNK]; + + /* open input file */ + if (argc != 2) { + fprintf(stderr, "usage: zran file.gz\n"); + return 1; + } + in = fopen(argv[1], "rb"); + if (in == NULL) { + fprintf(stderr, "zran: could not open %s for reading\n", argv[1]); + return 1; + } + + /* build index */ + len = build_index(in, SPAN, &index); + if (len < 0) { + fclose(in); + switch (len) { + case Z_MEM_ERROR: + fprintf(stderr, "zran: out of memory\n"); + break; + case Z_DATA_ERROR: + fprintf(stderr, "zran: compressed data error in %s\n", argv[1]); + break; + case Z_ERRNO: + fprintf(stderr, "zran: read error on %s\n", argv[1]); + break; + default: + fprintf(stderr, "zran: error %d while building index\n", len); + } + return 1; + } + fprintf(stderr, "zran: built index with %d access points\n", len); + + /* use index by reading some bytes from an arbitrary offset */ + offset = (index->list[index->have - 1].out << 1) / 3; + len = extract(in, index, offset, buf, CHUNK); + if (len < 0) + fprintf(stderr, "zran: extraction failed: %s error\n", + len == Z_MEM_ERROR ? "out of memory" : "input corrupted"); + else { + fwrite(buf, 1, len, stdout); + fprintf(stderr, "zran: extracted %d bytes at %llu\n", len, offset); + } + + /* clean up and exit */ + free_index(index); + fclose(in); + return 0; +} diff --git a/externe_kniznice/zlib/gzclose.c b/externe_kniznice/zlib/gzclose.c new file mode 100644 index 0000000..caeb99a --- /dev/null +++ b/externe_kniznice/zlib/gzclose.c @@ -0,0 +1,25 @@ +/* gzclose.c -- zlib gzclose() function + * Copyright (C) 2004, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* gzclose() is in a separate file so that it is linked in only if it is used. + That way the other gzclose functions can be used instead to avoid linking in + unneeded compression or decompression routines. */ +int ZEXPORT gzclose(file) + gzFile file; +{ +#ifndef NO_GZCOMPRESS + gz_statep state; + + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file); +#else + return gzclose_r(file); +#endif +} diff --git a/externe_kniznice/zlib/gzguts.h b/externe_kniznice/zlib/gzguts.h new file mode 100644 index 0000000..990a4d2 --- /dev/null +++ b/externe_kniznice/zlib/gzguts.h @@ -0,0 +1,218 @@ +/* gzguts.h -- zlib internal header definitions for gz* operations + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifdef _LARGEFILE64_SOURCE +# ifndef _LARGEFILE_SOURCE +# define _LARGEFILE_SOURCE 1 +# endif +# ifdef _FILE_OFFSET_BITS +# undef _FILE_OFFSET_BITS +# endif +#endif + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include +#include "zlib.h" +#ifdef STDC +# include +# include +# include +#endif + +#ifndef _POSIX_SOURCE +# define _POSIX_SOURCE +#endif +#include + +#ifdef _WIN32 +# include +#endif + +#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) +# include +#endif + +#if defined(_WIN32) || defined(__CYGWIN__) +# define WIDECHAR +#endif + +#ifdef WINAPI_FAMILY +# define open _open +# define read _read +# define write _write +# define close _close +#endif + +#ifdef NO_DEFLATE /* for compatibility with old definition */ +# define NO_GZCOMPRESS +#endif + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS +/* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 +/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) +# define vsnprintf _vsnprintf +# endif +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +# ifdef VMS +# define NO_vsnprintf +# endif +# ifdef __OS400__ +# define NO_vsnprintf +# endif +# ifdef __MVS__ +# define NO_vsnprintf +# endif +#endif + +/* unlike snprintf (which is required in C99), _snprintf does not guarantee + null termination of the result -- however this is only used in gzlib.c where + the result is assured to fit in the space provided */ +#if defined(_MSC_VER) && _MSC_VER < 1900 +# define snprintf _snprintf +#endif + +#ifndef local +# define local static +#endif +/* since "static" is used to mean two completely different things in C, we + define "local" for the non-static meaning of "static", for readability + (compile with -Dlocal if your debugger can't find static symbols) */ + +/* gz* functions always use library allocation functions */ +#ifndef STDC + extern voidp malloc OF((uInt size)); + extern void free OF((voidpf ptr)); +#endif + +/* get errno and strerror definition */ +#if defined UNDER_CE +# include +# define zstrerror() gz_strwinerror((DWORD)GetLastError()) +#else +# ifndef NO_STRERROR +# include +# define zstrerror() strerror(errno) +# else +# define zstrerror() "stdio error (consult errno)" +# endif +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); +#endif + +/* default memLevel */ +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif + +/* default i/o buffer size -- double this for output when reading (this and + twice this must be able to fit in an unsigned type) */ +#define GZBUFSIZE 8192 + +/* gzip modes, also provide a little integrity check on the passed structure */ +#define GZ_NONE 0 +#define GZ_READ 7247 +#define GZ_WRITE 31153 +#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ + +/* values for gz_state how */ +#define LOOK 0 /* look for a gzip header */ +#define COPY 1 /* copy input directly */ +#define GZIP 2 /* decompress a gzip stream */ + +/* internal gzip file state data structure */ +typedef struct { + /* exposed contents for gzgetc() macro */ + struct gzFile_s x; /* "x" for exposed */ + /* x.have: number of bytes available at x.next */ + /* x.next: next output data to deliver or write */ + /* x.pos: current position in uncompressed data */ + /* used for both reading and writing */ + int mode; /* see gzip modes above */ + int fd; /* file descriptor */ + char *path; /* path or fd for error messages */ + unsigned size; /* buffer size, zero if not allocated yet */ + unsigned want; /* requested buffer size, default is GZBUFSIZE */ + unsigned char *in; /* input buffer (double-sized when writing) */ + unsigned char *out; /* output buffer (double-sized when reading) */ + int direct; /* 0 if processing gzip, 1 if transparent */ + /* just for reading */ + int how; /* 0: get header, 1: copy, 2: decompress */ + z_off64_t start; /* where the gzip data started, for rewinding */ + int eof; /* true if end of input file reached */ + int past; /* true if read requested past end */ + /* just for writing */ + int level; /* compression level */ + int strategy; /* compression strategy */ + /* seek request */ + z_off64_t skip; /* amount to skip (already rewound if backwards) */ + int seek; /* true if seek request pending */ + /* error information */ + int err; /* error code */ + char *msg; /* error message */ + /* zlib inflate or deflate stream */ + z_stream strm; /* stream structure in-place (not a pointer) */ +} gz_state; +typedef gz_state FAR *gz_statep; + +/* shared functions */ +void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +#if defined UNDER_CE +char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +#endif + +/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t + value -- needed when comparing unsigned to z_off64_t, which is signed + (possible z_off64_t types off_t, off64_t, and long are all signed) */ +#ifdef INT_MAX +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) +#else +unsigned ZLIB_INTERNAL gz_intmax OF((void)); +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) +#endif diff --git a/externe_kniznice/zlib/gzlib.c b/externe_kniznice/zlib/gzlib.c new file mode 100644 index 0000000..4105e6a --- /dev/null +++ b/externe_kniznice/zlib/gzlib.c @@ -0,0 +1,637 @@ +/* gzlib.c -- zlib functions common to reading and writing gzip files + * Copyright (C) 2004-2017 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +#if defined(_WIN32) && !defined(__BORLANDC__) && !defined(__MINGW32__) +# define LSEEK _lseeki64 +#else +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +# define LSEEK lseek64 +#else +# define LSEEK lseek +#endif +#endif + +/* Local functions */ +local void gz_reset OF((gz_statep)); +local gzFile gz_open OF((const void *, int, const char *)); + +#if defined UNDER_CE + +/* Map the Windows error number in ERROR to a locale-dependent error message + string and return a pointer to it. Typically, the values for ERROR come + from GetLastError. + + The string pointed to shall not be modified by the application, but may be + overwritten by a subsequent call to gz_strwinerror + + The gz_strwinerror function does not change the current setting of + GetLastError. */ +char ZLIB_INTERNAL *gz_strwinerror (error) + DWORD error; +{ + static char buf[1024]; + + wchar_t *msgbuf; + DWORD lasterr = GetLastError(); + DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, + error, + 0, /* Default language */ + (LPVOID)&msgbuf, + 0, + NULL); + if (chars != 0) { + /* If there is an \r\n appended, zap it. */ + if (chars >= 2 + && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { + chars -= 2; + msgbuf[chars] = 0; + } + + if (chars > sizeof (buf) - 1) { + chars = sizeof (buf) - 1; + msgbuf[chars] = 0; + } + + wcstombs(buf, msgbuf, chars + 1); + LocalFree(msgbuf); + } + else { + sprintf(buf, "unknown win32 error (%ld)", error); + } + + SetLastError(lasterr); + return buf; +} + +#endif /* UNDER_CE */ + +/* Reset gzip file state */ +local void gz_reset(state) + gz_statep state; +{ + state->x.have = 0; /* no output data available */ + if (state->mode == GZ_READ) { /* for reading ... */ + state->eof = 0; /* not at end of file */ + state->past = 0; /* have not read past end yet */ + state->how = LOOK; /* look for gzip header */ + } + state->seek = 0; /* no seek request pending */ + gz_error(state, Z_OK, NULL); /* clear error */ + state->x.pos = 0; /* no uncompressed data yet */ + state->strm.avail_in = 0; /* no input data yet */ +} + +/* Open a gzip file either by name or file descriptor. */ +local gzFile gz_open(path, fd, mode) + const void *path; + int fd; + const char *mode; +{ + gz_statep state; + z_size_t len; + int oflag; +#ifdef O_CLOEXEC + int cloexec = 0; +#endif +#ifdef O_EXCL + int exclusive = 0; +#endif + + /* check input */ + if (path == NULL) + return NULL; + + /* allocate gzFile structure to return */ + state = (gz_statep)malloc(sizeof(gz_state)); + if (state == NULL) + return NULL; + state->size = 0; /* no buffers allocated yet */ + state->want = GZBUFSIZE; /* requested buffer size */ + state->msg = NULL; /* no error message yet */ + + /* interpret mode */ + state->mode = GZ_NONE; + state->level = Z_DEFAULT_COMPRESSION; + state->strategy = Z_DEFAULT_STRATEGY; + state->direct = 0; + while (*mode) { + if (*mode >= '0' && *mode <= '9') + state->level = *mode - '0'; + else + switch (*mode) { + case 'r': + state->mode = GZ_READ; + break; +#ifndef NO_GZCOMPRESS + case 'w': + state->mode = GZ_WRITE; + break; + case 'a': + state->mode = GZ_APPEND; + break; +#endif + case '+': /* can't read and write at the same time */ + free(state); + return NULL; + case 'b': /* ignore -- will request binary anyway */ + break; +#ifdef O_CLOEXEC + case 'e': + cloexec = 1; + break; +#endif +#ifdef O_EXCL + case 'x': + exclusive = 1; + break; +#endif + case 'f': + state->strategy = Z_FILTERED; + break; + case 'h': + state->strategy = Z_HUFFMAN_ONLY; + break; + case 'R': + state->strategy = Z_RLE; + break; + case 'F': + state->strategy = Z_FIXED; + break; + case 'T': + state->direct = 1; + break; + default: /* could consider as an error, but just ignore */ + ; + } + mode++; + } + + /* must provide an "r", "w", or "a" */ + if (state->mode == GZ_NONE) { + free(state); + return NULL; + } + + /* can't force transparent read */ + if (state->mode == GZ_READ) { + if (state->direct) { + free(state); + return NULL; + } + state->direct = 1; /* for empty file */ + } + + /* save the path name for error messages */ +#ifdef WIDECHAR + if (fd == -2) { + len = wcstombs(NULL, path, 0); + if (len == (z_size_t)-1) + len = 0; + } + else +#endif + len = strlen((const char *)path); + state->path = (char *)malloc(len + 1); + if (state->path == NULL) { + free(state); + return NULL; + } +#ifdef WIDECHAR + if (fd == -2) + if (len) + wcstombs(state->path, path, len + 1); + else + *(state->path) = 0; + else +#endif +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + (void)snprintf(state->path, len + 1, "%s", (const char *)path); +#else + strcpy(state->path, path); +#endif + + /* compute the flags for open() */ + oflag = +#ifdef O_LARGEFILE + O_LARGEFILE | +#endif +#ifdef O_BINARY + O_BINARY | +#endif +#ifdef O_CLOEXEC + (cloexec ? O_CLOEXEC : 0) | +#endif + (state->mode == GZ_READ ? + O_RDONLY : + (O_WRONLY | O_CREAT | +#ifdef O_EXCL + (exclusive ? O_EXCL : 0) | +#endif + (state->mode == GZ_WRITE ? + O_TRUNC : + O_APPEND))); + + /* open the file with the appropriate flags (or just use fd) */ + state->fd = fd > -1 ? fd : ( +#ifdef WIDECHAR + fd == -2 ? _wopen(path, oflag, 0666) : +#endif + open((const char *)path, oflag, 0666)); + if (state->fd == -1) { + free(state->path); + free(state); + return NULL; + } + if (state->mode == GZ_APPEND) { + LSEEK(state->fd, 0, SEEK_END); /* so gzoffset() is correct */ + state->mode = GZ_WRITE; /* simplify later checks */ + } + + /* save the current position for rewinding (only if reading) */ + if (state->mode == GZ_READ) { + state->start = LSEEK(state->fd, 0, SEEK_CUR); + if (state->start == -1) state->start = 0; + } + + /* initialize stream */ + gz_reset(state); + + /* return stream */ + return (gzFile)state; +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen64(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzdopen(fd, mode) + int fd; + const char *mode; +{ + char *path; /* identifier for error messages */ + gzFile gz; + + if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL) + return NULL; +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + (void)snprintf(path, 7 + 3 * sizeof(int), "", fd); +#else + sprintf(path, "", fd); /* for debugging */ +#endif + gz = gz_open(path, fd, mode); + free(path); + return gz; +} + +/* -- see zlib.h -- */ +#ifdef WIDECHAR +gzFile ZEXPORT gzopen_w(path, mode) + const wchar_t *path; + const char *mode; +{ + return gz_open(path, -2, mode); +} +#endif + +/* -- see zlib.h -- */ +int ZEXPORT gzbuffer(file, size) + gzFile file; + unsigned size; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* make sure we haven't already allocated memory */ + if (state->size != 0) + return -1; + + /* check and set requested size */ + if ((size << 1) < size) + return -1; /* need to be able to double it */ + if (size < 2) + size = 2; /* need two bytes to check magic header */ + state->want = size; + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzrewind(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* back up and start over */ + if (LSEEK(state->fd, state->start, SEEK_SET) == -1) + return -1; + gz_reset(state); + return 0; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzseek64(file, offset, whence) + gzFile file; + z_off64_t offset; + int whence; +{ + unsigned n; + z_off64_t ret; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* check that there's no error */ + if (state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + + /* can only seek from start or relative to current position */ + if (whence != SEEK_SET && whence != SEEK_CUR) + return -1; + + /* normalize offset to a SEEK_CUR specification */ + if (whence == SEEK_SET) + offset -= state->x.pos; + else if (state->seek) + offset += state->skip; + state->seek = 0; + + /* if within raw area while reading, just go there */ + if (state->mode == GZ_READ && state->how == COPY && + state->x.pos + offset >= 0) { + ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); + if (ret == -1) + return -1; + state->x.have = 0; + state->eof = 0; + state->past = 0; + state->seek = 0; + gz_error(state, Z_OK, NULL); + state->strm.avail_in = 0; + state->x.pos += offset; + return state->x.pos; + } + + /* calculate skip amount, rewinding if needed for back seek when reading */ + if (offset < 0) { + if (state->mode != GZ_READ) /* writing -- can't go backwards */ + return -1; + offset += state->x.pos; + if (offset < 0) /* before start of file! */ + return -1; + if (gzrewind(file) == -1) /* rewind, then skip to offset */ + return -1; + } + + /* if reading, skip what's in output buffer (one less gzgetc() check) */ + if (state->mode == GZ_READ) { + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ? + (unsigned)offset : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + offset -= n; + } + + /* request skip (if not zero) */ + if (offset) { + state->seek = 1; + state->skip = offset; + } + return state->x.pos + offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzseek(file, offset, whence) + gzFile file; + z_off_t offset; + int whence; +{ + z_off64_t ret; + + ret = gzseek64(file, (z_off64_t)offset, whence); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gztell64(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* return position */ + return state->x.pos + (state->seek ? state->skip : 0); +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gztell(file) + gzFile file; +{ + z_off64_t ret; + + ret = gztell64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzoffset64(file) + gzFile file; +{ + z_off64_t offset; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* compute and return effective offset in file */ + offset = LSEEK(state->fd, 0, SEEK_CUR); + if (offset == -1) + return -1; + if (state->mode == GZ_READ) /* reading */ + offset -= state->strm.avail_in; /* don't count buffered input */ + return offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzoffset(file) + gzFile file; +{ + z_off64_t ret; + + ret = gzoffset64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzeof(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return 0; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return 0; + + /* return end-of-file state */ + return state->mode == GZ_READ ? state->past : 0; +} + +/* -- see zlib.h -- */ +const char * ZEXPORT gzerror(file, errnum) + gzFile file; + int *errnum; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return NULL; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return NULL; + + /* return error information */ + if (errnum != NULL) + *errnum = state->err; + return state->err == Z_MEM_ERROR ? "out of memory" : + (state->msg == NULL ? "" : state->msg); +} + +/* -- see zlib.h -- */ +void ZEXPORT gzclearerr(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return; + + /* clear error and end-of-file */ + if (state->mode == GZ_READ) { + state->eof = 0; + state->past = 0; + } + gz_error(state, Z_OK, NULL); +} + +/* Create an error message in allocated memory and set state->err and + state->msg accordingly. Free any previous error message already there. Do + not try to free or allocate space if the error is Z_MEM_ERROR (out of + memory). Simply save the error message as a static string. If there is an + allocation failure constructing the error message, then convert the error to + out of memory. */ +void ZLIB_INTERNAL gz_error(state, err, msg) + gz_statep state; + int err; + const char *msg; +{ + /* free previously allocated message and clear */ + if (state->msg != NULL) { + if (state->err != Z_MEM_ERROR) + free(state->msg); + state->msg = NULL; + } + + /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */ + if (err != Z_OK && err != Z_BUF_ERROR) + state->x.have = 0; + + /* set error code, and if no message, then done */ + state->err = err; + if (msg == NULL) + return; + + /* for an out of memory error, return literal string when requested */ + if (err == Z_MEM_ERROR) + return; + + /* construct error message with path */ + if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) == + NULL) { + state->err = Z_MEM_ERROR; + return; + } +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + (void)snprintf(state->msg, strlen(state->path) + strlen(msg) + 3, + "%s%s%s", state->path, ": ", msg); +#else + strcpy(state->msg, state->path); + strcat(state->msg, ": "); + strcat(state->msg, msg); +#endif +} + +#ifndef INT_MAX +/* portably return maximum value for an int (when limits.h presumed not + available) -- we need to do this to cover cases where 2's complement not + used, since C standard permits 1's complement and sign-bit representations, + otherwise we could just use ((unsigned)-1) >> 1 */ +unsigned ZLIB_INTERNAL gz_intmax() +{ + unsigned p, q; + + p = 1; + do { + q = p; + p <<= 1; + p++; + } while (p > q); + return q >> 1; +} +#endif diff --git a/externe_kniznice/zlib/gzread.c b/externe_kniznice/zlib/gzread.c new file mode 100644 index 0000000..956b91e --- /dev/null +++ b/externe_kniznice/zlib/gzread.c @@ -0,0 +1,654 @@ +/* gzread.c -- zlib functions for reading gzip files + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); +local int gz_avail OF((gz_statep)); +local int gz_look OF((gz_statep)); +local int gz_decomp OF((gz_statep)); +local int gz_fetch OF((gz_statep)); +local int gz_skip OF((gz_statep, z_off64_t)); +local z_size_t gz_read OF((gz_statep, voidp, z_size_t)); + +/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from + state->fd, and update state->eof, state->err, and state->msg as appropriate. + This function needs to loop on read(), since read() is not guaranteed to + read the number of bytes requested, depending on the type of descriptor. */ +local int gz_load(state, buf, len, have) + gz_statep state; + unsigned char *buf; + unsigned len; + unsigned *have; +{ + int ret; + unsigned get, max = ((unsigned)-1 >> 2) + 1; + + *have = 0; + do { + get = len - *have; + if (get > max) + get = max; + ret = read(state->fd, buf + *have, get); + if (ret <= 0) + break; + *have += (unsigned)ret; + } while (*have < len); + if (ret < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + if (ret == 0) + state->eof = 1; + return 0; +} + +/* Load up input buffer and set eof flag if last data loaded -- return -1 on + error, 0 otherwise. Note that the eof flag is set when the end of the input + file is reached, even though there may be unused data in the buffer. Once + that data has been used, no more attempts will be made to read the file. + If strm->avail_in != 0, then the current data is moved to the beginning of + the input buffer, and then the remainder of the buffer is loaded with the + available data from the input file. */ +local int gz_avail(state) + gz_statep state; +{ + unsigned got; + z_streamp strm = &(state->strm); + + if (state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + if (state->eof == 0) { + if (strm->avail_in) { /* copy what's there to the start */ + unsigned char *p = state->in; + unsigned const char *q = strm->next_in; + unsigned n = strm->avail_in; + do { + *p++ = *q++; + } while (--n); + } + if (gz_load(state, state->in + strm->avail_in, + state->size - strm->avail_in, &got) == -1) + return -1; + strm->avail_in += got; + strm->next_in = state->in; + } + return 0; +} + +/* Look for gzip header, set up for inflate or copy. state->x.have must be 0. + If this is the first time in, allocate required memory. state->how will be + left unchanged if there is no more input data available, will be set to COPY + if there is no gzip header and direct copying will be performed, or it will + be set to GZIP for decompression. If direct copying, then leftover input + data from the input buffer will be copied to the output buffer. In that + case, all further file reads will be directly to either the output buffer or + a user buffer. If decompressing, the inflate state will be initialized. + gz_look() will return 0 on success or -1 on failure. */ +local int gz_look(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + /* allocate read buffers and inflate memory */ + if (state->size == 0) { + /* allocate buffers */ + state->in = (unsigned char *)malloc(state->want); + state->out = (unsigned char *)malloc(state->want << 1); + if (state->in == NULL || state->out == NULL) { + free(state->out); + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + state->size = state->want; + + /* allocate inflate memory */ + state->strm.zalloc = Z_NULL; + state->strm.zfree = Z_NULL; + state->strm.opaque = Z_NULL; + state->strm.avail_in = 0; + state->strm.next_in = Z_NULL; + if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */ + free(state->out); + free(state->in); + state->size = 0; + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + } + + /* get at least the magic bytes in the input buffer */ + if (strm->avail_in < 2) { + if (gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) + return 0; + } + + /* look for gzip magic bytes -- if there, do gzip decoding (note: there is + a logical dilemma here when considering the case of a partially written + gzip file, to wit, if a single 31 byte is written, then we cannot tell + whether this is a single-byte file, or just a partially written gzip + file -- for here we assume that if a gzip file is being written, then + the header will be written in a single operation, so that reading a + single byte is sufficient indication that it is not a gzip file) */ + if (strm->avail_in > 1 && + strm->next_in[0] == 31 && strm->next_in[1] == 139) { + inflateReset(strm); + state->how = GZIP; + state->direct = 0; + return 0; + } + + /* no gzip header -- if we were decoding gzip before, then this is trailing + garbage. Ignore the trailing garbage and finish. */ + if (state->direct == 0) { + strm->avail_in = 0; + state->eof = 1; + state->x.have = 0; + return 0; + } + + /* doing raw i/o, copy any leftover input to output -- this assumes that + the output buffer is larger than the input buffer, which also assures + space for gzungetc() */ + state->x.next = state->out; + if (strm->avail_in) { + memcpy(state->x.next, strm->next_in, strm->avail_in); + state->x.have = strm->avail_in; + strm->avail_in = 0; + } + state->how = COPY; + state->direct = 1; + return 0; +} + +/* Decompress from input to the provided next_out and avail_out in the state. + On return, state->x.have and state->x.next point to the just decompressed + data. If the gzip stream completes, state->how is reset to LOOK to look for + the next gzip stream or raw data, once state->x.have is depleted. Returns 0 + on success, -1 on failure. */ +local int gz_decomp(state) + gz_statep state; +{ + int ret = Z_OK; + unsigned had; + z_streamp strm = &(state->strm); + + /* fill output buffer up to end of deflate stream */ + had = strm->avail_out; + do { + /* get more input for inflate() */ + if (strm->avail_in == 0 && gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) { + gz_error(state, Z_BUF_ERROR, "unexpected end of file"); + break; + } + + /* decompress and handle errors */ + ret = inflate(strm, Z_NO_FLUSH); + if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { + gz_error(state, Z_STREAM_ERROR, + "internal error: inflate stream corrupt"); + return -1; + } + if (ret == Z_MEM_ERROR) { + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ + gz_error(state, Z_DATA_ERROR, + strm->msg == NULL ? "compressed data error" : strm->msg); + return -1; + } + } while (strm->avail_out && ret != Z_STREAM_END); + + /* update available output */ + state->x.have = had - strm->avail_out; + state->x.next = strm->next_out - state->x.have; + + /* if the gzip stream completed successfully, look for another */ + if (ret == Z_STREAM_END) + state->how = LOOK; + + /* good decompression */ + return 0; +} + +/* Fetch data and put it in the output buffer. Assumes state->x.have is 0. + Data is either copied from the input file or decompressed from the input + file depending on state->how. If state->how is LOOK, then a gzip header is + looked for to determine whether to copy or decompress. Returns -1 on error, + otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the + end of the input file has been reached and all data has been processed. */ +local int gz_fetch(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + do { + switch(state->how) { + case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */ + if (gz_look(state) == -1) + return -1; + if (state->how == LOOK) + return 0; + break; + case COPY: /* -> COPY */ + if (gz_load(state, state->out, state->size << 1, &(state->x.have)) + == -1) + return -1; + state->x.next = state->out; + return 0; + case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */ + strm->avail_out = state->size << 1; + strm->next_out = state->out; + if (gz_decomp(state) == -1) + return -1; + } + } while (state->x.have == 0 && (!state->eof || strm->avail_in)); + return 0; +} + +/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ +local int gz_skip(state, len) + gz_statep state; + z_off64_t len; +{ + unsigned n; + + /* skip over len bytes or reach end-of-file, whichever comes first */ + while (len) + /* skip over whatever is in output buffer */ + if (state->x.have) { + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ? + (unsigned)len : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + len -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && state->strm.avail_in == 0) + break; + + /* need more data to skip -- load up output buffer */ + else { + /* get more output, looking for header if required */ + if (gz_fetch(state) == -1) + return -1; + } + return 0; +} + +/* Read len bytes into buf from file, or less than len up to the end of the + input. Return the number of bytes read. If zero is returned, either the + end of file was reached, or there was an error. state->err must be + consulted in that case to determine which. */ +local z_size_t gz_read(state, buf, len) + gz_statep state; + voidp buf; + z_size_t len; +{ + z_size_t got; + unsigned n; + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return 0; + } + + /* get len bytes to buf, or less than len if at the end */ + got = 0; + do { + /* set n to the maximum amount of len that fits in an unsigned int */ + n = -1; + if (n > len) + n = len; + + /* first just try copying data from the output buffer */ + if (state->x.have) { + if (state->x.have < n) + n = state->x.have; + memcpy(buf, state->x.next, n); + state->x.next += n; + state->x.have -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && state->strm.avail_in == 0) { + state->past = 1; /* tried to read past end */ + break; + } + + /* need output data -- for small len or new stream load up our output + buffer */ + else if (state->how == LOOK || n < (state->size << 1)) { + /* get more output, looking for header if required */ + if (gz_fetch(state) == -1) + return 0; + continue; /* no progress yet -- go back to copy above */ + /* the copy above assures that we will leave with space in the + output buffer, allowing at least one gzungetc() to succeed */ + } + + /* large len -- read directly into user buffer */ + else if (state->how == COPY) { /* read directly */ + if (gz_load(state, (unsigned char *)buf, n, &n) == -1) + return 0; + } + + /* large len -- decompress directly into user buffer */ + else { /* state->how == GZIP */ + state->strm.avail_out = n; + state->strm.next_out = (unsigned char *)buf; + if (gz_decomp(state) == -1) + return 0; + n = state->x.have; + state->x.have = 0; + } + + /* update progress */ + len -= n; + buf = (char *)buf + n; + got += n; + state->x.pos += n; + } while (len); + + /* return number of bytes read into user buffer */ + return got; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzread(file, buf, len) + gzFile file; + voidp buf; + unsigned len; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids a flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_STREAM_ERROR, "request does not fit in an int"); + return -1; + } + + /* read len or fewer bytes to buf */ + len = gz_read(state, buf, len); + + /* check for an error */ + if (len == 0 && state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + + /* return the number of bytes read (this is assured to fit in an int) */ + return (int)len; +} + +/* -- see zlib.h -- */ +z_size_t ZEXPORT gzfread(buf, size, nitems, file) + voidp buf; + z_size_t size; + z_size_t nitems; + gzFile file; +{ + z_size_t len; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return 0; + + /* compute bytes to read -- error on overflow */ + len = nitems * size; + if (size && len / size != nitems) { + gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t"); + return 0; + } + + /* read len or fewer bytes to buf, return the number of full items read */ + return len ? gz_read(state, buf, len) / size : 0; +} + +/* -- see zlib.h -- */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +#else +# undef gzgetc +#endif +int ZEXPORT gzgetc(file) + gzFile file; +{ + int ret; + unsigned char buf[1]; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* try output buffer (no need to check for skip request) */ + if (state->x.have) { + state->x.have--; + state->x.pos++; + return *(state->x.next)++; + } + + /* nothing there -- try gz_read() */ + ret = gz_read(state, buf, 1); + return ret < 1 ? -1 : buf[0]; +} + +int ZEXPORT gzgetc_(file) +gzFile file; +{ + return gzgetc(file); +} + +/* -- see zlib.h -- */ +int ZEXPORT gzungetc(c, file) + int c; + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return -1; + } + + /* can't push EOF */ + if (c < 0) + return -1; + + /* if output buffer empty, put byte at end (allows more pushing) */ + if (state->x.have == 0) { + state->x.have = 1; + state->x.next = state->out + (state->size << 1) - 1; + state->x.next[0] = (unsigned char)c; + state->x.pos--; + state->past = 0; + return c; + } + + /* if no room, give up (must have already done a gzungetc()) */ + if (state->x.have == (state->size << 1)) { + gz_error(state, Z_DATA_ERROR, "out of room to push characters"); + return -1; + } + + /* slide output data if needed and insert byte before existing data */ + if (state->x.next == state->out) { + unsigned char *src = state->out + state->x.have; + unsigned char *dest = state->out + (state->size << 1); + while (src > state->out) + *--dest = *--src; + state->x.next = dest; + } + state->x.have++; + state->x.next--; + state->x.next[0] = (unsigned char)c; + state->x.pos--; + state->past = 0; + return c; +} + +/* -- see zlib.h -- */ +char * ZEXPORT gzgets(file, buf, len) + gzFile file; + char *buf; + int len; +{ + unsigned left, n; + char *str; + unsigned char *eol; + gz_statep state; + + /* check parameters and get internal structure */ + if (file == NULL || buf == NULL || len < 1) + return NULL; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return NULL; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return NULL; + } + + /* copy output bytes up to new line or len - 1, whichever comes first -- + append a terminating zero to the string (we don't check for a zero in + the contents, let the user worry about that) */ + str = buf; + left = (unsigned)len - 1; + if (left) do { + /* assure that something is in the output buffer */ + if (state->x.have == 0 && gz_fetch(state) == -1) + return NULL; /* error */ + if (state->x.have == 0) { /* end of file */ + state->past = 1; /* read past end */ + break; /* return what we have */ + } + + /* look for end-of-line in current output buffer */ + n = state->x.have > left ? left : state->x.have; + eol = (unsigned char *)memchr(state->x.next, '\n', n); + if (eol != NULL) + n = (unsigned)(eol - state->x.next) + 1; + + /* copy through end-of-line, or remainder if not found */ + memcpy(buf, state->x.next, n); + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + left -= n; + buf += n; + } while (left && eol == NULL); + + /* return terminated string, or if nothing, end of file */ + if (buf == str) + return NULL; + buf[0] = 0; + return str; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzdirect(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* if the state is not known, but we can find out, then do so (this is + mainly for right after a gzopen() or gzdopen()) */ + if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0) + (void)gz_look(state); + + /* return 1 if transparent, 0 if processing a gzip stream */ + return state->direct; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_r(file) + gzFile file; +{ + int ret, err; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're reading */ + if (state->mode != GZ_READ) + return Z_STREAM_ERROR; + + /* free memory and close file */ + if (state->size) { + inflateEnd(&(state->strm)); + free(state->out); + free(state->in); + } + err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK; + gz_error(state, Z_OK, NULL); + free(state->path); + ret = close(state->fd); + free(state); + return ret ? Z_ERRNO : err; +} diff --git a/externe_kniznice/zlib/gzwrite.c b/externe_kniznice/zlib/gzwrite.c new file mode 100644 index 0000000..c7b5651 --- /dev/null +++ b/externe_kniznice/zlib/gzwrite.c @@ -0,0 +1,665 @@ +/* gzwrite.c -- zlib functions for writing gzip files + * Copyright (C) 2004-2017 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_init OF((gz_statep)); +local int gz_comp OF((gz_statep, int)); +local int gz_zero OF((gz_statep, z_off64_t)); +local z_size_t gz_write OF((gz_statep, voidpc, z_size_t)); + +/* Initialize state for writing a gzip file. Mark initialization by setting + state->size to non-zero. Return -1 on a memory allocation failure, or 0 on + success. */ +local int gz_init(state) + gz_statep state; +{ + int ret; + z_streamp strm = &(state->strm); + + /* allocate input buffer (double size for gzprintf) */ + state->in = (unsigned char *)malloc(state->want << 1); + if (state->in == NULL) { + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* only need output buffer and deflate state if compressing */ + if (!state->direct) { + /* allocate output buffer */ + state->out = (unsigned char *)malloc(state->want); + if (state->out == NULL) { + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* allocate deflate memory, set up for gzip compression */ + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; + strm->opaque = Z_NULL; + ret = deflateInit2(strm, state->level, Z_DEFLATED, + MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy); + if (ret != Z_OK) { + free(state->out); + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + strm->next_in = NULL; + } + + /* mark state as initialized */ + state->size = state->want; + + /* initialize write buffer if compressing */ + if (!state->direct) { + strm->avail_out = state->size; + strm->next_out = state->out; + state->x.next = strm->next_out; + } + return 0; +} + +/* Compress whatever is at avail_in and next_in and write to the output file. + Return -1 if there is an error writing to the output file or if gz_init() + fails to allocate memory, otherwise 0. flush is assumed to be a valid + deflate() flush value. If flush is Z_FINISH, then the deflate() state is + reset to start a new gzip stream. If gz->direct is true, then simply write + to the output file without compressing, and ignore flush. */ +local int gz_comp(state, flush) + gz_statep state; + int flush; +{ + int ret, writ; + unsigned have, put, max = ((unsigned)-1 >> 2) + 1; + z_streamp strm = &(state->strm); + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return -1; + + /* write directly if requested */ + if (state->direct) { + while (strm->avail_in) { + put = strm->avail_in > max ? max : strm->avail_in; + writ = write(state->fd, strm->next_in, put); + if (writ < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + strm->avail_in -= (unsigned)writ; + strm->next_in += writ; + } + return 0; + } + + /* run deflate() on provided input until it produces no more output */ + ret = Z_OK; + do { + /* write out current buffer contents if full, or if flushing, but if + doing Z_FINISH then don't write until we get to Z_STREAM_END */ + if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && + (flush != Z_FINISH || ret == Z_STREAM_END))) { + while (strm->next_out > state->x.next) { + put = strm->next_out - state->x.next > (int)max ? max : + (unsigned)(strm->next_out - state->x.next); + writ = write(state->fd, state->x.next, put); + if (writ < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + state->x.next += writ; + } + if (strm->avail_out == 0) { + strm->avail_out = state->size; + strm->next_out = state->out; + state->x.next = state->out; + } + } + + /* compress */ + have = strm->avail_out; + ret = deflate(strm, flush); + if (ret == Z_STREAM_ERROR) { + gz_error(state, Z_STREAM_ERROR, + "internal error: deflate stream corrupt"); + return -1; + } + have -= strm->avail_out; + } while (have); + + /* if that completed a deflate stream, allow another to start */ + if (flush == Z_FINISH) + deflateReset(strm); + + /* all done, no errors */ + return 0; +} + +/* Compress len zeros to output. Return -1 on a write error or memory + allocation failure by gz_comp(), or 0 on success. */ +local int gz_zero(state, len) + gz_statep state; + z_off64_t len; +{ + int first; + unsigned n; + z_streamp strm = &(state->strm); + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + + /* compress len zeros (len guaranteed > 0) */ + first = 1; + while (len) { + n = GT_OFF(state->size) || (z_off64_t)state->size > len ? + (unsigned)len : state->size; + if (first) { + memset(state->in, 0, n); + first = 0; + } + strm->avail_in = n; + strm->next_in = state->in; + state->x.pos += n; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + len -= n; + } + return 0; +} + +/* Write len bytes from buf to file. Return the number of bytes written. If + the returned value is less than len, then there was an error. */ +local z_size_t gz_write(state, buf, len) + gz_statep state; + voidpc buf; + z_size_t len; +{ + z_size_t put = len; + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* for small len, copy to input buffer, otherwise compress directly */ + if (len < state->size) { + /* copy to input buffer, compress when full */ + do { + unsigned have, copy; + + if (state->strm.avail_in == 0) + state->strm.next_in = state->in; + have = (unsigned)((state->strm.next_in + state->strm.avail_in) - + state->in); + copy = state->size - have; + if (copy > len) + copy = len; + memcpy(state->in + have, buf, copy); + state->strm.avail_in += copy; + state->x.pos += copy; + buf = (const char *)buf + copy; + len -= copy; + if (len && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + } while (len); + } + else { + /* consume whatever's left in the input buffer */ + if (state->strm.avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* directly compress user buffer to file */ + state->strm.next_in = (z_const Bytef *)buf; + do { + unsigned n = (unsigned)-1; + if (n > len) + n = len; + state->strm.avail_in = n; + state->x.pos += n; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + len -= n; + } while (len); + } + + /* input was all buffered or compressed */ + return put; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzwrite(file, buf, len) + gzFile file; + voidpc buf; + unsigned len; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids a flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); + return 0; + } + + /* write len bytes from buf (the return value will fit in an int) */ + return (int)gz_write(state, buf, len); +} + +/* -- see zlib.h -- */ +z_size_t ZEXPORT gzfwrite(buf, size, nitems, file) + voidpc buf; + z_size_t size; + z_size_t nitems; + gzFile file; +{ + z_size_t len; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* compute bytes to read -- error on overflow */ + len = nitems * size; + if (size && len / size != nitems) { + gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t"); + return 0; + } + + /* write len bytes to buf, return the number of full items written */ + return len ? gz_write(state, buf, len) / size : 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputc(file, c) + gzFile file; + int c; +{ + unsigned have; + unsigned char buf[1]; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return -1; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* try writing to input buffer for speed (state->size == 0 if buffer not + initialized) */ + if (state->size) { + if (strm->avail_in == 0) + strm->next_in = state->in; + have = (unsigned)((strm->next_in + strm->avail_in) - state->in); + if (have < state->size) { + state->in[have] = (unsigned char)c; + strm->avail_in++; + state->x.pos++; + return c & 0xff; + } + } + + /* no room in buffer or not initialized, use gz_write() */ + buf[0] = (unsigned char)c; + if (gz_write(state, buf, 1) != 1) + return -1; + return c & 0xff; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputs(file, str) + gzFile file; + const char *str; +{ + int ret; + z_size_t len; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return -1; + + /* write string */ + len = strlen(str); + ret = gz_write(state, str, len); + return ret == 0 && len != 0 ? -1 : ret; +} + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +#include + +/* -- see zlib.h -- */ +int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) +{ + int len; + unsigned left; + char *next; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return state->err; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return state->err; + } + + /* do the printf() into the input buffer, put length in len -- the input + buffer is double-sized just for this function, so there is guaranteed to + be state->size bytes available after the current contents */ + if (strm->avail_in == 0) + strm->next_in = state->in; + next = (char *)(state->in + (strm->next_in - state->in) + strm->avail_in); + next[state->size - 1] = 0; +#ifdef NO_vsnprintf +# ifdef HAS_vsprintf_void + (void)vsprintf(next, format, va); + for (len = 0; len < state->size; len++) + if (next[len] == 0) break; +# else + len = vsprintf(next, format, va); +# endif +#else +# ifdef HAS_vsnprintf_void + (void)vsnprintf(next, state->size, format, va); + len = strlen(next); +# else + len = vsnprintf(next, state->size, format, va); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len == 0 || (unsigned)len >= state->size || next[state->size - 1] != 0) + return 0; + + /* update buffer and position, compress first half if past that */ + strm->avail_in += (unsigned)len; + state->x.pos += len; + if (strm->avail_in >= state->size) { + left = strm->avail_in - state->size; + strm->avail_in = state->size; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return state->err; + memcpy(state->in, state->in + state->size, left); + strm->next_in = state->in; + strm->avail_in = left; + } + return len; +} + +int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) +{ + va_list va; + int ret; + + va_start(va, format); + ret = gzvprintf(file, format, va); + va_end(va); + return ret; +} + +#else /* !STDC && !Z_HAVE_STDARG_H */ + +/* -- see zlib.h -- */ +int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + gzFile file; + const char *format; + int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; +{ + unsigned len, left; + char *next; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that can really pass pointer in ints */ + if (sizeof(int) != sizeof(void *)) + return Z_STREAM_ERROR; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return state->error; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return state->error; + } + + /* do the printf() into the input buffer, put length in len -- the input + buffer is double-sized just for this function, so there is guaranteed to + be state->size bytes available after the current contents */ + if (strm->avail_in == 0) + strm->next_in = state->in; + next = (char *)(strm->next_in + strm->avail_in); + next[state->size - 1] = 0; +#ifdef NO_snprintf +# ifdef HAS_sprintf_void + sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, + a13, a14, a15, a16, a17, a18, a19, a20); + for (len = 0; len < size; len++) + if (next[len] == 0) + break; +# else + len = sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, + a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#else +# ifdef HAS_snprintf_void + snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = strlen(next); +# else + len = snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len == 0 || len >= state->size || next[state->size - 1] != 0) + return 0; + + /* update buffer and position, compress first half if past that */ + strm->avail_in += len; + state->x.pos += len; + if (strm->avail_in >= state->size) { + left = strm->avail_in - state->size; + strm->avail_in = state->size; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return state->err; + memcpy(state->in, state->in + state->size, left); + strm->next_in = state->in; + strm->avail_in = left; + } + return (int)len; +} + +#endif + +/* -- see zlib.h -- */ +int ZEXPORT gzflush(file, flush) + gzFile file; + int flush; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* check flush parameter */ + if (flush < 0 || flush > Z_FINISH) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return state->err; + } + + /* compress remaining data with requested flush */ + (void)gz_comp(state, flush); + return state->err; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzsetparams(file, level, strategy) + gzFile file; + int level; + int strategy; +{ + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* if no change is requested, then do nothing */ + if (level == state->level && strategy == state->strategy) + return Z_OK; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return state->err; + } + + /* change compression parameters for subsequent input */ + if (state->size) { + /* flush previous input with previous parameters before changing */ + if (strm->avail_in && gz_comp(state, Z_BLOCK) == -1) + return state->err; + deflateParams(strm, level, strategy); + } + state->level = level; + state->strategy = strategy; + return Z_OK; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_w(file) + gzFile file; +{ + int ret = Z_OK; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're writing */ + if (state->mode != GZ_WRITE) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + ret = state->err; + } + + /* flush, free memory, and close file */ + if (gz_comp(state, Z_FINISH) == -1) + ret = state->err; + if (state->size) { + if (!state->direct) { + (void)deflateEnd(&(state->strm)); + free(state->out); + } + free(state->in); + } + gz_error(state, Z_OK, NULL); + free(state->path); + if (close(state->fd) == -1) + ret = Z_ERRNO; + free(state); + return ret; +} diff --git a/externe_kniznice/zlib/infback.c b/externe_kniznice/zlib/infback.c new file mode 100644 index 0000000..59679ec --- /dev/null +++ b/externe_kniznice/zlib/infback.c @@ -0,0 +1,640 @@ +/* infback.c -- inflate using a call-back interface + * Copyright (C) 1995-2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + This code is largely copied from inflate.c. Normally either infback.o or + inflate.o would be linked into an application--not both. The interface + with inffast.c is retained so that optimized assembler-coded versions of + inflate_fast() can be used with either inflate.c or infback.c. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); + +/* + strm provides memory allocation functions in zalloc and zfree, or + Z_NULL to use the library memory allocation functions. + + windowBits is in the range 8..15, and window is a user-supplied + window and output buffer that is 2**windowBits bytes. + */ +int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) +z_streamp strm; +int windowBits; +unsigned char FAR *window; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL || window == Z_NULL || + windowBits < 8 || windowBits > 15) + return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + state = (struct inflate_state FAR *)ZALLOC(strm, 1, + sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->dmax = 32768U; + state->wbits = (uInt)windowBits; + state->wsize = 1U << windowBits; + state->window = window; + state->wnext = 0; + state->whave = 0; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +/* Macros for inflateBack(): */ + +/* Load returned state from inflate_fast() */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Set state from registers for inflate_fast() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Assure that some input is available. If input is requested, but denied, + then return a Z_BUF_ERROR from inflateBack(). */ +#define PULL() \ + do { \ + if (have == 0) { \ + have = in(in_desc, &next); \ + if (have == 0) { \ + next = Z_NULL; \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflateBack() + with an error if there is no input available. */ +#define PULLBYTE() \ + do { \ + PULL(); \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflateBack() with + an error. */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Assure that some output space is available, by writing out the window + if it's full. If the write fails, return from inflateBack() with a + Z_BUF_ERROR. */ +#define ROOM() \ + do { \ + if (left == 0) { \ + put = state->window; \ + left = state->wsize; \ + state->whave = left; \ + if (out(out_desc, put, left)) { \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* + strm provides the memory allocation functions and window buffer on input, + and provides information on the unused input on return. For Z_DATA_ERROR + returns, strm will also provide an error message. + + in() and out() are the call-back input and output functions. When + inflateBack() needs more input, it calls in(). When inflateBack() has + filled the window with output, or when it completes with data in the + window, it calls out() to write out the data. The application must not + change the provided input until in() is called again or inflateBack() + returns. The application must not change the window/output buffer until + inflateBack() returns. + + in() and out() are called with a descriptor parameter provided in the + inflateBack() call. This parameter can be a structure that provides the + information required to do the read or write, as well as accumulated + information on the input and output such as totals and check values. + + in() should return zero on failure. out() should return non-zero on + failure. If either in() or out() fails, than inflateBack() returns a + Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it + was in() or out() that caused in the error. Otherwise, inflateBack() + returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format + error, or Z_MEM_ERROR if it could not allocate memory for the state. + inflateBack() can also return Z_STREAM_ERROR if the input parameters + are not correct, i.e. strm is Z_NULL or the state was not initialized. + */ +int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) +z_streamp strm; +in_func in; +void FAR *in_desc; +out_func out; +void FAR *out_desc; +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + /* Check that the strm exists and that the state was initialized */ + if (strm == Z_NULL || strm->state == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* Reset the state */ + strm->msg = Z_NULL; + state->mode = TYPE; + state->last = 0; + state->whave = 0; + next = strm->next_in; + have = next != Z_NULL ? strm->avail_in : 0; + hold = 0; + bits = 0; + put = state->window; + left = state->wsize; + + /* Inflate until end of block marked as last */ + for (;;) + switch (state->mode) { + case TYPE: + /* determine and dispatch block type */ + if (state->last) { + BYTEBITS(); + state->mode = DONE; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + + case STORED: + /* get and verify stored block length */ + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + + /* copy stored block from input to output */ + while (state->length != 0) { + copy = state->length; + PULL(); + ROOM(); + if (copy > have) copy = have; + if (copy > left) copy = left; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + + case TABLE: + /* get dynamic table entries descriptor */ + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + + /* get code length code lengths (not a typo) */ + state->have = 0; + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + + /* get length and distance code code lengths */ + state->have = 0; + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = (unsigned)(state->lens[state->have - 1]); + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + + case LEN: + /* use inflate_fast() if we have enough input and output */ + if (have >= 6 && left >= 258) { + RESTORE(); + if (state->whave < state->wsize) + state->whave = state->wsize - left; + inflate_fast(strm, state->wsize); + LOAD(); + break; + } + + /* get a literal, length, or end-of-block code */ + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + state->length = (unsigned)here.val; + + /* process literal */ + if (here.op == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + ROOM(); + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + } + + /* process end of block */ + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + + /* invalid code */ + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + + /* length code -- get extra bits, if any */ + state->extra = (unsigned)(here.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + + /* get distance code */ + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + + /* get distance extra bits, if any */ + state->extra = (unsigned)(here.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } + if (state->offset > state->wsize - (state->whave < state->wsize ? + left : 0)) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + + /* copy match from window to output */ + do { + ROOM(); + copy = state->wsize - state->offset; + if (copy < left) { + from = put + copy; + copy = left - copy; + } + else { + from = put - state->offset; + copy = left; + } + if (copy > state->length) copy = state->length; + state->length -= copy; + left -= copy; + do { + *put++ = *from++; + } while (--copy); + } while (state->length != 0); + break; + + case DONE: + /* inflate stream terminated properly -- write leftover output */ + ret = Z_STREAM_END; + if (left < state->wsize) { + if (out(out_desc, state->window, state->wsize - left)) + ret = Z_BUF_ERROR; + } + goto inf_leave; + + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + + default: /* can't happen, but makes compilers happy */ + ret = Z_STREAM_ERROR; + goto inf_leave; + } + + /* Return unused input */ + inf_leave: + strm->next_in = next; + strm->avail_in = have; + return ret; +} + +int ZEXPORT inflateBackEnd(strm) +z_streamp strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} diff --git a/externe_kniznice/zlib/inffast.c b/externe_kniznice/zlib/inffast.c new file mode 100644 index 0000000..0dbd1db --- /dev/null +++ b/externe_kniznice/zlib/inffast.c @@ -0,0 +1,323 @@ +/* inffast.c -- fast decoding + * Copyright (C) 1995-2017 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef ASMINF +# pragma message("Assembler code may have bugs -- use at your own risk") +#else + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void ZLIB_INTERNAL inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *in; /* local strm->next_in */ + z_const unsigned char FAR *last; /* have enough input while in < last */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ +#ifdef INFLATE_STRICT + unsigned dmax; /* maximum distance from zlib header */ +#endif + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code here; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char FAR *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + in = strm->next_in; + last = in + (strm->avail_in - 5); + out = strm->next_out; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); +#ifdef INFLATE_STRICT + dmax = state->dmax; +#endif + wsize = state->wsize; + whave = state->whave; + wnext = state->wnext; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + do { + if (bits < 15) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + here = lcode[hold & lmask]; + dolen: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op == 0) { /* literal */ + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + *out++ = (unsigned char)(here.val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + here = dcode[hold & dmask]; + dodist: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op & 16) { /* distance base */ + dist = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(*in++) << bits; + bits += 8; + } + } + dist += (unsigned)hold & ((1U << op) - 1); +#ifdef INFLATE_STRICT + if (dist > dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + hold >>= op; + bits -= op; + Tracevv((stderr, "inflate: distance %u\n", dist)); + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + if (state->sane) { + strm->msg = + (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + if (len <= op - whave) { + do { + *out++ = 0; + } while (--len); + continue; + } + len -= op - whave; + do { + *out++ = 0; + } while (--op > whave); + if (op == 0) { + from = out - dist; + do { + *out++ = *from++; + } while (--len); + continue; + } +#endif + } + from = window; + if (wnext == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + *out++ = *from++; + } while (--op); + from = out - dist; /* rest from output */ + } + } + else if (wnext < op) { /* wrap around window */ + from += wsize + wnext - op; + op -= wnext; + if (op < len) { /* some from end of window */ + len -= op; + do { + *out++ = *from++; + } while (--op); + from = window; + if (wnext < len) { /* some from start of window */ + op = wnext; + len -= op; + do { + *out++ = *from++; + } while (--op); + from = out - dist; /* rest from output */ + } + } + } + else { /* contiguous in window */ + from += wnext - op; + if (op < len) { /* some from window */ + len -= op; + do { + *out++ = *from++; + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { + *out++ = *from++; + *out++ = *from++; + *out++ = *from++; + len -= 3; + } + if (len) { + *out++ = *from++; + if (len > 1) + *out++ = *from++; + } + } + else { + from = out - dist; /* copy direct from output */ + do { /* minimum length is three */ + *out++ = *from++; + *out++ = *from++; + *out++ = *from++; + len -= 3; + } while (len > 2); + if (len) { + *out++ = *from++; + if (len > 1) + *out++ = *from++; + } + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ + here = dcode[here.val + (hold & ((1U << op) - 1))]; + goto dodist; + } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + here = lcode[here.val + (hold & ((1U << op) - 1))]; + goto dolen; + } + else if (op & 32) { /* end-of-block */ + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in; + strm->next_out = out; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); + state->hold = hold; + state->bits = bits; + return; +} + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and wnext == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !ASMINF */ diff --git a/externe_kniznice/zlib/inffast.h b/externe_kniznice/zlib/inffast.h new file mode 100644 index 0000000..e5c1aa4 --- /dev/null +++ b/externe_kniznice/zlib/inffast.h @@ -0,0 +1,11 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/externe_kniznice/zlib/inffixed.h b/externe_kniznice/zlib/inffixed.h new file mode 100644 index 0000000..d628327 --- /dev/null +++ b/externe_kniznice/zlib/inffixed.h @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/externe_kniznice/zlib/inflate.c b/externe_kniznice/zlib/inflate.c new file mode 100644 index 0000000..ac333e8 --- /dev/null +++ b/externe_kniznice/zlib/inflate.c @@ -0,0 +1,1561 @@ +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * Change history: + * + * 1.2.beta0 24 Nov 2002 + * - First version -- complete rewrite of inflate to simplify code, avoid + * creation of window when not needed, minimize use of window when it is + * needed, make inffast.c even faster, implement gzip decoding, and to + * improve code readability and style over the previous zlib inflate code + * + * 1.2.beta1 25 Nov 2002 + * - Use pointers for available input and output checking in inffast.c + * - Remove input and output counters in inffast.c + * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 + * - Remove unnecessary second byte pull from length extra in inffast.c + * - Unroll direct copy to three copies per loop in inffast.c + * + * 1.2.beta2 4 Dec 2002 + * - Change external routine names to reduce potential conflicts + * - Correct filename to inffixed.h for fixed tables in inflate.c + * - Make hbuf[] unsigned char to match parameter type in inflate.c + * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) + * to avoid negation problem on Alphas (64 bit) in inflate.c + * + * 1.2.beta3 22 Dec 2002 + * - Add comments on state->bits assertion in inffast.c + * - Add comments on op field in inftrees.h + * - Fix bug in reuse of allocated window after inflateReset() + * - Remove bit fields--back to byte structure for speed + * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths + * - Change post-increments to pre-increments in inflate_fast(), PPC biased? + * - Add compile time option, POSTINC, to use post-increments instead (Intel?) + * - Make MATCH copy in inflate() much faster for when inflate_fast() not used + * - Use local copies of stream next and avail values, as well as local bit + * buffer and bit count in inflate()--for speed when inflate_fast() not used + * + * 1.2.beta4 1 Jan 2003 + * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings + * - Move a comment on output buffer sizes from inffast.c to inflate.c + * - Add comments in inffast.c to introduce the inflate_fast() routine + * - Rearrange window copies in inflate_fast() for speed and simplification + * - Unroll last copy for window match in inflate_fast() + * - Use local copies of window variables in inflate_fast() for speed + * - Pull out common wnext == 0 case for speed in inflate_fast() + * - Make op and len in inflate_fast() unsigned for consistency + * - Add FAR to lcode and dcode declarations in inflate_fast() + * - Simplified bad distance check in inflate_fast() + * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new + * source file infback.c to provide a call-back interface to inflate for + * programs like gzip and unzip -- uses window as output buffer to avoid + * window copying + * + * 1.2.beta5 1 Jan 2003 + * - Improved inflateBack() interface to allow the caller to provide initial + * input in strm. + * - Fixed stored blocks bug in inflateBack() + * + * 1.2.beta6 4 Jan 2003 + * - Added comments in inffast.c on effectiveness of POSTINC + * - Typecasting all around to reduce compiler warnings + * - Changed loops from while (1) or do {} while (1) to for (;;), again to + * make compilers happy + * - Changed type of window in inflateBackInit() to unsigned char * + * + * 1.2.beta7 27 Jan 2003 + * - Changed many types to unsigned or unsigned short to avoid warnings + * - Added inflateCopy() function + * + * 1.2.0 9 Mar 2003 + * - Changed inflateBack() interface to provide separate opaque descriptors + * for the in() and out() functions + * - Changed inflateBack() argument and in_func typedef to swap the length + * and buffer address return values for the input function + * - Check next_in and next_out for Z_NULL on entry to inflate() + * + * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef MAKEFIXED +# ifndef BUILDFIXED +# define BUILDFIXED +# endif +#endif + +/* function prototypes */ +local int inflateStateCheck OF((z_streamp strm)); +local void fixedtables OF((struct inflate_state FAR *state)); +local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, + unsigned copy)); +#ifdef BUILDFIXED + void makefixed OF((void)); +#endif +local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, + unsigned len)); + +local int inflateStateCheck(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) + return 1; + state = (struct inflate_state FAR *)strm->state; + if (state == Z_NULL || state->strm != strm || + state->mode < HEAD || state->mode > SYNC) + return 1; + return 0; +} + +int ZEXPORT inflateResetKeep(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + if (state->wrap) /* to support ill-conceived Java test suite */ + strm->adler = state->wrap & 1; + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->dmax = 32768U; + state->head = Z_NULL; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + state->sane = 1; + state->back = -1; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + +int ZEXPORT inflateReset(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + state->wsize = 0; + state->whave = 0; + state->wnext = 0; + return inflateResetKeep(strm); +} + +int ZEXPORT inflateReset2(strm, windowBits) +z_streamp strm; +int windowBits; +{ + int wrap; + struct inflate_state FAR *state; + + /* get the state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* extract wrap request from windowBits parameter */ + if (windowBits < 0) { + wrap = 0; + windowBits = -windowBits; + } + else { + wrap = (windowBits >> 4) + 5; +#ifdef GUNZIP + if (windowBits < 48) + windowBits &= 15; +#endif + } + + /* set number of window bits, free window if different */ + if (windowBits && (windowBits < 8 || windowBits > 15)) + return Z_STREAM_ERROR; + if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { + ZFREE(strm, state->window); + state->window = Z_NULL; + } + + /* update state and reset the rest of it */ + state->wrap = wrap; + state->wbits = (unsigned)windowBits; + return inflateReset(strm); +} + +int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) +z_streamp strm; +int windowBits; +const char *version; +int stream_size; +{ + int ret; + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->strm = strm; + state->window = Z_NULL; + state->mode = HEAD; /* to pass state test in inflateReset2() */ + ret = inflateReset2(strm, windowBits); + if (ret != Z_OK) { + ZFREE(strm, state); + strm->state = Z_NULL; + } + return ret; +} + +int ZEXPORT inflateInit_(strm, version, stream_size) +z_streamp strm; +const char *version; +int stream_size; +{ + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + +int ZEXPORT inflatePrime(strm, bits, value) +z_streamp strm; +int bits; +int value; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (bits < 0) { + state->hold = 0; + state->bits = 0; + return Z_OK; + } + if (bits > 16 || state->bits + (uInt)bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += (unsigned)value << state->bits; + state->bits += (uInt)bits; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +#ifdef MAKEFIXED +#include + +/* + Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also + defines BUILDFIXED, so the tables are built on the fly. makefixed() writes + those tables to stdout, which would be piped to inffixed.h. A small program + can simply call makefixed to do this: + + void makefixed(void); + + int main(void) + { + makefixed(); + return 0; + } + + Then that can be linked with zlib built with MAKEFIXED defined and run: + + a.out > inffixed.h + */ +void makefixed() +{ + unsigned low, size; + struct inflate_state state; + + fixedtables(&state); + puts(" /* inffixed.h -- table for decoding fixed codes"); + puts(" * Generated automatically by makefixed()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 7) == 0) printf("\n "); + printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, + state.lencode[low].bits, state.lencode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, + state.distcode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +local int updatewindow(strm, end, copy) +z_streamp strm; +const Bytef *end; +unsigned copy; +{ + struct inflate_state FAR *state; + unsigned dist; + + state = (struct inflate_state FAR *)strm->state; + + /* if it hasn't been done already, allocate space for the window */ + if (state->window == Z_NULL) { + state->window = (unsigned char FAR *) + ZALLOC(strm, 1U << state->wbits, + sizeof(unsigned char)); + if (state->window == Z_NULL) return 1; + } + + /* if window not in use yet, initialize */ + if (state->wsize == 0) { + state->wsize = 1U << state->wbits; + state->wnext = 0; + state->whave = 0; + } + + /* copy state->wsize or less output bytes into the circular window */ + if (copy >= state->wsize) { + zmemcpy(state->window, end - state->wsize, state->wsize); + state->wnext = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->wnext; + if (dist > copy) dist = copy; + zmemcpy(state->window + state->wnext, end - copy, dist); + copy -= dist; + if (copy) { + zmemcpy(state->window, end - copy, copy); + state->wnext = copy; + state->whave = state->wsize; + } + else { + state->wnext += dist; + if (state->wnext == state->wsize) state->wnext = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } + return 0; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE(check, buf, len) \ + (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +#else +# define UPDATE(check, buf, len) adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = crc32(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = crc32(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int ZEXPORT inflate(strm, flush) +z_streamp strm; +int flush; +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ +#ifdef GUNZIP + unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +#endif + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + if (inflateStateCheck(strm) || strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state FAR *)strm->state; + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); +#ifdef GUNZIP + if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + if (state->wbits == 0) + state->wbits = 15; + state->check = crc32(0L, Z_NULL, 0); + CRC2(state->check, hold); + INITBITS(); + state->mode = FLAGS; + break; + } + state->flags = 0; /* expect zlib header */ + if (state->head != Z_NULL) + state->head->done = -1; + if (!(state->wrap & 1) || /* check if zlib header allowed */ +#else + if ( +#endif + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + len = BITS(4) + 8; + if (state->wbits == 0) + state->wbits = len; + if (len > 15 || len > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + state->dmax = 1U << len; + Tracev((stderr, "inflate: zlib header ok\n")); + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; +#ifdef GUNZIP + case FLAGS: + NEEDBITS(16); + state->flags = (int)(hold); + if ((state->flags & 0xff) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + if (state->flags & 0xe000) { + strm->msg = (char *)"unknown header flags set"; + state->mode = BAD; + break; + } + if (state->head != Z_NULL) + state->head->text = (int)((hold >> 8) & 1); + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); + INITBITS(); + state->mode = TIME; + case TIME: + NEEDBITS(32); + if (state->head != Z_NULL) + state->head->time = hold; + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC4(state->check, hold); + INITBITS(); + state->mode = OS; + case OS: + NEEDBITS(16); + if (state->head != Z_NULL) { + state->head->xflags = (int)(hold & 0xff); + state->head->os = (int)(hold >> 8); + } + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); + state->length = (unsigned)(hold); + if (state->head != Z_NULL) + state->head->extra_len = (unsigned)hold; + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); + INITBITS(); + } + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && + state->head->extra != Z_NULL) { + len = state->head->extra_len - state->length; + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); + } + if ((state->flags & 0x0200) && (state->wrap & 4)) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + state->length -= copy; + } + if (state->length) goto inf_leave; + } + state->length = 0; + state->mode = NAME; + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->name != Z_NULL && + state->length < state->head->name_max) + state->head->name[state->length++] = (Bytef)len; + } while (len && copy < have); + if ((state->flags & 0x0200) && (state->wrap & 4)) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->comment != Z_NULL && + state->length < state->head->comm_max) + state->head->comment[state->length++] = (Bytef)len; + } while (len && copy < have); + if ((state->flags & 0x0200) && (state->wrap & 4)) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); + if ((state->wrap & 4) && hold != (state->check & 0xffff)) { + strm->msg = (char *)"header crc mismatch"; + state->mode = BAD; + break; + } + INITBITS(); + } + if (state->head != Z_NULL) { + state->head->hcrc = (int)((state->flags >> 9) & 1); + state->head->done = 1; + } + strm->adler = state->check = crc32(0L, Z_NULL, 0); + state->mode = TYPE; + break; +#endif + case DICTID: + NEEDBITS(32); + strm->adler = state->check = ZSWAP32(hold); + INITBITS(); + state->mode = DICT; + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; + case TYPE: + if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN_; /* decode codes */ + if (flush == Z_TREES) { + DROPBITS(2); + goto inf_leave; + } + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + state->mode = COPY_; + if (flush == Z_TREES) goto inf_leave; + case COPY_: + state->mode = COPY; + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; + state->mode = LENLENS; + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (const code FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; + state->mode = CODELENS; + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + state->lencode = (const code FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (const code FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN_; + if (flush == Z_TREES) goto inf_leave; + case LEN_: + state->mode = LEN; + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); + inflate_fast(strm, out); + LOAD(); + if (state->mode == TYPE) + state->back = -1; + break; + } + state->back = 0; + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + state->length = (unsigned)here.val; + if ((int)(here.op) == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + state->mode = LIT; + break; + } + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->back = -1; + state->mode = TYPE; + break; + } + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(here.op) & 15; + state->mode = LENEXT; + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->was = state->length; + state->mode = DIST; + case DIST: + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + state->extra = (unsigned)(here.op) & 15; + state->mode = DISTEXT; + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } +#ifdef INFLATE_STRICT + if (state->offset > state->dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->whave) { + if (state->sane) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + Trace((stderr, "inflate.c too far\n")); + copy -= state->whave; + if (copy > state->length) copy = state->length; + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = 0; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; +#endif + } + if (copy > state->wnext) { + copy -= state->wnext; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->wnext - copy); + if (copy > state->length) copy = state->length; + } + else { /* copy from output */ + from = put - state->offset; + copy = state->length; + } + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = *from++; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if ((state->wrap & 4) && out) + strm->adler = state->check = + UPDATE(state->check, put - out, out); + out = left; + if ((state->wrap & 4) && ( +#ifdef GUNZIP + state->flags ? hold : +#endif + ZSWAP32(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: check matches trailer\n")); + } +#ifdef GUNZIP + state->mode = LENGTH; + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); + if (hold != (state->total & 0xffffffffUL)) { + strm->msg = (char *)"incorrect length check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: length matches trailer\n")); + } +#endif + state->mode = DONE; + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + inf_leave: + RESTORE(); + if (state->wsize || (out != strm->avail_out && state->mode < BAD && + (state->mode < CHECK || flush != Z_FINISH))) + if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if ((state->wrap & 4) && out) + strm->adler = state->check = + UPDATE(state->check, strm->next_out - out, out); + strm->data_type = (int)state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0) + + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + return ret; +} + +int ZEXPORT inflateEnd(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (inflateStateCheck(strm)) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->window != Z_NULL) ZFREE(strm, state->window); + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + +int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength) +z_streamp strm; +Bytef *dictionary; +uInt *dictLength; +{ + struct inflate_state FAR *state; + + /* check state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* copy dictionary */ + if (state->whave && dictionary != Z_NULL) { + zmemcpy(dictionary, state->window + state->wnext, + state->whave - state->wnext); + zmemcpy(dictionary + state->whave - state->wnext, + state->window, state->wnext); + } + if (dictLength != Z_NULL) + *dictLength = state->whave; + return Z_OK; +} + +int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) +z_streamp strm; +const Bytef *dictionary; +uInt dictLength; +{ + struct inflate_state FAR *state; + unsigned long dictid; + int ret; + + /* check state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->wrap != 0 && state->mode != DICT) + return Z_STREAM_ERROR; + + /* check for correct dictionary identifier */ + if (state->mode == DICT) { + dictid = adler32(0L, Z_NULL, 0); + dictid = adler32(dictid, dictionary, dictLength); + if (dictid != state->check) + return Z_DATA_ERROR; + } + + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + ret = updatewindow(strm, dictionary + dictLength, dictLength); + if (ret) { + state->mode = MEM; + return Z_MEM_ERROR; + } + state->havedict = 1; + Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +int ZEXPORT inflateGetHeader(strm, head) +z_streamp strm; +gz_headerp head; +{ + struct inflate_state FAR *state; + + /* check state */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; + + /* save header structure */ + state->head = head; + head->done = 0; + return Z_OK; +} + +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +local unsigned syncsearch(have, buf, len) +unsigned FAR *have; +const unsigned char FAR *buf; +unsigned len; +{ + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; +} + +int ZEXPORT inflateSync(strm) +z_streamp strm; +{ + unsigned len; /* number of bytes to look at or looked at */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state FAR *state; + + /* check parameters */ + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + in = strm->total_in; out = strm->total_out; + inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->mode = TYPE; + return Z_OK; +} + +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +int ZEXPORT inflateSyncPoint(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; +} + +int ZEXPORT inflateCopy(dest, source) +z_streamp dest; +z_streamp source; +{ + struct inflate_state FAR *state; + struct inflate_state FAR *copy; + unsigned char FAR *window; + unsigned wsize; + + /* check input */ + if (inflateStateCheck(source) || dest == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)source->state; + + /* allocate space */ + copy = (struct inflate_state FAR *) + ZALLOC(source, 1, sizeof(struct inflate_state)); + if (copy == Z_NULL) return Z_MEM_ERROR; + window = Z_NULL; + if (state->window != Z_NULL) { + window = (unsigned char FAR *) + ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); + if (window == Z_NULL) { + ZFREE(source, copy); + return Z_MEM_ERROR; + } + } + + /* copy state */ + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); + copy->strm = dest; + if (state->lencode >= state->codes && + state->lencode <= state->codes + ENOUGH - 1) { + copy->lencode = copy->codes + (state->lencode - state->codes); + copy->distcode = copy->codes + (state->distcode - state->codes); + } + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) { + wsize = 1U << state->wbits; + zmemcpy(window, state->window, wsize); + } + copy->window = window; + dest->state = (struct internal_state FAR *)copy; + return Z_OK; +} + +int ZEXPORT inflateUndermine(strm, subvert) +z_streamp strm; +int subvert; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + state->sane = !subvert; + return Z_OK; +#else + (void)subvert; + state->sane = 1; + return Z_DATA_ERROR; +#endif +} + +int ZEXPORT inflateValidate(strm, check) +z_streamp strm; +int check; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (check) + state->wrap |= 4; + else + state->wrap &= ~4; + return Z_OK; +} + +long ZEXPORT inflateMark(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) + return -(1L << 16); + state = (struct inflate_state FAR *)strm->state; + return (long)(((unsigned long)((long)state->back)) << 16) + + (state->mode == COPY ? state->length : + (state->mode == MATCH ? state->was - state->length : 0)); +} + +unsigned long ZEXPORT inflateCodesUsed(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (inflateStateCheck(strm)) return (unsigned long)-1; + state = (struct inflate_state FAR *)strm->state; + return (unsigned long)(state->next - state->codes); +} diff --git a/externe_kniznice/zlib/inflate.h b/externe_kniznice/zlib/inflate.h new file mode 100644 index 0000000..a46cce6 --- /dev/null +++ b/externe_kniznice/zlib/inflate.h @@ -0,0 +1,125 @@ +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer decoding by inflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip decoding + should be left enabled. */ +#ifndef NO_GZIP +# define GUNZIP +#endif + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD = 16180, /* i: waiting for magic header */ + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY_, /* i/o: same as COPY below, but only first time in */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN_, /* i: same as LEN below, but only first time in */ + LEN, /* i: waiting for length/lit/eob code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ + LENGTH, /* i: waiting for 32-bit length (gzip) */ + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to BAD or MEM on error -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) or (raw) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> + HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + (raw) -> TYPEDO + Read deflate blocks: + TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK + STORED -> COPY_ -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN_ + LEN_ -> LEN + Read deflate codes in fixed or dynamic block: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* State maintained between inflate() calls -- approximately 7K bytes, not + including the allocated sliding window, which is up to 32K bytes. */ +struct inflate_state { + z_streamp strm; /* pointer back to this zlib stream */ + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip, + bit 2 true to validate check value */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags (0 if zlib) */ + unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + gz_headerp head; /* where to save gzip header information */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ + int sane; /* if false, allow invalid distance too far */ + int back; /* bits back of last unprocessed length/lit */ + unsigned was; /* initial length of match */ +}; diff --git a/externe_kniznice/zlib/inftrees.c b/externe_kniznice/zlib/inftrees.c new file mode 100644 index 0000000..2ea08fc --- /dev/null +++ b/externe_kniznice/zlib/inftrees.c @@ -0,0 +1,304 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2017 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" + +#define MAXBITS 15 + +const char inflate_copyright[] = + " inflate 1.2.11 Copyright 1995-2017 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code here; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + unsigned match; /* use base and extra for symbol >= match */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 202}; + static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0}; + static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) { /* no symbols to code at all */ + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)1; + here.val = (unsigned short)0; + *(*table)++ = here; /* make a table to force an error */ + *(*table)++ = here; + *bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min < max; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftrees.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + match = 20; + break; + case LENS: + base = lbase; + extra = lext; + match = 257; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + match = 0; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + here.bits = (unsigned char)(len - drop); + if (work[sym] + 1U < match) { + here.op = (unsigned char)0; + here.val = work[sym]; + } + else if (work[sym] >= match) { + here.op = (unsigned char)(extra[work[sym] - match]); + here.val = base[work[sym] - match]; + } + else { + here.op = (unsigned char)(32 + 64); /* end of block */ + here.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + next[(huff >> drop) + fill] = here; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* fill in remaining table entry if code is incomplete (guaranteed to have + at most one remaining entry, since if the code is incomplete, the + maximum code length that was allowed to get this far is one bit) */ + if (huff != 0) { + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)(len - drop); + here.val = (unsigned short)0; + next[huff] = here; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/externe_kniznice/zlib/inftrees.h b/externe_kniznice/zlib/inftrees.h new file mode 100644 index 0000000..baa53a0 --- /dev/null +++ b/externe_kniznice/zlib/inftrees.h @@ -0,0 +1,62 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2005, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of the dynamic table. The maximum number of code structures is + 1444, which is the sum of 852 for literal/length codes and 592 for distance + codes. These values were found by exhaustive searches using the program + examples/enough.c found in the zlib distribtution. The arguments to that + program are the number of symbols, the initial root table size, and the + maximum bit length of a code. "enough 286 9 15" for literal/length codes + returns returns 852, and "enough 30 6 15" for distance codes returns 592. + The initial root table size (9 or 6) is found in the fifth argument of the + inflate_table() calls in inflate.c and infback.c. If the root table size is + changed, then these maximum sizes would be need to be recalculated and + updated. */ +#define ENOUGH_LENS 852 +#define ENOUGH_DISTS 592 +#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) + +/* Type of code to build for inflate_table() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/externe_kniznice/zlib/make_vms.com b/externe_kniznice/zlib/make_vms.com new file mode 100644 index 0000000..65e9d0c --- /dev/null +++ b/externe_kniznice/zlib/make_vms.com @@ -0,0 +1,867 @@ +$! make libz under VMS written by +$! Martin P.J. Zinser +$! +$! In case of problems with the install you might contact me at +$! zinser@zinser.no-ip.info(preferred) or +$! martin.zinser@eurexchange.com (work) +$! +$! Make procedure history for Zlib +$! +$!------------------------------------------------------------------------------ +$! Version history +$! 0.01 20060120 First version to receive a number +$! 0.02 20061008 Adapt to new Makefile.in +$! 0.03 20091224 Add support for large file check +$! 0.04 20100110 Add new gzclose, gzlib, gzread, gzwrite +$! 0.05 20100221 Exchange zlibdefs.h by zconf.h.in +$! 0.06 20120111 Fix missing amiss_err, update zconf_h.in, fix new exmples +$! subdir path, update module search in makefile.in +$! 0.07 20120115 Triggered by work done by Alexey Chupahin completly redesigned +$! shared image creation +$! 0.08 20120219 Make it work on VAX again, pre-load missing symbols to shared +$! image +$! 0.09 20120305 SMS. P1 sets builder ("MMK", "MMS", " " (built-in)). +$! "" -> automatic, preference: MMK, MMS, built-in. +$! +$ on error then goto err_exit +$! +$ true = 1 +$ false = 0 +$ tmpnam = "temp_" + f$getjpi("","pid") +$ tt = tmpnam + ".txt" +$ tc = tmpnam + ".c" +$ th = tmpnam + ".h" +$ define/nolog tconfig 'th' +$ its_decc = false +$ its_vaxc = false +$ its_gnuc = false +$ s_case = False +$! +$! Setup variables holding "config" information +$! +$ Make = "''p1'" +$ name = "Zlib" +$ version = "?.?.?" +$ v_string = "ZLIB_VERSION" +$ v_file = "zlib.h" +$ ccopt = "/include = []" +$ lopts = "" +$ dnsrl = "" +$ aconf_in_file = "zconf.h.in#zconf.h_in#zconf_h.in" +$ conf_check_string = "" +$ linkonly = false +$ optfile = name + ".opt" +$ mapfile = name + ".map" +$ libdefs = "" +$ vax = f$getsyi("HW_MODEL").lt.1024 +$ axp = f$getsyi("HW_MODEL").ge.1024 .and. f$getsyi("HW_MODEL").lt.4096 +$ ia64 = f$getsyi("HW_MODEL").ge.4096 +$! +$! 2012-03-05 SMS. +$! Why is this needed? And if it is needed, why not simply ".not. vax"? +$! +$!!! if axp .or. ia64 then set proc/parse=extended +$! +$ whoami = f$parse(f$environment("Procedure"),,,,"NO_CONCEAL") +$ mydef = F$parse(whoami,,,"DEVICE") +$ mydir = f$parse(whoami,,,"DIRECTORY") - "][" +$ myproc = f$parse(whoami,,,"Name") + f$parse(whoami,,,"type") +$! +$! Check for MMK/MMS +$! +$ if (Make .eqs. "") +$ then +$ If F$Search ("Sys$System:MMS.EXE") .nes. "" Then Make = "MMS" +$ If F$Type (MMK) .eqs. "STRING" Then Make = "MMK" +$ else +$ Make = f$edit( Make, "trim") +$ endif +$! +$ gosub find_version +$! +$ open/write topt tmp.opt +$ open/write optf 'optfile' +$! +$ gosub check_opts +$! +$! Look for the compiler used +$! +$ gosub check_compiler +$ close topt +$ close optf +$! +$ if its_decc +$ then +$ ccopt = "/prefix=all" + ccopt +$ if f$trnlnm("SYS") .eqs. "" +$ then +$ if axp +$ then +$ define sys sys$library: +$ else +$ ccopt = "/decc" + ccopt +$ define sys decc$library_include: +$ endif +$ endif +$! +$! 2012-03-05 SMS. +$! Why /NAMES = AS_IS? Why not simply ".not. vax"? And why not on VAX? +$! +$ if axp .or. ia64 +$ then +$ ccopt = ccopt + "/name=as_is/opt=(inline=speed)" +$ s_case = true +$ endif +$ endif +$ if its_vaxc .or. its_gnuc +$ then +$ if f$trnlnm("SYS").eqs."" then define sys sys$library: +$ endif +$! +$! Build a fake configure input header +$! +$ open/write conf_hin config.hin +$ write conf_hin "#undef _LARGEFILE64_SOURCE" +$ close conf_hin +$! +$! +$ i = 0 +$FIND_ACONF: +$ fname = f$element(i,"#",aconf_in_file) +$ if fname .eqs. "#" then goto AMISS_ERR +$ if f$search(fname) .eqs. "" +$ then +$ i = i + 1 +$ goto find_aconf +$ endif +$ open/read/err=aconf_err aconf_in 'fname' +$ open/write aconf zconf.h +$ACONF_LOOP: +$ read/end_of_file=aconf_exit aconf_in line +$ work = f$edit(line, "compress,trim") +$ if f$extract(0,6,work) .nes. "#undef" +$ then +$ if f$extract(0,12,work) .nes. "#cmakedefine" +$ then +$ write aconf line +$ endif +$ else +$ cdef = f$element(1," ",work) +$ gosub check_config +$ endif +$ goto aconf_loop +$ACONF_EXIT: +$ write aconf "" +$ write aconf "/* VMS specifics added by make_vms.com: */" +$ write aconf "#define VMS 1" +$ write aconf "#include " +$ write aconf "#include " +$ write aconf "#ifdef _LARGEFILE" +$ write aconf "# define off64_t __off64_t" +$ write aconf "# define fopen64 fopen" +$ write aconf "# define fseeko64 fseeko" +$ write aconf "# define lseek64 lseek" +$ write aconf "# define ftello64 ftell" +$ write aconf "#endif" +$ write aconf "#if !defined( __VAX) && (__CRTL_VER >= 70312000)" +$ write aconf "# define HAVE_VSNPRINTF" +$ write aconf "#endif" +$ close aconf_in +$ close aconf +$ if f$search("''th'") .nes. "" then delete 'th';* +$! Build the thing plain or with mms +$! +$ write sys$output "Compiling Zlib sources ..." +$ if make.eqs."" +$ then +$ if (f$search( "example.obj;*") .nes. "") then delete example.obj;* +$ if (f$search( "minigzip.obj;*") .nes. "") then delete minigzip.obj;* +$ CALL MAKE adler32.OBJ "CC ''CCOPT' adler32" - + adler32.c zlib.h zconf.h +$ CALL MAKE compress.OBJ "CC ''CCOPT' compress" - + compress.c zlib.h zconf.h +$ CALL MAKE crc32.OBJ "CC ''CCOPT' crc32" - + crc32.c zlib.h zconf.h +$ CALL MAKE deflate.OBJ "CC ''CCOPT' deflate" - + deflate.c deflate.h zutil.h zlib.h zconf.h +$ CALL MAKE gzclose.OBJ "CC ''CCOPT' gzclose" - + gzclose.c zutil.h zlib.h zconf.h +$ CALL MAKE gzlib.OBJ "CC ''CCOPT' gzlib" - + gzlib.c zutil.h zlib.h zconf.h +$ CALL MAKE gzread.OBJ "CC ''CCOPT' gzread" - + gzread.c zutil.h zlib.h zconf.h +$ CALL MAKE gzwrite.OBJ "CC ''CCOPT' gzwrite" - + gzwrite.c zutil.h zlib.h zconf.h +$ CALL MAKE infback.OBJ "CC ''CCOPT' infback" - + infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h +$ CALL MAKE inffast.OBJ "CC ''CCOPT' inffast" - + inffast.c zutil.h zlib.h zconf.h inffast.h +$ CALL MAKE inflate.OBJ "CC ''CCOPT' inflate" - + inflate.c zutil.h zlib.h zconf.h infblock.h +$ CALL MAKE inftrees.OBJ "CC ''CCOPT' inftrees" - + inftrees.c zutil.h zlib.h zconf.h inftrees.h +$ CALL MAKE trees.OBJ "CC ''CCOPT' trees" - + trees.c deflate.h zutil.h zlib.h zconf.h +$ CALL MAKE uncompr.OBJ "CC ''CCOPT' uncompr" - + uncompr.c zlib.h zconf.h +$ CALL MAKE zutil.OBJ "CC ''CCOPT' zutil" - + zutil.c zutil.h zlib.h zconf.h +$ write sys$output "Building Zlib ..." +$ CALL MAKE libz.OLB "lib/crea libz.olb *.obj" *.OBJ +$ write sys$output "Building example..." +$ CALL MAKE example.OBJ "CC ''CCOPT' [.test]example" - + [.test]example.c zlib.h zconf.h +$ call make example.exe "LINK example,libz.olb/lib" example.obj libz.olb +$ write sys$output "Building minigzip..." +$ CALL MAKE minigzip.OBJ "CC ''CCOPT' [.test]minigzip" - + [.test]minigzip.c zlib.h zconf.h +$ call make minigzip.exe - + "LINK minigzip,libz.olb/lib" - + minigzip.obj libz.olb +$ else +$ gosub crea_mms +$ write sys$output "Make ''name' ''version' with ''Make' " +$ 'make' +$ endif +$! +$! Create shareable image +$! +$ gosub crea_olist +$ write sys$output "Creating libzshr.exe" +$ call map_2_shopt 'mapfile' 'optfile' +$ LINK_'lopts'/SHARE=libzshr.exe modules.opt/opt,'optfile'/opt +$ write sys$output "Zlib build completed" +$ delete/nolog tmp.opt;* +$ exit +$AMISS_ERR: +$ write sys$output "No source for config.hin found." +$ write sys$output "Tried any of ''aconf_in_file'" +$ goto err_exit +$CC_ERR: +$ write sys$output "C compiler required to build ''name'" +$ goto err_exit +$ERR_EXIT: +$ set message/facil/ident/sever/text +$ close/nolog optf +$ close/nolog topt +$ close/nolog aconf_in +$ close/nolog aconf +$ close/nolog out +$ close/nolog min +$ close/nolog mod +$ close/nolog h_in +$ write sys$output "Exiting..." +$ exit 2 +$! +$! +$MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES +$ V = 'F$Verify(0) +$! P1 = What we are trying to make +$! P2 = Command to make it +$! P3 - P8 What it depends on +$ +$ If F$Search(P1) .Eqs. "" Then Goto Makeit +$ Time = F$CvTime(F$File(P1,"RDT")) +$arg=3 +$Loop: +$ Argument = P'arg +$ If Argument .Eqs. "" Then Goto Exit +$ El=0 +$Loop2: +$ File = F$Element(El," ",Argument) +$ If File .Eqs. " " Then Goto Endl +$ AFile = "" +$Loop3: +$ OFile = AFile +$ AFile = F$Search(File) +$ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl +$ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit +$ Goto Loop3 +$NextEL: +$ El = El + 1 +$ Goto Loop2 +$EndL: +$ arg=arg+1 +$ If arg .Le. 8 Then Goto Loop +$ Goto Exit +$ +$Makeit: +$ VV=F$VERIFY(0) +$ write sys$output P2 +$ 'P2 +$ VV='F$Verify(VV) +$Exit: +$ If V Then Set Verify +$ENDSUBROUTINE +$!------------------------------------------------------------------------------ +$! +$! Check command line options and set symbols accordingly +$! +$!------------------------------------------------------------------------------ +$! Version history +$! 0.01 20041206 First version to receive a number +$! 0.02 20060126 Add new "HELP" target +$ CHECK_OPTS: +$ i = 1 +$ OPT_LOOP: +$ if i .lt. 9 +$ then +$ cparm = f$edit(p'i',"upcase") +$! +$! Check if parameter actually contains something +$! +$ if f$edit(cparm,"trim") .nes. "" +$ then +$ if cparm .eqs. "DEBUG" +$ then +$ ccopt = ccopt + "/noopt/deb" +$ lopts = lopts + "/deb" +$ endif +$ if f$locate("CCOPT=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ ccopt = ccopt + f$extract(start,len,cparm) +$ if f$locate("AS_IS",f$edit(ccopt,"UPCASE")) .lt. f$length(ccopt) - + then s_case = true +$ endif +$ if cparm .eqs. "LINK" then linkonly = true +$ if f$locate("LOPTS=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ lopts = lopts + f$extract(start,len,cparm) +$ endif +$ if f$locate("CC=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ cc_com = f$extract(start,len,cparm) + if (cc_com .nes. "DECC") .and. - + (cc_com .nes. "VAXC") .and. - + (cc_com .nes. "GNUC") +$ then +$ write sys$output "Unsupported compiler choice ''cc_com' ignored" +$ write sys$output "Use DECC, VAXC, or GNUC instead" +$ else +$ if cc_com .eqs. "DECC" then its_decc = true +$ if cc_com .eqs. "VAXC" then its_vaxc = true +$ if cc_com .eqs. "GNUC" then its_gnuc = true +$ endif +$ endif +$ if f$locate("MAKE=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ mmks = f$extract(start,len,cparm) +$ if (mmks .eqs. "MMK") .or. (mmks .eqs. "MMS") +$ then +$ make = mmks +$ else +$ write sys$output "Unsupported make choice ''mmks' ignored" +$ write sys$output "Use MMK or MMS instead" +$ endif +$ endif +$ if cparm .eqs. "HELP" then gosub bhelp +$ endif +$ i = i + 1 +$ goto opt_loop +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Look for the compiler used +$! +$! Version history +$! 0.01 20040223 First version to receive a number +$! 0.02 20040229 Save/set value of decc$no_rooted_search_lists +$! 0.03 20060202 Extend handling of GNU C +$! 0.04 20090402 Compaq -> hp +$CHECK_COMPILER: +$ if (.not. (its_decc .or. its_vaxc .or. its_gnuc)) +$ then +$ its_decc = (f$search("SYS$SYSTEM:DECC$COMPILER.EXE") .nes. "") +$ its_vaxc = .not. its_decc .and. (F$Search("SYS$System:VAXC.Exe") .nes. "") +$ its_gnuc = .not. (its_decc .or. its_vaxc) .and. (f$trnlnm("gnu_cc") .nes. "") +$ endif +$! +$! Exit if no compiler available +$! +$ if (.not. (its_decc .or. its_vaxc .or. its_gnuc)) +$ then goto CC_ERR +$ else +$ if its_decc +$ then +$ write sys$output "CC compiler check ... hp C" +$ if f$trnlnm("decc$no_rooted_search_lists") .nes. "" +$ then +$ dnrsl = f$trnlnm("decc$no_rooted_search_lists") +$ endif +$ define/nolog decc$no_rooted_search_lists 1 +$ else +$ if its_vaxc then write sys$output "CC compiler check ... VAX C" +$ if its_gnuc +$ then +$ write sys$output "CC compiler check ... GNU C" +$ if f$trnlnm(topt) then write topt "gnu_cc:[000000]gcclib.olb/lib" +$ if f$trnlnm(optf) then write optf "gnu_cc:[000000]gcclib.olb/lib" +$ cc = "gcc" +$ endif +$ if f$trnlnm(topt) then write topt "sys$share:vaxcrtl.exe/share" +$ if f$trnlnm(optf) then write optf "sys$share:vaxcrtl.exe/share" +$ endif +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! If MMS/MMK are available dump out the descrip.mms if required +$! +$CREA_MMS: +$ write sys$output "Creating descrip.mms..." +$ create descrip.mms +$ open/append out descrip.mms +$ copy sys$input: out +$ deck +# descrip.mms: MMS description file for building zlib on VMS +# written by Martin P.J. Zinser +# + +OBJS = adler32.obj, compress.obj, crc32.obj, gzclose.obj, gzlib.obj\ + gzread.obj, gzwrite.obj, uncompr.obj, infback.obj\ + deflate.obj, trees.obj, zutil.obj, inflate.obj, \ + inftrees.obj, inffast.obj + +$ eod +$ write out "CFLAGS=", ccopt +$ write out "LOPTS=", lopts +$ write out "all : example.exe minigzip.exe libz.olb" +$ copy sys$input: out +$ deck + @ write sys$output " Example applications available" + +libz.olb : libz.olb($(OBJS)) + @ write sys$output " libz available" + +example.exe : example.obj libz.olb + link $(LOPTS) example,libz.olb/lib + +minigzip.exe : minigzip.obj libz.olb + link $(LOPTS) minigzip,libz.olb/lib + +clean : + delete *.obj;*,libz.olb;*,*.opt;*,*.exe;* + + +# Other dependencies. +adler32.obj : adler32.c zutil.h zlib.h zconf.h +compress.obj : compress.c zlib.h zconf.h +crc32.obj : crc32.c zutil.h zlib.h zconf.h +deflate.obj : deflate.c deflate.h zutil.h zlib.h zconf.h +example.obj : [.test]example.c zlib.h zconf.h +gzclose.obj : gzclose.c zutil.h zlib.h zconf.h +gzlib.obj : gzlib.c zutil.h zlib.h zconf.h +gzread.obj : gzread.c zutil.h zlib.h zconf.h +gzwrite.obj : gzwrite.c zutil.h zlib.h zconf.h +inffast.obj : inffast.c zutil.h zlib.h zconf.h inftrees.h inffast.h +inflate.obj : inflate.c zutil.h zlib.h zconf.h +inftrees.obj : inftrees.c zutil.h zlib.h zconf.h inftrees.h +minigzip.obj : [.test]minigzip.c zlib.h zconf.h +trees.obj : trees.c deflate.h zutil.h zlib.h zconf.h +uncompr.obj : uncompr.c zlib.h zconf.h +zutil.obj : zutil.c zutil.h zlib.h zconf.h +infback.obj : infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h +$ eod +$ close out +$ return +$!------------------------------------------------------------------------------ +$! +$! Read list of core library sources from makefile.in and create options +$! needed to build shareable image +$! +$CREA_OLIST: +$ open/read min makefile.in +$ open/write mod modules.opt +$ src_check_list = "OBJZ =#OBJG =" +$MRLOOP: +$ read/end=mrdone min rec +$ i = 0 +$SRC_CHECK_LOOP: +$ src_check = f$element(i, "#", src_check_list) +$ i = i+1 +$ if src_check .eqs. "#" then goto mrloop +$ if (f$extract(0,6,rec) .nes. src_check) then goto src_check_loop +$ rec = rec - src_check +$ gosub extra_filnam +$ if (f$element(1,"\",rec) .eqs. "\") then goto mrloop +$MRSLOOP: +$ read/end=mrdone min rec +$ gosub extra_filnam +$ if (f$element(1,"\",rec) .nes. "\") then goto mrsloop +$MRDONE: +$ close min +$ close mod +$ return +$!------------------------------------------------------------------------------ +$! +$! Take record extracted in crea_olist and split it into single filenames +$! +$EXTRA_FILNAM: +$ myrec = f$edit(rec - "\", "trim,compress") +$ i = 0 +$FELOOP: +$ srcfil = f$element(i," ", myrec) +$ if (srcfil .nes. " ") +$ then +$ write mod f$parse(srcfil,,,"NAME"), ".obj" +$ i = i + 1 +$ goto feloop +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Find current Zlib version number +$! +$FIND_VERSION: +$ open/read h_in 'v_file' +$hloop: +$ read/end=hdone h_in rec +$ rec = f$edit(rec,"TRIM") +$ if (f$extract(0,1,rec) .nes. "#") then goto hloop +$ rec = f$edit(rec - "#", "TRIM") +$ if f$element(0," ",rec) .nes. "define" then goto hloop +$ if f$element(1," ",rec) .eqs. v_string +$ then +$ version = 'f$element(2," ",rec)' +$ goto hdone +$ endif +$ goto hloop +$hdone: +$ close h_in +$ return +$!------------------------------------------------------------------------------ +$! +$CHECK_CONFIG: +$! +$ in_ldef = f$locate(cdef,libdefs) +$ if (in_ldef .lt. f$length(libdefs)) +$ then +$ write aconf "#define ''cdef' 1" +$ libdefs = f$extract(0,in_ldef,libdefs) + - + f$extract(in_ldef + f$length(cdef) + 1, - + f$length(libdefs) - in_ldef - f$length(cdef) - 1, - + libdefs) +$ else +$ if (f$type('cdef') .eqs. "INTEGER") +$ then +$ write aconf "#define ''cdef' ", 'cdef' +$ else +$ if (f$type('cdef') .eqs. "STRING") +$ then +$ write aconf "#define ''cdef' ", """", '''cdef'', """" +$ else +$ gosub check_cc_def +$ endif +$ endif +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Check if this is a define relating to the properties of the C/C++ +$! compiler +$! +$ CHECK_CC_DEF: +$ if (cdef .eqs. "_LARGEFILE64_SOURCE") +$ then +$ copy sys$input: 'tc' +$ deck +#include "tconfig" +#define _LARGEFILE +#include + +int main(){ +FILE *fp; + fp = fopen("temp.txt","r"); + fseeko(fp,1,SEEK_SET); + fclose(fp); +} + +$ eod +$ test_inv = false +$ comm_h = false +$ gosub cc_prop_check +$ return +$ endif +$ write aconf "/* ", line, " */" +$ return +$!------------------------------------------------------------------------------ +$! +$! Check for properties of C/C++ compiler +$! +$! Version history +$! 0.01 20031020 First version to receive a number +$! 0.02 20031022 Added logic for defines with value +$! 0.03 20040309 Make sure local config file gets not deleted +$! 0.04 20041230 Also write include for configure run +$! 0.05 20050103 Add processing of "comment defines" +$CC_PROP_CHECK: +$ cc_prop = true +$ is_need = false +$ is_need = (f$extract(0,4,cdef) .eqs. "NEED") .or. (test_inv .eq. true) +$ if f$search(th) .eqs. "" then create 'th' +$ set message/nofac/noident/nosever/notext +$ on error then continue +$ cc 'tmpnam' +$ if .not. ($status) then cc_prop = false +$ on error then continue +$! The headers might lie about the capabilities of the RTL +$ link 'tmpnam',tmp.opt/opt +$ if .not. ($status) then cc_prop = false +$ set message/fac/ident/sever/text +$ on error then goto err_exit +$ delete/nolog 'tmpnam'.*;*/exclude='th' +$ if (cc_prop .and. .not. is_need) .or. - + (.not. cc_prop .and. is_need) +$ then +$ write sys$output "Checking for ''cdef'... yes" +$ if f$type('cdef_val'_yes) .nes. "" +$ then +$ if f$type('cdef_val'_yes) .eqs. "INTEGER" - + then call write_config f$fao("#define !AS !UL",cdef,'cdef_val'_yes) +$ if f$type('cdef_val'_yes) .eqs. "STRING" - + then call write_config f$fao("#define !AS !AS",cdef,'cdef_val'_yes) +$ else +$ call write_config f$fao("#define !AS 1",cdef) +$ endif +$ if (cdef .eqs. "HAVE_FSEEKO") .or. (cdef .eqs. "_LARGE_FILES") .or. - + (cdef .eqs. "_LARGEFILE64_SOURCE") then - + call write_config f$string("#define _LARGEFILE 1") +$ else +$ write sys$output "Checking for ''cdef'... no" +$ if (comm_h) +$ then + call write_config f$fao("/* !AS */",line) +$ else +$ if f$type('cdef_val'_no) .nes. "" +$ then +$ if f$type('cdef_val'_no) .eqs. "INTEGER" - + then call write_config f$fao("#define !AS !UL",cdef,'cdef_val'_no) +$ if f$type('cdef_val'_no) .eqs. "STRING" - + then call write_config f$fao("#define !AS !AS",cdef,'cdef_val'_no) +$ else +$ call write_config f$fao("#undef !AS",cdef) +$ endif +$ endif +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Check for properties of C/C++ compiler with multiple result values +$! +$! Version history +$! 0.01 20040127 First version +$! 0.02 20050103 Reconcile changes from cc_prop up to version 0.05 +$CC_MPROP_CHECK: +$ cc_prop = true +$ i = 1 +$ idel = 1 +$ MT_LOOP: +$ if f$type(result_'i') .eqs. "STRING" +$ then +$ set message/nofac/noident/nosever/notext +$ on error then continue +$ cc 'tmpnam'_'i' +$ if .not. ($status) then cc_prop = false +$ on error then continue +$! The headers might lie about the capabilities of the RTL +$ link 'tmpnam'_'i',tmp.opt/opt +$ if .not. ($status) then cc_prop = false +$ set message/fac/ident/sever/text +$ on error then goto err_exit +$ delete/nolog 'tmpnam'_'i'.*;* +$ if (cc_prop) +$ then +$ write sys$output "Checking for ''cdef'... ", mdef_'i' +$ if f$type(mdef_'i') .eqs. "INTEGER" - + then call write_config f$fao("#define !AS !UL",cdef,mdef_'i') +$ if f$type('cdef_val'_yes) .eqs. "STRING" - + then call write_config f$fao("#define !AS !AS",cdef,mdef_'i') +$ goto msym_clean +$ else +$ i = i + 1 +$ goto mt_loop +$ endif +$ endif +$ write sys$output "Checking for ''cdef'... no" +$ call write_config f$fao("#undef !AS",cdef) +$ MSYM_CLEAN: +$ if (idel .le. msym_max) +$ then +$ delete/sym mdef_'idel' +$ idel = idel + 1 +$ goto msym_clean +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Write configuration to both permanent and temporary config file +$! +$! Version history +$! 0.01 20031029 First version to receive a number +$! +$WRITE_CONFIG: SUBROUTINE +$ write aconf 'p1' +$ open/append confh 'th' +$ write confh 'p1' +$ close confh +$ENDSUBROUTINE +$!------------------------------------------------------------------------------ +$! +$! Analyze the project map file and create the symbol vector for a shareable +$! image from it +$! +$! Version history +$! 0.01 20120128 First version +$! 0.02 20120226 Add pre-load logic +$! +$ MAP_2_SHOPT: Subroutine +$! +$ SAY := "WRITE_ SYS$OUTPUT" +$! +$ IF F$SEARCH("''P1'") .EQS. "" +$ THEN +$ SAY "MAP_2_SHOPT-E-NOSUCHFILE: Error, inputfile ''p1' not available" +$ goto exit_m2s +$ ENDIF +$ IF "''P2'" .EQS. "" +$ THEN +$ SAY "MAP_2_SHOPT: Error, no output file provided" +$ goto exit_m2s +$ ENDIF +$! +$ module1 = "deflate#deflateEnd#deflateInit_#deflateParams#deflateSetDictionary" +$ module2 = "gzclose#gzerror#gzgetc#gzgets#gzopen#gzprintf#gzputc#gzputs#gzread" +$ module3 = "gzseek#gztell#inflate#inflateEnd#inflateInit_#inflateSetDictionary" +$ module4 = "inflateSync#uncompress#zlibVersion#compress" +$ open/read map 'p1 +$ if axp .or. ia64 +$ then +$ open/write aopt a.opt +$ open/write bopt b.opt +$ write aopt " CASE_SENSITIVE=YES" +$ write bopt "SYMBOL_VECTOR= (-" +$ mod_sym_num = 1 +$ MOD_SYM_LOOP: +$ if f$type(module'mod_sym_num') .nes. "" +$ then +$ mod_in = 0 +$ MOD_SYM_IN: +$ shared_proc = f$element(mod_in, "#", module'mod_sym_num') +$ if shared_proc .nes. "#" +$ then +$ write aopt f$fao(" symbol_vector=(!AS/!AS=PROCEDURE)",- + f$edit(shared_proc,"upcase"),shared_proc) +$ write bopt f$fao("!AS=PROCEDURE,-",shared_proc) +$ mod_in = mod_in + 1 +$ goto mod_sym_in +$ endif +$ mod_sym_num = mod_sym_num + 1 +$ goto mod_sym_loop +$ endif +$MAP_LOOP: +$ read/end=map_end map line +$ if (f$locate("{",line).lt. f$length(line)) .or. - + (f$locate("global:", line) .lt. f$length(line)) +$ then +$ proc = true +$ goto map_loop +$ endif +$ if f$locate("}",line).lt. f$length(line) then proc = false +$ if f$locate("local:", line) .lt. f$length(line) then proc = false +$ if proc +$ then +$ shared_proc = f$edit(line,"collapse") +$ chop_semi = f$locate(";", shared_proc) +$ if chop_semi .lt. f$length(shared_proc) then - + shared_proc = f$extract(0, chop_semi, shared_proc) +$ write aopt f$fao(" symbol_vector=(!AS/!AS=PROCEDURE)",- + f$edit(shared_proc,"upcase"),shared_proc) +$ write bopt f$fao("!AS=PROCEDURE,-",shared_proc) +$ endif +$ goto map_loop +$MAP_END: +$ close/nolog aopt +$ close/nolog bopt +$ open/append libopt 'p2' +$ open/read aopt a.opt +$ open/read bopt b.opt +$ALOOP: +$ read/end=aloop_end aopt line +$ write libopt line +$ goto aloop +$ALOOP_END: +$ close/nolog aopt +$ sv = "" +$BLOOP: +$ read/end=bloop_end bopt svn +$ if (svn.nes."") +$ then +$ if (sv.nes."") then write libopt sv +$ sv = svn +$ endif +$ goto bloop +$BLOOP_END: +$ write libopt f$extract(0,f$length(sv)-2,sv), "-" +$ write libopt ")" +$ close/nolog bopt +$ delete/nolog/noconf a.opt;*,b.opt;* +$ else +$ if vax +$ then +$ open/append libopt 'p2' +$ mod_sym_num = 1 +$ VMOD_SYM_LOOP: +$ if f$type(module'mod_sym_num') .nes. "" +$ then +$ mod_in = 0 +$ VMOD_SYM_IN: +$ shared_proc = f$element(mod_in, "#", module'mod_sym_num') +$ if shared_proc .nes. "#" +$ then +$ write libopt f$fao("UNIVERSAL=!AS",- + f$edit(shared_proc,"upcase")) +$ mod_in = mod_in + 1 +$ goto vmod_sym_in +$ endif +$ mod_sym_num = mod_sym_num + 1 +$ goto vmod_sym_loop +$ endif +$VMAP_LOOP: +$ read/end=vmap_end map line +$ if (f$locate("{",line).lt. f$length(line)) .or. - + (f$locate("global:", line) .lt. f$length(line)) +$ then +$ proc = true +$ goto vmap_loop +$ endif +$ if f$locate("}",line).lt. f$length(line) then proc = false +$ if f$locate("local:", line) .lt. f$length(line) then proc = false +$ if proc +$ then +$ shared_proc = f$edit(line,"collapse") +$ chop_semi = f$locate(";", shared_proc) +$ if chop_semi .lt. f$length(shared_proc) then - + shared_proc = f$extract(0, chop_semi, shared_proc) +$ write libopt f$fao("UNIVERSAL=!AS",- + f$edit(shared_proc,"upcase")) +$ endif +$ goto vmap_loop +$VMAP_END: +$ else +$ write sys$output "Unknown Architecture (Not VAX, AXP, or IA64)" +$ write sys$output "No options file created" +$ endif +$ endif +$ EXIT_M2S: +$ close/nolog map +$ close/nolog libopt +$ endsubroutine diff --git a/externe_kniznice/zlib/msdos/Makefile.bor b/externe_kniznice/zlib/msdos/Makefile.bor new file mode 100644 index 0000000..3d12a2c --- /dev/null +++ b/externe_kniznice/zlib/msdos/Makefile.bor @@ -0,0 +1,115 @@ +# Makefile for zlib +# Borland C++ +# Last updated: 15-Mar-2003 + +# To use, do "make -fmakefile.bor" +# To compile in small model, set below: MODEL=s + +# WARNING: the small model is supported but only for small values of +# MAX_WBITS and MAX_MEM_LEVEL. For example: +# -DMAX_WBITS=11 -DDEF_WBITS=11 -DMAX_MEM_LEVEL=3 +# If you wish to reduce the memory requirements (default 256K for big +# objects plus a few K), you can add to the LOC macro below: +# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14 +# See zconf.h for details about the memory requirements. + +# ------------ Turbo C++, Borland C++ ------------ + +# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7) +# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or added +# to the declaration of LOC here: +LOC = $(LOCAL_ZLIB) + +# type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc. +CPU_TYP = 0 + +# memory model: one of s, m, c, l (small, medium, compact, large) +MODEL=l + +# replace bcc with tcc for Turbo C++ 1.0, with bcc32 for the 32 bit version +CC=bcc +LD=bcc +AR=tlib + +# compiler flags +# replace "-O2" by "-O -G -a -d" for Turbo C++ 1.0 +CFLAGS=-O2 -Z -m$(MODEL) $(LOC) + +LDFLAGS=-m$(MODEL) -f- + + +# variables +ZLIB_LIB = zlib_$(MODEL).lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj +OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: test/example.c zlib.h zconf.h + +minigzip.obj: test/minigzip.c zlib.h zconf.h + + +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +clean: + -del *.obj + -del *.lib + -del *.exe + -del zlib_*.bak + -del foo.gz diff --git a/externe_kniznice/zlib/msdos/Makefile.dj2 b/externe_kniznice/zlib/msdos/Makefile.dj2 new file mode 100644 index 0000000..59d2037 --- /dev/null +++ b/externe_kniznice/zlib/msdos/Makefile.dj2 @@ -0,0 +1,104 @@ +# Makefile for zlib. Modified for djgpp v2.0 by F. J. Donahoe, 3/15/96. +# Copyright (C) 1995-1998 Jean-loup Gailly. +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile, or to compile and test, type: +# +# make -fmakefile.dj2; make test -fmakefile.dj2 +# +# To install libz.a, zconf.h and zlib.h in the djgpp directories, type: +# +# make install -fmakefile.dj2 +# +# after first defining LIBRARY_PATH and INCLUDE_PATH in djgpp.env as +# in the sample below if the pattern of the DJGPP distribution is to +# be followed. Remember that, while 'es around <=> are ignored in +# makefiles, they are *not* in batch files or in djgpp.env. +# - - - - - +# [make] +# INCLUDE_PATH=%\>;INCLUDE_PATH%%\DJDIR%\include +# LIBRARY_PATH=%\>;LIBRARY_PATH%%\DJDIR%\lib +# BUTT=-m486 +# - - - - - +# Alternately, these variables may be defined below, overriding the values +# in djgpp.env, as +# INCLUDE_PATH=c:\usr\include +# LIBRARY_PATH=c:\usr\lib + +CC=gcc + +#CFLAGS=-MMD -O +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-MMD -g -DZLIB_DEBUG +CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ + -Wstrict-prototypes -Wmissing-prototypes + +# If cp.exe is available, replace "copy /Y" with "cp -fp" . +CP=copy /Y +# If gnu install.exe is available, replace $(CP) with ginstall. +INSTALL=$(CP) +# The default value of RM is "rm -f." If "rm.exe" is found, comment out: +RM=del +LDLIBS=-L. -lz +LD=$(CC) -s -o +LDSHARED=$(CC) + +INCL=zlib.h zconf.h +LIBS=libz.a + +AR=ar rcs + +prefix=/usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o gzclose.o gzlib.o gzread.o gzwrite.o \ + uncompr.o deflate.o trees.o zutil.o inflate.o infback.o inftrees.o inffast.o + +OBJA = +# to use the asm code: make OBJA=match.o + +TEST_OBJS = example.o minigzip.o + +all: example.exe minigzip.exe + +check: test +test: all + ./example + echo hello world | .\minigzip | .\minigzip -d + +%.o : %.c + $(CC) $(CFLAGS) -c $< -o $@ + +libz.a: $(OBJS) $(OBJA) + $(AR) $@ $(OBJS) $(OBJA) + +%.exe : %.o $(LIBS) + $(LD) $@ $< $(LDLIBS) + +# INCLUDE_PATH and LIBRARY_PATH were set for [make] in djgpp.env . + +.PHONY : uninstall clean + +install: $(INCL) $(LIBS) + -@if not exist $(INCLUDE_PATH)\nul mkdir $(INCLUDE_PATH) + -@if not exist $(LIBRARY_PATH)\nul mkdir $(LIBRARY_PATH) + $(INSTALL) zlib.h $(INCLUDE_PATH) + $(INSTALL) zconf.h $(INCLUDE_PATH) + $(INSTALL) libz.a $(LIBRARY_PATH) + +uninstall: + $(RM) $(INCLUDE_PATH)\zlib.h + $(RM) $(INCLUDE_PATH)\zconf.h + $(RM) $(LIBRARY_PATH)\libz.a + +clean: + $(RM) *.d + $(RM) *.o + $(RM) *.exe + $(RM) libz.a + $(RM) foo.gz + +DEPS := $(wildcard *.d) +ifneq ($(DEPS),) +include $(DEPS) +endif diff --git a/externe_kniznice/zlib/msdos/Makefile.emx b/externe_kniznice/zlib/msdos/Makefile.emx new file mode 100644 index 0000000..e30f67b --- /dev/null +++ b/externe_kniznice/zlib/msdos/Makefile.emx @@ -0,0 +1,69 @@ +# Makefile for zlib. Modified for emx 0.9c by Chr. Spieler, 6/17/98. +# Copyright (C) 1995-1998 Jean-loup Gailly. +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile, or to compile and test, type: +# +# make -fmakefile.emx; make test -fmakefile.emx +# + +CC=gcc + +#CFLAGS=-MMD -O +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-MMD -g -DZLIB_DEBUG +CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ + -Wstrict-prototypes -Wmissing-prototypes + +# If cp.exe is available, replace "copy /Y" with "cp -fp" . +CP=copy /Y +# If gnu install.exe is available, replace $(CP) with ginstall. +INSTALL=$(CP) +# The default value of RM is "rm -f." If "rm.exe" is found, comment out: +RM=del +LDLIBS=-L. -lzlib +LD=$(CC) -s -o +LDSHARED=$(CC) + +INCL=zlib.h zconf.h +LIBS=zlib.a + +AR=ar rcs + +prefix=/usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o gzclose.o gzlib.o gzread.o gzwrite.o \ + uncompr.o deflate.o trees.o zutil.o inflate.o infback.o inftrees.o inffast.o + +TEST_OBJS = example.o minigzip.o + +all: example.exe minigzip.exe + +test: all + ./example + echo hello world | .\minigzip | .\minigzip -d + +%.o : %.c + $(CC) $(CFLAGS) -c $< -o $@ + +zlib.a: $(OBJS) + $(AR) $@ $(OBJS) + +%.exe : %.o $(LIBS) + $(LD) $@ $< $(LDLIBS) + + +.PHONY : clean + +clean: + $(RM) *.d + $(RM) *.o + $(RM) *.exe + $(RM) zlib.a + $(RM) foo.gz + +DEPS := $(wildcard *.d) +ifneq ($(DEPS),) +include $(DEPS) +endif diff --git a/externe_kniznice/zlib/msdos/Makefile.msc b/externe_kniznice/zlib/msdos/Makefile.msc new file mode 100644 index 0000000..ae83786 --- /dev/null +++ b/externe_kniznice/zlib/msdos/Makefile.msc @@ -0,0 +1,112 @@ +# Makefile for zlib +# Microsoft C 5.1 or later +# Last updated: 19-Mar-2003 + +# To use, do "make makefile.msc" +# To compile in small model, set below: MODEL=S + +# If you wish to reduce the memory requirements (default 256K for big +# objects plus a few K), you can add to the LOC macro below: +# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14 +# See zconf.h for details about the memory requirements. + +# ------------- Microsoft C 5.1 and later ------------- + +# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7) +# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or added +# to the declaration of LOC here: +LOC = $(LOCAL_ZLIB) + +# Type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc. +CPU_TYP = 0 + +# Memory model: one of S, M, C, L (small, medium, compact, large) +MODEL=L + +CC=cl +CFLAGS=-nologo -A$(MODEL) -G$(CPU_TYP) -W3 -Oait -Gs $(LOC) +#-Ox generates bad code with MSC 5.1 +LIB_CFLAGS=-Zl $(CFLAGS) + +LD=link +LDFLAGS=/noi/e/st:0x1500/noe/farcall/packcode +# "/farcall/packcode" are only useful for `large code' memory models +# but should be a "no-op" for small code models. + + +# variables +ZLIB_LIB = zlib_$(MODEL).lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(LIB_CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: test/example.c zlib.h zconf.h + $(CC) -c $(CFLAGS) $*.c + +minigzip.obj: test/minigzip.c zlib.h zconf.h + $(CC) -c $(CFLAGS) $*.c + + +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + if exist $(ZLIB_LIB) del $(ZLIB_LIB) + lib $(ZLIB_LIB) $(OBJ1); + lib $(ZLIB_LIB) $(OBJ2); + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj,,,$(ZLIB_LIB); + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj,,,$(ZLIB_LIB); + +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +clean: + -del *.obj + -del *.lib + -del *.exe + -del *.map + -del zlib_*.bak + -del foo.gz diff --git a/externe_kniznice/zlib/msdos/Makefile.tc b/externe_kniznice/zlib/msdos/Makefile.tc new file mode 100644 index 0000000..5aec82a --- /dev/null +++ b/externe_kniznice/zlib/msdos/Makefile.tc @@ -0,0 +1,100 @@ +# Makefile for zlib +# Turbo C 2.01, Turbo C++ 1.01 +# Last updated: 15-Mar-2003 + +# To use, do "make -fmakefile.tc" +# To compile in small model, set below: MODEL=s + +# WARNING: the small model is supported but only for small values of +# MAX_WBITS and MAX_MEM_LEVEL. For example: +# -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3 +# If you wish to reduce the memory requirements (default 256K for big +# objects plus a few K), you can add to CFLAGS below: +# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14 +# See zconf.h for details about the memory requirements. + +# ------------ Turbo C 2.01, Turbo C++ 1.01 ------------ +MODEL=l +CC=tcc +LD=tcc +AR=tlib +# CFLAGS=-O2 -G -Z -m$(MODEL) -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3 +CFLAGS=-O2 -G -Z -m$(MODEL) +LDFLAGS=-m$(MODEL) -f- + + +# variables +ZLIB_LIB = zlib_$(MODEL).lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj +OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: test/example.c zlib.h zconf.h + +minigzip.obj: test/minigzip.c zlib.h zconf.h + + +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +clean: + -del *.obj + -del *.lib + -del *.exe + -del zlib_*.bak + -del foo.gz diff --git a/externe_kniznice/zlib/nintendods/Makefile b/externe_kniznice/zlib/nintendods/Makefile new file mode 100644 index 0000000..21337d0 --- /dev/null +++ b/externe_kniznice/zlib/nintendods/Makefile @@ -0,0 +1,126 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITARM)),) +$(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") +endif + +include $(DEVKITARM)/ds_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# DATA is a list of directories containing data files +# INCLUDES is a list of directories containing header files +#--------------------------------------------------------------------------------- +TARGET := $(shell basename $(CURDIR)) +BUILD := build +SOURCES := ../../ +DATA := data +INCLUDES := include + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -mthumb -mthumb-interwork + +CFLAGS := -Wall -O2\ + -march=armv5te -mtune=arm946e-s \ + -fomit-frame-pointer -ffast-math \ + $(ARCH) + +CFLAGS += $(INCLUDE) -DARM9 +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions + +ASFLAGS := $(ARCH) -march=armv5te -mtune=arm946e-s +LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(LIBNDS) + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/lib/libz.a + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#--------------------------------------------------------------------------------- + export LD := $(CC) +#--------------------------------------------------------------------------------- +else +#--------------------------------------------------------------------------------- + export LD := $(CXX) +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) + +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) + +.PHONY: $(BUILD) clean all + +#--------------------------------------------------------------------------------- +all: $(BUILD) + @[ -d $@ ] || mkdir -p include + @cp ../../*.h include + +lib: + @[ -d $@ ] || mkdir -p $@ + +$(BUILD): lib + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) lib + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT) : $(OFILES) + +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/externe_kniznice/zlib/nintendods/README b/externe_kniznice/zlib/nintendods/README new file mode 100644 index 0000000..ba7a37d --- /dev/null +++ b/externe_kniznice/zlib/nintendods/README @@ -0,0 +1,5 @@ +This Makefile requires devkitARM (http://www.devkitpro.org/category/devkitarm/) and works inside "contrib/nds". It is based on a devkitARM template. + +Eduardo Costa +January 3, 2009 + diff --git a/externe_kniznice/zlib/old/Makefile.emx b/externe_kniznice/zlib/old/Makefile.emx new file mode 100644 index 0000000..612b037 --- /dev/null +++ b/externe_kniznice/zlib/old/Makefile.emx @@ -0,0 +1,69 @@ +# Makefile for zlib. Modified for emx/rsxnt by Chr. Spieler, 6/16/98. +# Copyright (C) 1995-1998 Jean-loup Gailly. +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile, or to compile and test, type: +# +# make -fmakefile.emx; make test -fmakefile.emx +# + +CC=gcc -Zwin32 + +#CFLAGS=-MMD -O +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-MMD -g -DZLIB_DEBUG +CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ + -Wstrict-prototypes -Wmissing-prototypes + +# If cp.exe is available, replace "copy /Y" with "cp -fp" . +CP=copy /Y +# If gnu install.exe is available, replace $(CP) with ginstall. +INSTALL=$(CP) +# The default value of RM is "rm -f." If "rm.exe" is found, comment out: +RM=del +LDLIBS=-L. -lzlib +LD=$(CC) -s -o +LDSHARED=$(CC) + +INCL=zlib.h zconf.h +LIBS=zlib.a + +AR=ar rcs + +prefix=/usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o deflate.o gzclose.o gzlib.o gzread.o \ + gzwrite.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o + +TEST_OBJS = example.o minigzip.o + +all: example.exe minigzip.exe + +test: all + ./example + echo hello world | .\minigzip | .\minigzip -d + +%.o : %.c + $(CC) $(CFLAGS) -c $< -o $@ + +zlib.a: $(OBJS) + $(AR) $@ $(OBJS) + +%.exe : %.o $(LIBS) + $(LD) $@ $< $(LDLIBS) + + +.PHONY : clean + +clean: + $(RM) *.d + $(RM) *.o + $(RM) *.exe + $(RM) zlib.a + $(RM) foo.gz + +DEPS := $(wildcard *.d) +ifneq ($(DEPS),) +include $(DEPS) +endif diff --git a/externe_kniznice/zlib/old/Makefile.riscos b/externe_kniznice/zlib/old/Makefile.riscos new file mode 100644 index 0000000..57e29d3 --- /dev/null +++ b/externe_kniznice/zlib/old/Makefile.riscos @@ -0,0 +1,151 @@ +# Project: zlib_1_03 +# Patched for zlib 1.1.2 rw@shadow.org.uk 19980430 +# test works out-of-the-box, installs `somewhere' on demand + +# Toolflags: +CCflags = -c -depend !Depend -IC: -g -throwback -DRISCOS -fah +C++flags = -c -depend !Depend -IC: -throwback +Linkflags = -aif -c++ -o $@ +ObjAsmflags = -throwback -NoCache -depend !Depend +CMHGflags = +LibFileflags = -c -l -o $@ +Squeezeflags = -o $@ + +# change the line below to where _you_ want the library installed. +libdest = lib:zlib + +# Final targets: +@.lib: @.o.adler32 @.o.compress @.o.crc32 @.o.deflate @.o.gzio \ + @.o.infblock @.o.infcodes @.o.inffast @.o.inflate @.o.inftrees @.o.infutil @.o.trees \ + @.o.uncompr @.o.zutil + LibFile $(LibFileflags) @.o.adler32 @.o.compress @.o.crc32 @.o.deflate \ + @.o.gzio @.o.infblock @.o.infcodes @.o.inffast @.o.inflate @.o.inftrees @.o.infutil \ + @.o.trees @.o.uncompr @.o.zutil +test: @.minigzip @.example @.lib + @copy @.lib @.libc A~C~DF~L~N~P~Q~RS~TV + @echo running tests: hang on. + @/@.minigzip -f -9 libc + @/@.minigzip -d libc-gz + @/@.minigzip -f -1 libc + @/@.minigzip -d libc-gz + @/@.minigzip -h -9 libc + @/@.minigzip -d libc-gz + @/@.minigzip -h -1 libc + @/@.minigzip -d libc-gz + @/@.minigzip -9 libc + @/@.minigzip -d libc-gz + @/@.minigzip -1 libc + @/@.minigzip -d libc-gz + @diff @.lib @.libc + @echo that should have reported '@.lib and @.libc identical' if you have diff. + @/@.example @.fred @.fred + @echo that will have given lots of hello!'s. + +@.minigzip: @.o.minigzip @.lib C:o.Stubs + Link $(Linkflags) @.o.minigzip @.lib C:o.Stubs +@.example: @.o.example @.lib C:o.Stubs + Link $(Linkflags) @.o.example @.lib C:o.Stubs + +install: @.lib + cdir $(libdest) + cdir $(libdest).h + @copy @.h.zlib $(libdest).h.zlib A~C~DF~L~N~P~Q~RS~TV + @copy @.h.zconf $(libdest).h.zconf A~C~DF~L~N~P~Q~RS~TV + @copy @.lib $(libdest).lib A~C~DF~L~N~P~Q~RS~TV + @echo okay, installed zlib in $(libdest) + +clean:; remove @.minigzip + remove @.example + remove @.libc + -wipe @.o.* F~r~cV + remove @.fred + +# User-editable dependencies: +.c.o: + cc $(ccflags) -o $@ $< + +# Static dependencies: + +# Dynamic dependencies: +o.example: c.example +o.example: h.zlib +o.example: h.zconf +o.minigzip: c.minigzip +o.minigzip: h.zlib +o.minigzip: h.zconf +o.adler32: c.adler32 +o.adler32: h.zlib +o.adler32: h.zconf +o.compress: c.compress +o.compress: h.zlib +o.compress: h.zconf +o.crc32: c.crc32 +o.crc32: h.zlib +o.crc32: h.zconf +o.deflate: c.deflate +o.deflate: h.deflate +o.deflate: h.zutil +o.deflate: h.zlib +o.deflate: h.zconf +o.gzio: c.gzio +o.gzio: h.zutil +o.gzio: h.zlib +o.gzio: h.zconf +o.infblock: c.infblock +o.infblock: h.zutil +o.infblock: h.zlib +o.infblock: h.zconf +o.infblock: h.infblock +o.infblock: h.inftrees +o.infblock: h.infcodes +o.infblock: h.infutil +o.infcodes: c.infcodes +o.infcodes: h.zutil +o.infcodes: h.zlib +o.infcodes: h.zconf +o.infcodes: h.inftrees +o.infcodes: h.infblock +o.infcodes: h.infcodes +o.infcodes: h.infutil +o.infcodes: h.inffast +o.inffast: c.inffast +o.inffast: h.zutil +o.inffast: h.zlib +o.inffast: h.zconf +o.inffast: h.inftrees +o.inffast: h.infblock +o.inffast: h.infcodes +o.inffast: h.infutil +o.inffast: h.inffast +o.inflate: c.inflate +o.inflate: h.zutil +o.inflate: h.zlib +o.inflate: h.zconf +o.inflate: h.infblock +o.inftrees: c.inftrees +o.inftrees: h.zutil +o.inftrees: h.zlib +o.inftrees: h.zconf +o.inftrees: h.inftrees +o.inftrees: h.inffixed +o.infutil: c.infutil +o.infutil: h.zutil +o.infutil: h.zlib +o.infutil: h.zconf +o.infutil: h.infblock +o.infutil: h.inftrees +o.infutil: h.infcodes +o.infutil: h.infutil +o.trees: c.trees +o.trees: h.deflate +o.trees: h.zutil +o.trees: h.zlib +o.trees: h.zconf +o.trees: h.trees +o.uncompr: c.uncompr +o.uncompr: h.zlib +o.uncompr: h.zconf +o.zutil: c.zutil +o.zutil: h.zutil +o.zutil: h.zlib +o.zutil: h.zconf diff --git a/externe_kniznice/zlib/old/README b/externe_kniznice/zlib/old/README new file mode 100644 index 0000000..800bf07 --- /dev/null +++ b/externe_kniznice/zlib/old/README @@ -0,0 +1,3 @@ +This directory contains files that have not been updated for zlib 1.2.x + +(Volunteers are encouraged to help clean this up. Thanks.) diff --git a/externe_kniznice/zlib/old/descrip.mms b/externe_kniznice/zlib/old/descrip.mms new file mode 100644 index 0000000..7066da5 --- /dev/null +++ b/externe_kniznice/zlib/old/descrip.mms @@ -0,0 +1,48 @@ +# descrip.mms: MMS description file for building zlib on VMS +# written by Martin P.J. Zinser + +cc_defs = +c_deb = + +.ifdef __DECC__ +pref = /prefix=all +.endif + +OBJS = adler32.obj, compress.obj, crc32.obj, gzio.obj, uncompr.obj,\ + deflate.obj, trees.obj, zutil.obj, inflate.obj, infblock.obj,\ + inftrees.obj, infcodes.obj, infutil.obj, inffast.obj + +CFLAGS= $(C_DEB) $(CC_DEFS) $(PREF) + +all : example.exe minigzip.exe + @ write sys$output " Example applications available" +libz.olb : libz.olb($(OBJS)) + @ write sys$output " libz available" + +example.exe : example.obj libz.olb + link example,libz.olb/lib + +minigzip.exe : minigzip.obj libz.olb + link minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib + +clean : + delete *.obj;*,libz.olb;* + + +# Other dependencies. +adler32.obj : zutil.h zlib.h zconf.h +compress.obj : zlib.h zconf.h +crc32.obj : zutil.h zlib.h zconf.h +deflate.obj : deflate.h zutil.h zlib.h zconf.h +example.obj : zlib.h zconf.h +gzio.obj : zutil.h zlib.h zconf.h +infblock.obj : zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h +infcodes.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h inffast.h +inffast.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h +inflate.obj : zutil.h zlib.h zconf.h infblock.h +inftrees.obj : zutil.h zlib.h zconf.h inftrees.h +infutil.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h +minigzip.obj : zlib.h zconf.h +trees.obj : deflate.h zutil.h zlib.h zconf.h +uncompr.obj : zlib.h zconf.h +zutil.obj : zutil.h zlib.h zconf.h diff --git a/externe_kniznice/zlib/old/os2/Makefile.os2 b/externe_kniznice/zlib/old/os2/Makefile.os2 new file mode 100644 index 0000000..bb426c0 --- /dev/null +++ b/externe_kniznice/zlib/old/os2/Makefile.os2 @@ -0,0 +1,136 @@ +# Makefile for zlib under OS/2 using GCC (PGCC) +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile and test, type: +# cp Makefile.os2 .. +# cd .. +# make -f Makefile.os2 test + +# This makefile will build a static library z.lib, a shared library +# z.dll and a import library zdll.lib. You can use either z.lib or +# zdll.lib by specifying either -lz or -lzdll on gcc's command line + +CC=gcc -Zomf -s + +CFLAGS=-O6 -Wall +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-g -DZLIB_DEBUG +#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ +# -Wstrict-prototypes -Wmissing-prototypes + +#################### BUG WARNING: ##################### +## infcodes.c hits a bug in pgcc-1.0, so you have to use either +## -O# where # <= 4 or one of (-fno-ommit-frame-pointer or -fno-force-mem) +## This bug is reportedly fixed in pgcc >1.0, but this was not tested +CFLAGS+=-fno-force-mem + +LDFLAGS=-s -L. -lzdll -Zcrtdll +LDSHARED=$(CC) -s -Zomf -Zdll -Zcrtdll + +VER=1.1.0 +ZLIB=z.lib +SHAREDLIB=z.dll +SHAREDLIBIMP=zdll.lib +LIBS=$(ZLIB) $(SHAREDLIB) $(SHAREDLIBIMP) + +AR=emxomfar cr +IMPLIB=emximp +RANLIB=echo +TAR=tar +SHELL=bash + +prefix=/usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ + zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o + +TEST_OBJS = example.o minigzip.o + +DISTFILES = README INDEX ChangeLog configure Make*[a-z0-9] *.[ch] descrip.mms \ + algorithm.txt zlib.3 msdos/Make*[a-z0-9] msdos/zlib.def msdos/zlib.rc \ + nt/Makefile.nt nt/zlib.dnt contrib/README.contrib contrib/*.txt \ + contrib/asm386/*.asm contrib/asm386/*.c \ + contrib/asm386/*.bat contrib/asm386/zlibvc.d?? contrib/iostream/*.cpp \ + contrib/iostream/*.h contrib/iostream2/*.h contrib/iostream2/*.cpp \ + contrib/untgz/Makefile contrib/untgz/*.c contrib/untgz/*.w32 + +all: example.exe minigzip.exe + +test: all + @LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ + echo hello world | ./minigzip | ./minigzip -d || \ + echo ' *** minigzip test FAILED ***' ; \ + if ./example; then \ + echo ' *** zlib test OK ***'; \ + else \ + echo ' *** zlib test FAILED ***'; \ + fi + +$(ZLIB): $(OBJS) + $(AR) $@ $(OBJS) + -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 + +$(SHAREDLIB): $(OBJS) os2/z.def + $(LDSHARED) -o $@ $^ + +$(SHAREDLIBIMP): os2/z.def + $(IMPLIB) -o $@ $^ + +example.exe: example.o $(LIBS) + $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) + +minigzip.exe: minigzip.o $(LIBS) + $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) + +clean: + rm -f *.o *~ example minigzip libz.a libz.so* foo.gz + +distclean: clean + +zip: + mv Makefile Makefile~; cp -p Makefile.in Makefile + rm -f test.c ztest*.c + v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\ + zip -ul9 zlib$$v $(DISTFILES) + mv Makefile~ Makefile + +dist: + mv Makefile Makefile~; cp -p Makefile.in Makefile + rm -f test.c ztest*.c + d=zlib-`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\ + rm -f $$d.tar.gz; \ + if test ! -d ../$$d; then rm -f ../$$d; ln -s `pwd` ../$$d; fi; \ + files=""; \ + for f in $(DISTFILES); do files="$$files $$d/$$f"; done; \ + cd ..; \ + GZIP=-9 $(TAR) chofz $$d/$$d.tar.gz $$files; \ + if test ! -d $$d; then rm -f $$d; fi + mv Makefile~ Makefile + +tags: + etags *.[ch] + +depend: + makedepend -- $(CFLAGS) -- *.[ch] + +# DO NOT DELETE THIS LINE -- make depend depends on it. + +adler32.o: zlib.h zconf.h +compress.o: zlib.h zconf.h +crc32.o: zlib.h zconf.h +deflate.o: deflate.h zutil.h zlib.h zconf.h +example.o: zlib.h zconf.h +gzio.o: zutil.h zlib.h zconf.h +infblock.o: infblock.h inftrees.h infcodes.h infutil.h zutil.h zlib.h zconf.h +infcodes.o: zutil.h zlib.h zconf.h +infcodes.o: inftrees.h infblock.h infcodes.h infutil.h inffast.h +inffast.o: zutil.h zlib.h zconf.h inftrees.h +inffast.o: infblock.h infcodes.h infutil.h inffast.h +inflate.o: zutil.h zlib.h zconf.h infblock.h +inftrees.o: zutil.h zlib.h zconf.h inftrees.h +infutil.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h +minigzip.o: zlib.h zconf.h +trees.o: deflate.h zutil.h zlib.h zconf.h trees.h +uncompr.o: zlib.h zconf.h +zutil.o: zutil.h zlib.h zconf.h diff --git a/externe_kniznice/zlib/old/os2/zlib.def b/externe_kniznice/zlib/old/os2/zlib.def new file mode 100644 index 0000000..4c753f1 --- /dev/null +++ b/externe_kniznice/zlib/old/os2/zlib.def @@ -0,0 +1,51 @@ +; +; Slightly modified version of ../nt/zlib.dnt :-) +; + +LIBRARY Z +DESCRIPTION "Zlib compression library for OS/2" +CODE PRELOAD MOVEABLE DISCARDABLE +DATA PRELOAD MOVEABLE MULTIPLE + +EXPORTS + adler32 + compress + crc32 + deflate + deflateCopy + deflateEnd + deflateInit2_ + deflateInit_ + deflateParams + deflateReset + deflateSetDictionary + gzclose + gzdopen + gzerror + gzflush + gzopen + gzread + gzwrite + inflate + inflateEnd + inflateInit2_ + inflateInit_ + inflateReset + inflateSetDictionary + inflateSync + uncompress + zlibVersion + gzprintf + gzputc + gzgetc + gzseek + gzrewind + gztell + gzeof + gzsetparams + zError + inflateSyncPoint + get_crc_table + compress2 + gzputs + gzgets diff --git a/externe_kniznice/zlib/old/visual-basic.txt b/externe_kniznice/zlib/old/visual-basic.txt new file mode 100644 index 0000000..57efe58 --- /dev/null +++ b/externe_kniznice/zlib/old/visual-basic.txt @@ -0,0 +1,160 @@ +See below some functions declarations for Visual Basic. + +Frequently Asked Question: + +Q: Each time I use the compress function I get the -5 error (not enough + room in the output buffer). + +A: Make sure that the length of the compressed buffer is passed by + reference ("as any"), not by value ("as long"). Also check that + before the call of compress this length is equal to the total size of + the compressed buffer and not zero. + + +From: "Jon Caruana" +Subject: Re: How to port zlib declares to vb? +Date: Mon, 28 Oct 1996 18:33:03 -0600 + +Got the answer! (I haven't had time to check this but it's what I got, and +looks correct): + +He has the following routines working: + compress + uncompress + gzopen + gzwrite + gzread + gzclose + +Declares follow: (Quoted from Carlos Rios , in Vb4 form) + +#If Win16 Then 'Use Win16 calls. +Declare Function compress Lib "ZLIB.DLL" (ByVal compr As + String, comprLen As Any, ByVal buf As String, ByVal buflen + As Long) As Integer +Declare Function uncompress Lib "ZLIB.DLL" (ByVal uncompr + As String, uncomprLen As Any, ByVal compr As String, ByVal + lcompr As Long) As Integer +Declare Function gzopen Lib "ZLIB.DLL" (ByVal filePath As + String, ByVal mode As String) As Long +Declare Function gzread Lib "ZLIB.DLL" (ByVal file As + Long, ByVal uncompr As String, ByVal uncomprLen As Integer) + As Integer +Declare Function gzwrite Lib "ZLIB.DLL" (ByVal file As + Long, ByVal uncompr As String, ByVal uncomprLen As Integer) + As Integer +Declare Function gzclose Lib "ZLIB.DLL" (ByVal file As + Long) As Integer +#Else +Declare Function compress Lib "ZLIB32.DLL" + (ByVal compr As String, comprLen As Any, ByVal buf As + String, ByVal buflen As Long) As Integer +Declare Function uncompress Lib "ZLIB32.DLL" + (ByVal uncompr As String, uncomprLen As Any, ByVal compr As + String, ByVal lcompr As Long) As Long +Declare Function gzopen Lib "ZLIB32.DLL" + (ByVal file As String, ByVal mode As String) As Long +Declare Function gzread Lib "ZLIB32.DLL" + (ByVal file As Long, ByVal uncompr As String, ByVal + uncomprLen As Long) As Long +Declare Function gzwrite Lib "ZLIB32.DLL" + (ByVal file As Long, ByVal uncompr As String, ByVal + uncomprLen As Long) As Long +Declare Function gzclose Lib "ZLIB32.DLL" + (ByVal file As Long) As Long +#End If + +-Jon Caruana +jon-net@usa.net +Microsoft Sitebuilder Network Level 1 Member - HTML Writer's Guild Member + + +Here is another example from Michael that he +says conforms to the VB guidelines, and that solves the problem of not +knowing the uncompressed size by storing it at the end of the file: + +'Calling the functions: +'bracket meaning: [optional] {Range of possible values} +'Call subCompressFile( [, , [level of compression {1..9}]]) +'Call subUncompressFile() + +Option Explicit +Private lngpvtPcnSml As Long 'Stores value for 'lngPercentSmaller' +Private Const SUCCESS As Long = 0 +Private Const strFilExt As String = ".cpr" +Private Declare Function lngfncCpr Lib "zlib.dll" Alias "compress2" (ByRef +dest As Any, ByRef destLen As Any, ByRef src As Any, ByVal srcLen As Long, +ByVal level As Integer) As Long +Private Declare Function lngfncUcp Lib "zlib.dll" Alias "uncompress" (ByRef +dest As Any, ByRef destLen As Any, ByRef src As Any, ByVal srcLen As Long) +As Long + +Public Sub subCompressFile(ByVal strargOriFilPth As String, Optional ByVal +strargCprFilPth As String, Optional ByVal intLvl As Integer = 9) + Dim strCprPth As String + Dim lngOriSiz As Long + Dim lngCprSiz As Long + Dim bytaryOri() As Byte + Dim bytaryCpr() As Byte + lngOriSiz = FileLen(strargOriFilPth) + ReDim bytaryOri(lngOriSiz - 1) + Open strargOriFilPth For Binary Access Read As #1 + Get #1, , bytaryOri() + Close #1 + strCprPth = IIf(strargCprFilPth = "", strargOriFilPth, strargCprFilPth) +'Select file path and name + strCprPth = strCprPth & IIf(Right(strCprPth, Len(strFilExt)) = +strFilExt, "", strFilExt) 'Add file extension if not exists + lngCprSiz = (lngOriSiz * 1.01) + 12 'Compression needs temporary a bit +more space then original file size + ReDim bytaryCpr(lngCprSiz - 1) + If lngfncCpr(bytaryCpr(0), lngCprSiz, bytaryOri(0), lngOriSiz, intLvl) = +SUCCESS Then + lngpvtPcnSml = (1# - (lngCprSiz / lngOriSiz)) * 100 + ReDim Preserve bytaryCpr(lngCprSiz - 1) + Open strCprPth For Binary Access Write As #1 + Put #1, , bytaryCpr() + Put #1, , lngOriSiz 'Add the the original size value to the end +(last 4 bytes) + Close #1 + Else + MsgBox "Compression error" + End If + Erase bytaryCpr + Erase bytaryOri +End Sub + +Public Sub subUncompressFile(ByVal strargFilPth As String) + Dim bytaryCpr() As Byte + Dim bytaryOri() As Byte + Dim lngOriSiz As Long + Dim lngCprSiz As Long + Dim strOriPth As String + lngCprSiz = FileLen(strargFilPth) + ReDim bytaryCpr(lngCprSiz - 1) + Open strargFilPth For Binary Access Read As #1 + Get #1, , bytaryCpr() + Close #1 + 'Read the original file size value: + lngOriSiz = bytaryCpr(lngCprSiz - 1) * (2 ^ 24) _ + + bytaryCpr(lngCprSiz - 2) * (2 ^ 16) _ + + bytaryCpr(lngCprSiz - 3) * (2 ^ 8) _ + + bytaryCpr(lngCprSiz - 4) + ReDim Preserve bytaryCpr(lngCprSiz - 5) 'Cut of the original size value + ReDim bytaryOri(lngOriSiz - 1) + If lngfncUcp(bytaryOri(0), lngOriSiz, bytaryCpr(0), lngCprSiz) = SUCCESS +Then + strOriPth = Left(strargFilPth, Len(strargFilPth) - Len(strFilExt)) + Open strOriPth For Binary Access Write As #1 + Put #1, , bytaryOri() + Close #1 + Else + MsgBox "Uncompression error" + End If + Erase bytaryCpr + Erase bytaryOri +End Sub +Public Property Get lngPercentSmaller() As Long + lngPercentSmaller = lngpvtPcnSml +End Property diff --git a/externe_kniznice/zlib/os400/README400 b/externe_kniznice/zlib/os400/README400 new file mode 100644 index 0000000..4f98334 --- /dev/null +++ b/externe_kniznice/zlib/os400/README400 @@ -0,0 +1,48 @@ + ZLIB version 1.2.11 for OS/400 installation instructions + +1) Download and unpack the zlib tarball to some IFS directory. + (i.e.: /path/to/the/zlib/ifs/source/directory) + + If the installed IFS command suppors gzip format, this is straightforward, +else you have to unpack first to some directory on a system supporting it, +then move the whole directory to the IFS via the network (via SMB or FTP). + +2) Edit the configuration parameters in the compilation script. + + EDTF STMF('/path/to/the/zlib/ifs/source/directory/os400/make.sh') + +Tune the parameters according to your needs if not matching the defaults. +Save the file and exit after edition. + +3) Enter qshell, then work in the zlib OS/400 specific directory. + + QSH + cd /path/to/the/zlib/ifs/source/directory/os400 + +4) Compile and install + + sh make.sh + +The script will: +- create the libraries, objects and IFS directories for the zlib environment, +- compile all modules, +- create a service program, +- create a static and a dynamic binding directory, +- install header files for C/C++ and for ILE/RPG, both for compilation in + DB2 and IFS environments. + +That's all. + + +Notes: For OS/400 ILE RPG programmers, a /copy member defining the ZLIB + API prototypes for ILE RPG can be found in ZLIB/H(ZLIB.INC). + In the ILE environment, the same definitions are available from + file zlib.inc located in the same IFS include directory as the + C/C++ header files. + Please read comments in this member for more information. + + Remember that most foreign textual data are ASCII coded: this + implementation does not handle conversion from/to ASCII, so + text data code conversions must be done explicitely. + + Mainly for the reason above, always open zipped files in binary mode. diff --git a/externe_kniznice/zlib/os400/bndsrc b/externe_kniznice/zlib/os400/bndsrc new file mode 100644 index 0000000..5e6e0a2 --- /dev/null +++ b/externe_kniznice/zlib/os400/bndsrc @@ -0,0 +1,119 @@ +STRPGMEXP PGMLVL(*CURRENT) SIGNATURE('ZLIB') + +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.1.3 entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + + EXPORT SYMBOL("adler32") + EXPORT SYMBOL("compress") + EXPORT SYMBOL("compress2") + EXPORT SYMBOL("crc32") + EXPORT SYMBOL("get_crc_table") + EXPORT SYMBOL("deflate") + EXPORT SYMBOL("deflateEnd") + EXPORT SYMBOL("deflateSetDictionary") + EXPORT SYMBOL("deflateCopy") + EXPORT SYMBOL("deflateReset") + EXPORT SYMBOL("deflateParams") + EXPORT SYMBOL("deflatePrime") + EXPORT SYMBOL("deflateInit_") + EXPORT SYMBOL("deflateInit2_") + EXPORT SYMBOL("gzopen") + EXPORT SYMBOL("gzdopen") + EXPORT SYMBOL("gzsetparams") + EXPORT SYMBOL("gzread") + EXPORT SYMBOL("gzwrite") + EXPORT SYMBOL("gzprintf") + EXPORT SYMBOL("gzputs") + EXPORT SYMBOL("gzgets") + EXPORT SYMBOL("gzputc") + EXPORT SYMBOL("gzgetc") + EXPORT SYMBOL("gzflush") + EXPORT SYMBOL("gzseek") + EXPORT SYMBOL("gzrewind") + EXPORT SYMBOL("gztell") + EXPORT SYMBOL("gzeof") + EXPORT SYMBOL("gzclose") + EXPORT SYMBOL("gzerror") + EXPORT SYMBOL("inflate") + EXPORT SYMBOL("inflateEnd") + EXPORT SYMBOL("inflateSetDictionary") + EXPORT SYMBOL("inflateSync") + EXPORT SYMBOL("inflateReset") + EXPORT SYMBOL("inflateInit_") + EXPORT SYMBOL("inflateInit2_") + EXPORT SYMBOL("inflateSyncPoint") + EXPORT SYMBOL("uncompress") + EXPORT SYMBOL("zlibVersion") + EXPORT SYMBOL("zError") + EXPORT SYMBOL("z_errmsg") + +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.2.1 additional entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + + EXPORT SYMBOL("compressBound") + EXPORT SYMBOL("deflateBound") + EXPORT SYMBOL("deflatePending") + EXPORT SYMBOL("gzungetc") + EXPORT SYMBOL("gzclearerr") + EXPORT SYMBOL("inflateBack") + EXPORT SYMBOL("inflateBackEnd") + EXPORT SYMBOL("inflateBackInit_") + EXPORT SYMBOL("inflateCopy") + EXPORT SYMBOL("zlibCompileFlags") + +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.2.4 additional entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + + EXPORT SYMBOL("adler32_combine") + EXPORT SYMBOL("adler32_combine64") + EXPORT SYMBOL("crc32_combine") + EXPORT SYMBOL("crc32_combine64") + EXPORT SYMBOL("deflateSetHeader") + EXPORT SYMBOL("deflateTune") + EXPORT SYMBOL("gzbuffer") + EXPORT SYMBOL("gzclose_r") + EXPORT SYMBOL("gzclose_w") + EXPORT SYMBOL("gzdirect") + EXPORT SYMBOL("gzoffset") + EXPORT SYMBOL("gzoffset64") + EXPORT SYMBOL("gzopen64") + EXPORT SYMBOL("gzseek64") + EXPORT SYMBOL("gztell64") + EXPORT SYMBOL("inflateGetHeader") + EXPORT SYMBOL("inflateMark") + EXPORT SYMBOL("inflatePrime") + EXPORT SYMBOL("inflateReset2") + EXPORT SYMBOL("inflateUndermine") + +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.2.6 additional entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + + EXPORT SYMBOL("deflateResetKeep") + EXPORT SYMBOL("gzgetc_") + EXPORT SYMBOL("inflateResetKeep") + +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.2.8 additional entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + + EXPORT SYMBOL("gzvprintf") + EXPORT SYMBOL("inflateGetDictionary") + +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.2.9 additional entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + + EXPORT SYMBOL("adler32_z") + EXPORT SYMBOL("crc32_z") + EXPORT SYMBOL("deflateGetDictionary") + EXPORT SYMBOL("gzfread") + EXPORT SYMBOL("gzfwrite") + EXPORT SYMBOL("inflateCodesUsed") + EXPORT SYMBOL("inflateValidate") + EXPORT SYMBOL("uncompress2") + +ENDPGMEXP diff --git a/externe_kniznice/zlib/os400/make.sh b/externe_kniznice/zlib/os400/make.sh new file mode 100644 index 0000000..19eec11 --- /dev/null +++ b/externe_kniznice/zlib/os400/make.sh @@ -0,0 +1,366 @@ +#!/bin/sh +# +# ZLIB compilation script for the OS/400. +# +# +# This is a shell script since make is not a standard component of OS/400. + + +################################################################################ +# +# Tunable configuration parameters. +# +################################################################################ + +TARGETLIB='ZLIB' # Target OS/400 program library +STATBNDDIR='ZLIB_A' # Static binding directory. +DYNBNDDIR='ZLIB' # Dynamic binding directory. +SRVPGM="ZLIB" # Service program. +IFSDIR='/zlib' # IFS support base directory. +TGTCCSID='500' # Target CCSID of objects +DEBUG='*NONE' # Debug level +OPTIMIZE='40' # Optimisation level +OUTPUT='*NONE' # Compilation output option. +TGTRLS='V6R1M0' # Target OS release + +export TARGETLIB STATBNDDIR DYNBNDDIR SRVPGM IFSDIR +export TGTCCSID DEBUG OPTIMIZE OUTPUT TGTRLS + + +################################################################################ +# +# OS/400 specific definitions. +# +################################################################################ + +LIBIFSNAME="/QSYS.LIB/${TARGETLIB}.LIB" + + +################################################################################ +# +# Procedures. +# +################################################################################ + +# action_needed dest [src] +# +# dest is an object to build +# if specified, src is an object on which dest depends. +# +# exit 0 (succeeds) if some action has to be taken, else 1. + +action_needed() + +{ + [ ! -e "${1}" ] && return 0 + [ "${2}" ] || return 1 + [ "${1}" -ot "${2}" ] && return 0 + return 1 +} + + +# make_module module_name source_name [additional_definitions] +# +# Compile source name into module if needed. +# As side effect, append the module name to variable MODULES. +# Set LINK to "YES" if the module has been compiled. + +make_module() + +{ + MODULES="${MODULES} ${1}" + MODIFSNAME="${LIBIFSNAME}/${1}.MODULE" + CSRC="`basename \"${2}\"`" + + if action_needed "${MODIFSNAME}" "${2}" + then : + elif [ ! "`sed -e \"//,/<\\\\/source>/!d\" \ + -e '/ tmphdrfile + + # Need to translate to target CCSID. + + CMD="CPY OBJ('`pwd`/tmphdrfile') TOOBJ('${DEST}')" + CMD="${CMD} TOCCSID(${TGTCCSID}) DTAFMT(*TEXT) REPLACE(*YES)" + system "${CMD}" + # touch -r "${HFILE}" "${DEST}" + rm -f tmphdrfile + fi + + IFSFILE="${IFSDIR}/include/`basename \"${HFILE}\"`" + + if action_needed "${IFSFILE}" "${DEST}" + then rm -f "${IFSFILE}" + ln -s "${DEST}" "${IFSFILE}" + fi +done + + +# Install the ILE/RPG header file. + + +HFILE="${SCRIPTDIR}/zlib.inc" +DEST="${SRCPF}/ZLIB.INC.MBR" + +if action_needed "${DEST}" "${HFILE}" +then CMD="CPY OBJ('${HFILE}') TOOBJ('${DEST}')" + CMD="${CMD} TOCCSID(${TGTCCSID}) DTAFMT(*TEXT) REPLACE(*YES)" + system "${CMD}" + # touch -r "${HFILE}" "${DEST}" +fi + +IFSFILE="${IFSDIR}/include/`basename \"${HFILE}\"`" + +if action_needed "${IFSFILE}" "${DEST}" +then rm -f "${IFSFILE}" + ln -s "${DEST}" "${IFSFILE}" +fi + + +# Create and compile the identification source file. + +echo '#pragma comment(user, "ZLIB version '"${VERSION}"'")' > os400.c +echo '#pragma comment(user, __DATE__)' >> os400.c +echo '#pragma comment(user, __TIME__)' >> os400.c +echo '#pragma comment(copyright, "Copyright (C) 1995-2017 Jean-Loup Gailly, Mark Adler. OS/400 version by P. Monnerat.")' >> os400.c +make_module OS400 os400.c +LINK= # No need to rebuild service program yet. +MODULES= + + +# Get source list. + +CSOURCES=`sed -e '/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Library + + Medium + + 2.0 + + + + zlib + zlib + alain.bonnefoy@icbt.com + Public + public + www.gzip.org/zlib + + + Jean-Loup Gailly,Mark Adler + www.gzip.org/zlib + + zlib@gzip.org + + + A massively spiffy yet delicately unobtrusive compression library. + zlib is designed to be a free, general-purpose, legally unencumbered, lossless data compression library for use on virtually any computer hardware and operating system. + http://www.gzip.org/zlib + + + + + 1.2.11 + Medium + Stable + + + + + + + No License + + + + Software Development/Libraries and Extensions/C Libraries + zlib,compression + qnx6 + qnx6 + None + Developer + + + + + + + + + + + + + + Install + Post + No + Ignore + + No + Optional + + + + + + + + + + + + + InstallOver + zlib + + + + + + + + + + + + + InstallOver + zlib-dev + + + + + + + + + diff --git a/externe_kniznice/zlib/test/example.c b/externe_kniznice/zlib/test/example.c new file mode 100644 index 0000000..eee17ce --- /dev/null +++ b/externe_kniznice/zlib/test/example.c @@ -0,0 +1,602 @@ +/* example.c -- usage example of the zlib compression library + * Copyright (C) 1995-2006, 2011, 2016 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zlib.h" +#include + +#ifdef STDC +# include +# include +#endif + +#if defined(VMS) || defined(RISCOS) +# define TESTFILE "foo-gz" +#else +# define TESTFILE "foo.gz" +#endif + +#define CHECK_ERR(err, msg) { \ + if (err != Z_OK) { \ + fprintf(stderr, "%s error: %d\n", msg, err); \ + exit(1); \ + } \ +} + +static z_const char hello[] = "hello, hello!"; +/* "hello world" would be more standard, but the repeated "hello" + * stresses the compression code better, sorry... + */ + +static const char dictionary[] = "hello"; +static uLong dictId; /* Adler32 value of the dictionary */ + +void test_deflate OF((Byte *compr, uLong comprLen)); +void test_inflate OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_large_deflate OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_large_inflate OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_flush OF((Byte *compr, uLong *comprLen)); +void test_sync OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_dict_deflate OF((Byte *compr, uLong comprLen)); +void test_dict_inflate OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +int main OF((int argc, char *argv[])); + + +#ifdef Z_SOLO + +void *myalloc OF((void *, unsigned, unsigned)); +void myfree OF((void *, void *)); + +void *myalloc(q, n, m) + void *q; + unsigned n, m; +{ + (void)q; + return calloc(n, m); +} + +void myfree(void *q, void *p) +{ + (void)q; + free(p); +} + +static alloc_func zalloc = myalloc; +static free_func zfree = myfree; + +#else /* !Z_SOLO */ + +static alloc_func zalloc = (alloc_func)0; +static free_func zfree = (free_func)0; + +void test_compress OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_gzio OF((const char *fname, + Byte *uncompr, uLong uncomprLen)); + +/* =========================================================================== + * Test compress() and uncompress() + */ +void test_compress(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + uLong len = (uLong)strlen(hello)+1; + + err = compress(compr, &comprLen, (const Bytef*)hello, len); + CHECK_ERR(err, "compress"); + + strcpy((char*)uncompr, "garbage"); + + err = uncompress(uncompr, &uncomprLen, compr, comprLen); + CHECK_ERR(err, "uncompress"); + + if (strcmp((char*)uncompr, hello)) { + fprintf(stderr, "bad uncompress\n"); + exit(1); + } else { + printf("uncompress(): %s\n", (char *)uncompr); + } +} + +/* =========================================================================== + * Test read/write of .gz files + */ +void test_gzio(fname, uncompr, uncomprLen) + const char *fname; /* compressed file name */ + Byte *uncompr; + uLong uncomprLen; +{ +#ifdef NO_GZCOMPRESS + fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n"); +#else + int err; + int len = (int)strlen(hello)+1; + gzFile file; + z_off_t pos; + + file = gzopen(fname, "wb"); + if (file == NULL) { + fprintf(stderr, "gzopen error\n"); + exit(1); + } + gzputc(file, 'h'); + if (gzputs(file, "ello") != 4) { + fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err)); + exit(1); + } + if (gzprintf(file, ", %s!", "hello") != 8) { + fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err)); + exit(1); + } + gzseek(file, 1L, SEEK_CUR); /* add one zero byte */ + gzclose(file); + + file = gzopen(fname, "rb"); + if (file == NULL) { + fprintf(stderr, "gzopen error\n"); + exit(1); + } + strcpy((char*)uncompr, "garbage"); + + if (gzread(file, uncompr, (unsigned)uncomprLen) != len) { + fprintf(stderr, "gzread err: %s\n", gzerror(file, &err)); + exit(1); + } + if (strcmp((char*)uncompr, hello)) { + fprintf(stderr, "bad gzread: %s\n", (char*)uncompr); + exit(1); + } else { + printf("gzread(): %s\n", (char*)uncompr); + } + + pos = gzseek(file, -8L, SEEK_CUR); + if (pos != 6 || gztell(file) != pos) { + fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n", + (long)pos, (long)gztell(file)); + exit(1); + } + + if (gzgetc(file) != ' ') { + fprintf(stderr, "gzgetc error\n"); + exit(1); + } + + if (gzungetc(' ', file) != ' ') { + fprintf(stderr, "gzungetc error\n"); + exit(1); + } + + gzgets(file, (char*)uncompr, (int)uncomprLen); + if (strlen((char*)uncompr) != 7) { /* " hello!" */ + fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err)); + exit(1); + } + if (strcmp((char*)uncompr, hello + 6)) { + fprintf(stderr, "bad gzgets after gzseek\n"); + exit(1); + } else { + printf("gzgets() after gzseek: %s\n", (char*)uncompr); + } + + gzclose(file); +#endif +} + +#endif /* Z_SOLO */ + +/* =========================================================================== + * Test deflate() with small buffers + */ +void test_deflate(compr, comprLen) + Byte *compr; + uLong comprLen; +{ + z_stream c_stream; /* compression stream */ + int err; + uLong len = (uLong)strlen(hello)+1; + + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (voidpf)0; + + err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, "deflateInit"); + + c_stream.next_in = (z_const unsigned char *)hello; + c_stream.next_out = compr; + + while (c_stream.total_in != len && c_stream.total_out < comprLen) { + c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */ + err = deflate(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + } + /* Finish the stream, still forcing small buffers: */ + for (;;) { + c_stream.avail_out = 1; + err = deflate(&c_stream, Z_FINISH); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "deflate"); + } + + err = deflateEnd(&c_stream); + CHECK_ERR(err, "deflateEnd"); +} + +/* =========================================================================== + * Test inflate() with small buffers + */ +void test_inflate(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + z_stream d_stream; /* decompression stream */ + + strcpy((char*)uncompr, "garbage"); + + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; + d_stream.opaque = (voidpf)0; + + d_stream.next_in = compr; + d_stream.avail_in = 0; + d_stream.next_out = uncompr; + + err = inflateInit(&d_stream); + CHECK_ERR(err, "inflateInit"); + + while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) { + d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */ + err = inflate(&d_stream, Z_NO_FLUSH); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "inflate"); + } + + err = inflateEnd(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + if (strcmp((char*)uncompr, hello)) { + fprintf(stderr, "bad inflate\n"); + exit(1); + } else { + printf("inflate(): %s\n", (char *)uncompr); + } +} + +/* =========================================================================== + * Test deflate() with large buffers and dynamic change of compression level + */ +void test_large_deflate(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + z_stream c_stream; /* compression stream */ + int err; + + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (voidpf)0; + + err = deflateInit(&c_stream, Z_BEST_SPEED); + CHECK_ERR(err, "deflateInit"); + + c_stream.next_out = compr; + c_stream.avail_out = (uInt)comprLen; + + /* At this point, uncompr is still mostly zeroes, so it should compress + * very well: + */ + c_stream.next_in = uncompr; + c_stream.avail_in = (uInt)uncomprLen; + err = deflate(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + if (c_stream.avail_in != 0) { + fprintf(stderr, "deflate not greedy\n"); + exit(1); + } + + /* Feed in already compressed data and switch to no compression: */ + deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); + c_stream.next_in = compr; + c_stream.avail_in = (uInt)comprLen/2; + err = deflate(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + + /* Switch back to compressing mode: */ + deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED); + c_stream.next_in = uncompr; + c_stream.avail_in = (uInt)uncomprLen; + err = deflate(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + + err = deflate(&c_stream, Z_FINISH); + if (err != Z_STREAM_END) { + fprintf(stderr, "deflate should report Z_STREAM_END\n"); + exit(1); + } + err = deflateEnd(&c_stream); + CHECK_ERR(err, "deflateEnd"); +} + +/* =========================================================================== + * Test inflate() with large buffers + */ +void test_large_inflate(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + z_stream d_stream; /* decompression stream */ + + strcpy((char*)uncompr, "garbage"); + + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; + d_stream.opaque = (voidpf)0; + + d_stream.next_in = compr; + d_stream.avail_in = (uInt)comprLen; + + err = inflateInit(&d_stream); + CHECK_ERR(err, "inflateInit"); + + for (;;) { + d_stream.next_out = uncompr; /* discard the output */ + d_stream.avail_out = (uInt)uncomprLen; + err = inflate(&d_stream, Z_NO_FLUSH); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "large inflate"); + } + + err = inflateEnd(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + if (d_stream.total_out != 2*uncomprLen + comprLen/2) { + fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out); + exit(1); + } else { + printf("large_inflate(): OK\n"); + } +} + +/* =========================================================================== + * Test deflate() with full flush + */ +void test_flush(compr, comprLen) + Byte *compr; + uLong *comprLen; +{ + z_stream c_stream; /* compression stream */ + int err; + uInt len = (uInt)strlen(hello)+1; + + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (voidpf)0; + + err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, "deflateInit"); + + c_stream.next_in = (z_const unsigned char *)hello; + c_stream.next_out = compr; + c_stream.avail_in = 3; + c_stream.avail_out = (uInt)*comprLen; + err = deflate(&c_stream, Z_FULL_FLUSH); + CHECK_ERR(err, "deflate"); + + compr[3]++; /* force an error in first compressed block */ + c_stream.avail_in = len - 3; + + err = deflate(&c_stream, Z_FINISH); + if (err != Z_STREAM_END) { + CHECK_ERR(err, "deflate"); + } + err = deflateEnd(&c_stream); + CHECK_ERR(err, "deflateEnd"); + + *comprLen = c_stream.total_out; +} + +/* =========================================================================== + * Test inflateSync() + */ +void test_sync(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + z_stream d_stream; /* decompression stream */ + + strcpy((char*)uncompr, "garbage"); + + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; + d_stream.opaque = (voidpf)0; + + d_stream.next_in = compr; + d_stream.avail_in = 2; /* just read the zlib header */ + + err = inflateInit(&d_stream); + CHECK_ERR(err, "inflateInit"); + + d_stream.next_out = uncompr; + d_stream.avail_out = (uInt)uncomprLen; + + err = inflate(&d_stream, Z_NO_FLUSH); + CHECK_ERR(err, "inflate"); + + d_stream.avail_in = (uInt)comprLen-2; /* read all compressed data */ + err = inflateSync(&d_stream); /* but skip the damaged part */ + CHECK_ERR(err, "inflateSync"); + + err = inflate(&d_stream, Z_FINISH); + if (err != Z_DATA_ERROR) { + fprintf(stderr, "inflate should report DATA_ERROR\n"); + /* Because of incorrect adler32 */ + exit(1); + } + err = inflateEnd(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + printf("after inflateSync(): hel%s\n", (char *)uncompr); +} + +/* =========================================================================== + * Test deflate() with preset dictionary + */ +void test_dict_deflate(compr, comprLen) + Byte *compr; + uLong comprLen; +{ + z_stream c_stream; /* compression stream */ + int err; + + c_stream.zalloc = zalloc; + c_stream.zfree = zfree; + c_stream.opaque = (voidpf)0; + + err = deflateInit(&c_stream, Z_BEST_COMPRESSION); + CHECK_ERR(err, "deflateInit"); + + err = deflateSetDictionary(&c_stream, + (const Bytef*)dictionary, (int)sizeof(dictionary)); + CHECK_ERR(err, "deflateSetDictionary"); + + dictId = c_stream.adler; + c_stream.next_out = compr; + c_stream.avail_out = (uInt)comprLen; + + c_stream.next_in = (z_const unsigned char *)hello; + c_stream.avail_in = (uInt)strlen(hello)+1; + + err = deflate(&c_stream, Z_FINISH); + if (err != Z_STREAM_END) { + fprintf(stderr, "deflate should report Z_STREAM_END\n"); + exit(1); + } + err = deflateEnd(&c_stream); + CHECK_ERR(err, "deflateEnd"); +} + +/* =========================================================================== + * Test inflate() with a preset dictionary + */ +void test_dict_inflate(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + z_stream d_stream; /* decompression stream */ + + strcpy((char*)uncompr, "garbage"); + + d_stream.zalloc = zalloc; + d_stream.zfree = zfree; + d_stream.opaque = (voidpf)0; + + d_stream.next_in = compr; + d_stream.avail_in = (uInt)comprLen; + + err = inflateInit(&d_stream); + CHECK_ERR(err, "inflateInit"); + + d_stream.next_out = uncompr; + d_stream.avail_out = (uInt)uncomprLen; + + for (;;) { + err = inflate(&d_stream, Z_NO_FLUSH); + if (err == Z_STREAM_END) break; + if (err == Z_NEED_DICT) { + if (d_stream.adler != dictId) { + fprintf(stderr, "unexpected dictionary"); + exit(1); + } + err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary, + (int)sizeof(dictionary)); + } + CHECK_ERR(err, "inflate with dict"); + } + + err = inflateEnd(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + if (strcmp((char*)uncompr, hello)) { + fprintf(stderr, "bad inflate with dict\n"); + exit(1); + } else { + printf("inflate with dictionary: %s\n", (char *)uncompr); + } +} + +/* =========================================================================== + * Usage: example [output.gz [input.gz]] + */ + +int main(argc, argv) + int argc; + char *argv[]; +{ + Byte *compr, *uncompr; + uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */ + uLong uncomprLen = comprLen; + static const char* myVersion = ZLIB_VERSION; + + if (zlibVersion()[0] != myVersion[0]) { + fprintf(stderr, "incompatible zlib version\n"); + exit(1); + + } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) { + fprintf(stderr, "warning: different zlib version\n"); + } + + printf("zlib version %s = 0x%04x, compile flags = 0x%lx\n", + ZLIB_VERSION, ZLIB_VERNUM, zlibCompileFlags()); + + compr = (Byte*)calloc((uInt)comprLen, 1); + uncompr = (Byte*)calloc((uInt)uncomprLen, 1); + /* compr and uncompr are cleared to avoid reading uninitialized + * data and to ensure that uncompr compresses well. + */ + if (compr == Z_NULL || uncompr == Z_NULL) { + printf("out of memory\n"); + exit(1); + } + +#ifdef Z_SOLO + (void)argc; + (void)argv; +#else + test_compress(compr, comprLen, uncompr, uncomprLen); + + test_gzio((argc > 1 ? argv[1] : TESTFILE), + uncompr, uncomprLen); +#endif + + test_deflate(compr, comprLen); + test_inflate(compr, comprLen, uncompr, uncomprLen); + + test_large_deflate(compr, comprLen, uncompr, uncomprLen); + test_large_inflate(compr, comprLen, uncompr, uncomprLen); + + test_flush(compr, &comprLen); + test_sync(compr, comprLen, uncompr, uncomprLen); + comprLen = uncomprLen; + + test_dict_deflate(compr, comprLen); + test_dict_inflate(compr, comprLen, uncompr, uncomprLen); + + free(compr); + free(uncompr); + + return 0; +} diff --git a/externe_kniznice/zlib/test/infcover.c b/externe_kniznice/zlib/test/infcover.c new file mode 100644 index 0000000..2be0164 --- /dev/null +++ b/externe_kniznice/zlib/test/infcover.c @@ -0,0 +1,671 @@ +/* infcover.c -- test zlib's inflate routines with full code coverage + * Copyright (C) 2011, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* to use, do: ./configure --cover && make cover */ + +#include +#include +#include +#include +#include "zlib.h" + +/* get definition of internal structure so we can mess with it (see pull()), + and so we can call inflate_trees() (see cover5()) */ +#define ZLIB_INTERNAL +#include "inftrees.h" +#include "inflate.h" + +#define local static + +/* -- memory tracking routines -- */ + +/* + These memory tracking routines are provided to zlib and track all of zlib's + allocations and deallocations, check for LIFO operations, keep a current + and high water mark of total bytes requested, optionally set a limit on the + total memory that can be allocated, and when done check for memory leaks. + + They are used as follows: + + z_stream strm; + mem_setup(&strm) initializes the memory tracking and sets the + zalloc, zfree, and opaque members of strm to use + memory tracking for all zlib operations on strm + mem_limit(&strm, limit) sets a limit on the total bytes requested -- a + request that exceeds this limit will result in an + allocation failure (returns NULL) -- setting the + limit to zero means no limit, which is the default + after mem_setup() + mem_used(&strm, "msg") prints to stderr "msg" and the total bytes used + mem_high(&strm, "msg") prints to stderr "msg" and the high water mark + mem_done(&strm, "msg") ends memory tracking, releases all allocations + for the tracking as well as leaked zlib blocks, if + any. If there was anything unusual, such as leaked + blocks, non-FIFO frees, or frees of addresses not + allocated, then "msg" and information about the + problem is printed to stderr. If everything is + normal, nothing is printed. mem_done resets the + strm members to Z_NULL to use the default memory + allocation routines on the next zlib initialization + using strm. + */ + +/* these items are strung together in a linked list, one for each allocation */ +struct mem_item { + void *ptr; /* pointer to allocated memory */ + size_t size; /* requested size of allocation */ + struct mem_item *next; /* pointer to next item in list, or NULL */ +}; + +/* this structure is at the root of the linked list, and tracks statistics */ +struct mem_zone { + struct mem_item *first; /* pointer to first item in list, or NULL */ + size_t total, highwater; /* total allocations, and largest total */ + size_t limit; /* memory allocation limit, or 0 if no limit */ + int notlifo, rogue; /* counts of non-LIFO frees and rogue frees */ +}; + +/* memory allocation routine to pass to zlib */ +local void *mem_alloc(void *mem, unsigned count, unsigned size) +{ + void *ptr; + struct mem_item *item; + struct mem_zone *zone = mem; + size_t len = count * (size_t)size; + + /* induced allocation failure */ + if (zone == NULL || (zone->limit && zone->total + len > zone->limit)) + return NULL; + + /* perform allocation using the standard library, fill memory with a + non-zero value to make sure that the code isn't depending on zeros */ + ptr = malloc(len); + if (ptr == NULL) + return NULL; + memset(ptr, 0xa5, len); + + /* create a new item for the list */ + item = malloc(sizeof(struct mem_item)); + if (item == NULL) { + free(ptr); + return NULL; + } + item->ptr = ptr; + item->size = len; + + /* insert item at the beginning of the list */ + item->next = zone->first; + zone->first = item; + + /* update the statistics */ + zone->total += item->size; + if (zone->total > zone->highwater) + zone->highwater = zone->total; + + /* return the allocated memory */ + return ptr; +} + +/* memory free routine to pass to zlib */ +local void mem_free(void *mem, void *ptr) +{ + struct mem_item *item, *next; + struct mem_zone *zone = mem; + + /* if no zone, just do a free */ + if (zone == NULL) { + free(ptr); + return; + } + + /* point next to the item that matches ptr, or NULL if not found -- remove + the item from the linked list if found */ + next = zone->first; + if (next) { + if (next->ptr == ptr) + zone->first = next->next; /* first one is it, remove from list */ + else { + do { /* search the linked list */ + item = next; + next = item->next; + } while (next != NULL && next->ptr != ptr); + if (next) { /* if found, remove from linked list */ + item->next = next->next; + zone->notlifo++; /* not a LIFO free */ + } + + } + } + + /* if found, update the statistics and free the item */ + if (next) { + zone->total -= next->size; + free(next); + } + + /* if not found, update the rogue count */ + else + zone->rogue++; + + /* in any case, do the requested free with the standard library function */ + free(ptr); +} + +/* set up a controlled memory allocation space for monitoring, set the stream + parameters to the controlled routines, with opaque pointing to the space */ +local void mem_setup(z_stream *strm) +{ + struct mem_zone *zone; + + zone = malloc(sizeof(struct mem_zone)); + assert(zone != NULL); + zone->first = NULL; + zone->total = 0; + zone->highwater = 0; + zone->limit = 0; + zone->notlifo = 0; + zone->rogue = 0; + strm->opaque = zone; + strm->zalloc = mem_alloc; + strm->zfree = mem_free; +} + +/* set a limit on the total memory allocation, or 0 to remove the limit */ +local void mem_limit(z_stream *strm, size_t limit) +{ + struct mem_zone *zone = strm->opaque; + + zone->limit = limit; +} + +/* show the current total requested allocations in bytes */ +local void mem_used(z_stream *strm, char *prefix) +{ + struct mem_zone *zone = strm->opaque; + + fprintf(stderr, "%s: %lu allocated\n", prefix, zone->total); +} + +/* show the high water allocation in bytes */ +local void mem_high(z_stream *strm, char *prefix) +{ + struct mem_zone *zone = strm->opaque; + + fprintf(stderr, "%s: %lu high water mark\n", prefix, zone->highwater); +} + +/* release the memory allocation zone -- if there are any surprises, notify */ +local void mem_done(z_stream *strm, char *prefix) +{ + int count = 0; + struct mem_item *item, *next; + struct mem_zone *zone = strm->opaque; + + /* show high water mark */ + mem_high(strm, prefix); + + /* free leftover allocations and item structures, if any */ + item = zone->first; + while (item != NULL) { + free(item->ptr); + next = item->next; + free(item); + item = next; + count++; + } + + /* issue alerts about anything unexpected */ + if (count || zone->total) + fprintf(stderr, "** %s: %lu bytes in %d blocks not freed\n", + prefix, zone->total, count); + if (zone->notlifo) + fprintf(stderr, "** %s: %d frees not LIFO\n", prefix, zone->notlifo); + if (zone->rogue) + fprintf(stderr, "** %s: %d frees not recognized\n", + prefix, zone->rogue); + + /* free the zone and delete from the stream */ + free(zone); + strm->opaque = Z_NULL; + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; +} + +/* -- inflate test routines -- */ + +/* Decode a hexadecimal string, set *len to length, in[] to the bytes. This + decodes liberally, in that hex digits can be adjacent, in which case two in + a row writes a byte. Or they can be delimited by any non-hex character, + where the delimiters are ignored except when a single hex digit is followed + by a delimiter, where that single digit writes a byte. The returned data is + allocated and must eventually be freed. NULL is returned if out of memory. + If the length is not needed, then len can be NULL. */ +local unsigned char *h2b(const char *hex, unsigned *len) +{ + unsigned char *in, *re; + unsigned next, val; + + in = malloc((strlen(hex) + 1) >> 1); + if (in == NULL) + return NULL; + next = 0; + val = 1; + do { + if (*hex >= '0' && *hex <= '9') + val = (val << 4) + *hex - '0'; + else if (*hex >= 'A' && *hex <= 'F') + val = (val << 4) + *hex - 'A' + 10; + else if (*hex >= 'a' && *hex <= 'f') + val = (val << 4) + *hex - 'a' + 10; + else if (val != 1 && val < 32) /* one digit followed by delimiter */ + val += 240; /* make it look like two digits */ + if (val > 255) { /* have two digits */ + in[next++] = val & 0xff; /* save the decoded byte */ + val = 1; /* start over */ + } + } while (*hex++); /* go through the loop with the terminating null */ + if (len != NULL) + *len = next; + re = realloc(in, next); + return re == NULL ? in : re; +} + +/* generic inflate() run, where hex is the hexadecimal input data, what is the + text to include in an error message, step is how much input data to feed + inflate() on each call, or zero to feed it all, win is the window bits + parameter to inflateInit2(), len is the size of the output buffer, and err + is the error code expected from the first inflate() call (the second + inflate() call is expected to return Z_STREAM_END). If win is 47, then + header information is collected with inflateGetHeader(). If a zlib stream + is looking for a dictionary, then an empty dictionary is provided. + inflate() is run until all of the input data is consumed. */ +local void inf(char *hex, char *what, unsigned step, int win, unsigned len, + int err) +{ + int ret; + unsigned have; + unsigned char *in, *out; + z_stream strm, copy; + gz_header head; + + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, win); + if (ret != Z_OK) { + mem_done(&strm, what); + return; + } + out = malloc(len); assert(out != NULL); + if (win == 47) { + head.extra = out; + head.extra_max = len; + head.name = out; + head.name_max = len; + head.comment = out; + head.comm_max = len; + ret = inflateGetHeader(&strm, &head); assert(ret == Z_OK); + } + in = h2b(hex, &have); assert(in != NULL); + if (step == 0 || step > have) + step = have; + strm.avail_in = step; + have -= step; + strm.next_in = in; + do { + strm.avail_out = len; + strm.next_out = out; + ret = inflate(&strm, Z_NO_FLUSH); assert(err == 9 || ret == err); + if (ret != Z_OK && ret != Z_BUF_ERROR && ret != Z_NEED_DICT) + break; + if (ret == Z_NEED_DICT) { + ret = inflateSetDictionary(&strm, in, 1); + assert(ret == Z_DATA_ERROR); + mem_limit(&strm, 1); + ret = inflateSetDictionary(&strm, out, 0); + assert(ret == Z_MEM_ERROR); + mem_limit(&strm, 0); + ((struct inflate_state *)strm.state)->mode = DICT; + ret = inflateSetDictionary(&strm, out, 0); + assert(ret == Z_OK); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_BUF_ERROR); + } + ret = inflateCopy(©, &strm); assert(ret == Z_OK); + ret = inflateEnd(©); assert(ret == Z_OK); + err = 9; /* don't care next time around */ + have += strm.avail_in; + strm.avail_in = step > have ? have : step; + have -= strm.avail_in; + } while (strm.avail_in); + free(in); + free(out); + ret = inflateReset2(&strm, -8); assert(ret == Z_OK); + ret = inflateEnd(&strm); assert(ret == Z_OK); + mem_done(&strm, what); +} + +/* cover all of the lines in inflate.c up to inflate() */ +local void cover_support(void) +{ + int ret; + z_stream strm; + + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit(&strm); assert(ret == Z_OK); + mem_used(&strm, "inflate init"); + ret = inflatePrime(&strm, 5, 31); assert(ret == Z_OK); + ret = inflatePrime(&strm, -1, 0); assert(ret == Z_OK); + ret = inflateSetDictionary(&strm, Z_NULL, 0); + assert(ret == Z_STREAM_ERROR); + ret = inflateEnd(&strm); assert(ret == Z_OK); + mem_done(&strm, "prime"); + + inf("63 0", "force window allocation", 0, -15, 1, Z_OK); + inf("63 18 5", "force window replacement", 0, -8, 259, Z_OK); + inf("63 18 68 30 d0 0 0", "force split window update", 4, -8, 259, Z_OK); + inf("3 0", "use fixed blocks", 0, -15, 1, Z_STREAM_END); + inf("", "bad window size", 0, 1, 0, Z_STREAM_ERROR); + + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit_(&strm, ZLIB_VERSION - 1, (int)sizeof(z_stream)); + assert(ret == Z_VERSION_ERROR); + mem_done(&strm, "wrong version"); + + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit(&strm); assert(ret == Z_OK); + ret = inflateEnd(&strm); assert(ret == Z_OK); + fputs("inflate built-in memory routines\n", stderr); +} + +/* cover all inflate() header and trailer cases and code after inflate() */ +local void cover_wrap(void) +{ + int ret; + z_stream strm, copy; + unsigned char dict[257]; + + ret = inflate(Z_NULL, 0); assert(ret == Z_STREAM_ERROR); + ret = inflateEnd(Z_NULL); assert(ret == Z_STREAM_ERROR); + ret = inflateCopy(Z_NULL, Z_NULL); assert(ret == Z_STREAM_ERROR); + fputs("inflate bad parameters\n", stderr); + + inf("1f 8b 0 0", "bad gzip method", 0, 31, 0, Z_DATA_ERROR); + inf("1f 8b 8 80", "bad gzip flags", 0, 31, 0, Z_DATA_ERROR); + inf("77 85", "bad zlib method", 0, 15, 0, Z_DATA_ERROR); + inf("8 99", "set window size from header", 0, 0, 0, Z_OK); + inf("78 9c", "bad zlib window size", 0, 8, 0, Z_DATA_ERROR); + inf("78 9c 63 0 0 0 1 0 1", "check adler32", 0, 15, 1, Z_STREAM_END); + inf("1f 8b 8 1e 0 0 0 0 0 0 1 0 0 0 0 0 0", "bad header crc", 0, 47, 1, + Z_DATA_ERROR); + inf("1f 8b 8 2 0 0 0 0 0 0 1d 26 3 0 0 0 0 0 0 0 0 0", "check gzip length", + 0, 47, 0, Z_STREAM_END); + inf("78 90", "bad zlib header check", 0, 47, 0, Z_DATA_ERROR); + inf("8 b8 0 0 0 1", "need dictionary", 0, 8, 0, Z_NEED_DICT); + inf("78 9c 63 0", "compute adler32", 0, 15, 1, Z_OK); + + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, -8); + strm.avail_in = 2; + strm.next_in = (void *)"\x63"; + strm.avail_out = 1; + strm.next_out = (void *)&ret; + mem_limit(&strm, 1); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_MEM_ERROR); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_MEM_ERROR); + mem_limit(&strm, 0); + memset(dict, 0, 257); + ret = inflateSetDictionary(&strm, dict, 257); + assert(ret == Z_OK); + mem_limit(&strm, (sizeof(struct inflate_state) << 1) + 256); + ret = inflatePrime(&strm, 16, 0); assert(ret == Z_OK); + strm.avail_in = 2; + strm.next_in = (void *)"\x80"; + ret = inflateSync(&strm); assert(ret == Z_DATA_ERROR); + ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_STREAM_ERROR); + strm.avail_in = 4; + strm.next_in = (void *)"\0\0\xff\xff"; + ret = inflateSync(&strm); assert(ret == Z_OK); + (void)inflateSyncPoint(&strm); + ret = inflateCopy(©, &strm); assert(ret == Z_MEM_ERROR); + mem_limit(&strm, 0); + ret = inflateUndermine(&strm, 1); assert(ret == Z_DATA_ERROR); + (void)inflateMark(&strm); + ret = inflateEnd(&strm); assert(ret == Z_OK); + mem_done(&strm, "miscellaneous, force memory errors"); +} + +/* input and output functions for inflateBack() */ +local unsigned pull(void *desc, unsigned char **buf) +{ + static unsigned int next = 0; + static unsigned char dat[] = {0x63, 0, 2, 0}; + struct inflate_state *state; + + if (desc == Z_NULL) { + next = 0; + return 0; /* no input (already provided at next_in) */ + } + state = (void *)((z_stream *)desc)->state; + if (state != Z_NULL) + state->mode = SYNC; /* force an otherwise impossible situation */ + return next < sizeof(dat) ? (*buf = dat + next++, 1) : 0; +} + +local int push(void *desc, unsigned char *buf, unsigned len) +{ + buf += len; + return desc != Z_NULL; /* force error if desc not null */ +} + +/* cover inflateBack() up to common deflate data cases and after those */ +local void cover_back(void) +{ + int ret; + z_stream strm; + unsigned char win[32768]; + + ret = inflateBackInit_(Z_NULL, 0, win, 0, 0); + assert(ret == Z_VERSION_ERROR); + ret = inflateBackInit(Z_NULL, 0, win); assert(ret == Z_STREAM_ERROR); + ret = inflateBack(Z_NULL, Z_NULL, Z_NULL, Z_NULL, Z_NULL); + assert(ret == Z_STREAM_ERROR); + ret = inflateBackEnd(Z_NULL); assert(ret == Z_STREAM_ERROR); + fputs("inflateBack bad parameters\n", stderr); + + mem_setup(&strm); + ret = inflateBackInit(&strm, 15, win); assert(ret == Z_OK); + strm.avail_in = 2; + strm.next_in = (void *)"\x03"; + ret = inflateBack(&strm, pull, Z_NULL, push, Z_NULL); + assert(ret == Z_STREAM_END); + /* force output error */ + strm.avail_in = 3; + strm.next_in = (void *)"\x63\x00"; + ret = inflateBack(&strm, pull, Z_NULL, push, &strm); + assert(ret == Z_BUF_ERROR); + /* force mode error by mucking with state */ + ret = inflateBack(&strm, pull, &strm, push, Z_NULL); + assert(ret == Z_STREAM_ERROR); + ret = inflateBackEnd(&strm); assert(ret == Z_OK); + mem_done(&strm, "inflateBack bad state"); + + ret = inflateBackInit(&strm, 15, win); assert(ret == Z_OK); + ret = inflateBackEnd(&strm); assert(ret == Z_OK); + fputs("inflateBack built-in memory routines\n", stderr); +} + +/* do a raw inflate of data in hexadecimal with both inflate and inflateBack */ +local int try(char *hex, char *id, int err) +{ + int ret; + unsigned len, size; + unsigned char *in, *out, *win; + char *prefix; + z_stream strm; + + /* convert to hex */ + in = h2b(hex, &len); + assert(in != NULL); + + /* allocate work areas */ + size = len << 3; + out = malloc(size); + assert(out != NULL); + win = malloc(32768); + assert(win != NULL); + prefix = malloc(strlen(id) + 6); + assert(prefix != NULL); + + /* first with inflate */ + strcpy(prefix, id); + strcat(prefix, "-late"); + mem_setup(&strm); + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, err < 0 ? 47 : -15); + assert(ret == Z_OK); + strm.avail_in = len; + strm.next_in = in; + do { + strm.avail_out = size; + strm.next_out = out; + ret = inflate(&strm, Z_TREES); + assert(ret != Z_STREAM_ERROR && ret != Z_MEM_ERROR); + if (ret == Z_DATA_ERROR || ret == Z_NEED_DICT) + break; + } while (strm.avail_in || strm.avail_out == 0); + if (err) { + assert(ret == Z_DATA_ERROR); + assert(strcmp(id, strm.msg) == 0); + } + inflateEnd(&strm); + mem_done(&strm, prefix); + + /* then with inflateBack */ + if (err >= 0) { + strcpy(prefix, id); + strcat(prefix, "-back"); + mem_setup(&strm); + ret = inflateBackInit(&strm, 15, win); + assert(ret == Z_OK); + strm.avail_in = len; + strm.next_in = in; + ret = inflateBack(&strm, pull, Z_NULL, push, Z_NULL); + assert(ret != Z_STREAM_ERROR); + if (err) { + assert(ret == Z_DATA_ERROR); + assert(strcmp(id, strm.msg) == 0); + } + inflateBackEnd(&strm); + mem_done(&strm, prefix); + } + + /* clean up */ + free(prefix); + free(win); + free(out); + free(in); + return ret; +} + +/* cover deflate data cases in both inflate() and inflateBack() */ +local void cover_inflate(void) +{ + try("0 0 0 0 0", "invalid stored block lengths", 1); + try("3 0", "fixed", 0); + try("6", "invalid block type", 1); + try("1 1 0 fe ff 0", "stored", 0); + try("fc 0 0", "too many length or distance symbols", 1); + try("4 0 fe ff", "invalid code lengths set", 1); + try("4 0 24 49 0", "invalid bit length repeat", 1); + try("4 0 24 e9 ff ff", "invalid bit length repeat", 1); + try("4 0 24 e9 ff 6d", "invalid code -- missing end-of-block", 1); + try("4 80 49 92 24 49 92 24 71 ff ff 93 11 0", + "invalid literal/lengths set", 1); + try("4 80 49 92 24 49 92 24 f b4 ff ff c3 84", "invalid distances set", 1); + try("4 c0 81 8 0 0 0 0 20 7f eb b 0 0", "invalid literal/length code", 1); + try("2 7e ff ff", "invalid distance code", 1); + try("c c0 81 0 0 0 0 0 90 ff 6b 4 0", "invalid distance too far back", 1); + + /* also trailer mismatch just in inflate() */ + try("1f 8b 8 0 0 0 0 0 0 0 3 0 0 0 0 1", "incorrect data check", -1); + try("1f 8b 8 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 1", + "incorrect length check", -1); + try("5 c0 21 d 0 0 0 80 b0 fe 6d 2f 91 6c", "pull 17", 0); + try("5 e0 81 91 24 cb b2 2c 49 e2 f 2e 8b 9a 47 56 9f fb fe ec d2 ff 1f", + "long code", 0); + try("ed c0 1 1 0 0 0 40 20 ff 57 1b 42 2c 4f", "length extra", 0); + try("ed cf c1 b1 2c 47 10 c4 30 fa 6f 35 1d 1 82 59 3d fb be 2e 2a fc f c", + "long distance and extra", 0); + try("ed c0 81 0 0 0 0 80 a0 fd a9 17 a9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6", "window end", 0); + inf("2 8 20 80 0 3 0", "inflate_fast TYPE return", 0, -15, 258, + Z_STREAM_END); + inf("63 18 5 40 c 0", "window wrap", 3, -8, 300, Z_OK); +} + +/* cover remaining lines in inftrees.c */ +local void cover_trees(void) +{ + int ret; + unsigned bits; + unsigned short lens[16], work[16]; + code *next, table[ENOUGH_DISTS]; + + /* we need to call inflate_table() directly in order to manifest not- + enough errors, since zlib insures that enough is always enough */ + for (bits = 0; bits < 15; bits++) + lens[bits] = (unsigned short)(bits + 1); + lens[15] = 15; + next = table; + bits = 15; + ret = inflate_table(DISTS, lens, 16, &next, &bits, work); + assert(ret == 1); + next = table; + bits = 1; + ret = inflate_table(DISTS, lens, 16, &next, &bits, work); + assert(ret == 1); + fputs("inflate_table not enough errors\n", stderr); +} + +/* cover remaining inffast.c decoding and window copying */ +local void cover_fast(void) +{ + inf("e5 e0 81 ad 6d cb b2 2c c9 01 1e 59 63 ae 7d ee fb 4d fd b5 35 41 68" + " ff 7f 0f 0 0 0", "fast length extra bits", 0, -8, 258, Z_DATA_ERROR); + inf("25 fd 81 b5 6d 59 b6 6a 49 ea af 35 6 34 eb 8c b9 f6 b9 1e ef 67 49" + " 50 fe ff ff 3f 0 0", "fast distance extra bits", 0, -8, 258, + Z_DATA_ERROR); + inf("3 7e 0 0 0 0 0", "fast invalid distance code", 0, -8, 258, + Z_DATA_ERROR); + inf("1b 7 0 0 0 0 0", "fast invalid literal/length code", 0, -8, 258, + Z_DATA_ERROR); + inf("d c7 1 ae eb 38 c 4 41 a0 87 72 de df fb 1f b8 36 b1 38 5d ff ff 0", + "fast 2nd level codes and too far back", 0, -8, 258, Z_DATA_ERROR); + inf("63 18 5 8c 10 8 0 0 0 0", "very common case", 0, -8, 259, Z_OK); + inf("63 60 60 18 c9 0 8 18 18 18 26 c0 28 0 29 0 0 0", + "contiguous and wrap around window", 6, -8, 259, Z_OK); + inf("63 0 3 0 0 0 0 0", "copy direct from output", 0, -8, 259, + Z_STREAM_END); +} + +int main(void) +{ + fprintf(stderr, "%s\n", zlibVersion()); + cover_support(); + cover_wrap(); + cover_back(); + cover_inflate(); + cover_trees(); + cover_fast(); + return 0; +} diff --git a/externe_kniznice/zlib/test/minigzip.c b/externe_kniznice/zlib/test/minigzip.c new file mode 100644 index 0000000..e22fb08 --- /dev/null +++ b/externe_kniznice/zlib/test/minigzip.c @@ -0,0 +1,651 @@ +/* minigzip.c -- simulate gzip using the zlib compression library + * Copyright (C) 1995-2006, 2010, 2011, 2016 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * minigzip is a minimal implementation of the gzip utility. This is + * only an example of using zlib and isn't meant to replace the + * full-featured gzip. No attempt is made to deal with file systems + * limiting names to 14 or 8+3 characters, etc... Error checking is + * very limited. So use minigzip only for testing; use gzip for the + * real thing. On MSDOS, use only on file names without extension + * or in pipe mode. + */ + +/* @(#) $Id$ */ + +#include "zlib.h" +#include + +#ifdef STDC +# include +# include +#endif + +#ifdef USE_MMAP +# include +# include +# include +#endif + +#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) +# include +# include +# ifdef UNDER_CE +# include +# endif +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +#if defined(_MSC_VER) && _MSC_VER < 1900 +# define snprintf _snprintf +#endif + +#ifdef VMS +# define unlink delete +# define GZ_SUFFIX "-gz" +#endif +#ifdef RISCOS +# define unlink remove +# define GZ_SUFFIX "-gz" +# define fileno(file) file->__file +#endif +#if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fileno */ +#endif + +#if !defined(Z_HAVE_UNISTD_H) && !defined(_LARGEFILE64_SOURCE) +#ifndef WIN32 /* unlink already in stdio.h for WIN32 */ + extern int unlink OF((const char *)); +#endif +#endif + +#if defined(UNDER_CE) +# include +# define perror(s) pwinerror(s) + +/* Map the Windows error number in ERROR to a locale-dependent error + message string and return a pointer to it. Typically, the values + for ERROR come from GetLastError. + + The string pointed to shall not be modified by the application, + but may be overwritten by a subsequent call to strwinerror + + The strwinerror function does not change the current setting + of GetLastError. */ + +static char *strwinerror (error) + DWORD error; +{ + static char buf[1024]; + + wchar_t *msgbuf; + DWORD lasterr = GetLastError(); + DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, + error, + 0, /* Default language */ + (LPVOID)&msgbuf, + 0, + NULL); + if (chars != 0) { + /* If there is an \r\n appended, zap it. */ + if (chars >= 2 + && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { + chars -= 2; + msgbuf[chars] = 0; + } + + if (chars > sizeof (buf) - 1) { + chars = sizeof (buf) - 1; + msgbuf[chars] = 0; + } + + wcstombs(buf, msgbuf, chars + 1); + LocalFree(msgbuf); + } + else { + sprintf(buf, "unknown win32 error (%ld)", error); + } + + SetLastError(lasterr); + return buf; +} + +static void pwinerror (s) + const char *s; +{ + if (s && *s) + fprintf(stderr, "%s: %s\n", s, strwinerror(GetLastError ())); + else + fprintf(stderr, "%s\n", strwinerror(GetLastError ())); +} + +#endif /* UNDER_CE */ + +#ifndef GZ_SUFFIX +# define GZ_SUFFIX ".gz" +#endif +#define SUFFIX_LEN (sizeof(GZ_SUFFIX)-1) + +#define BUFLEN 16384 +#define MAX_NAME_LEN 1024 + +#ifdef MAXSEG_64K +# define local static + /* Needed for systems with limitation on stack size. */ +#else +# define local +#endif + +#ifdef Z_SOLO +/* for Z_SOLO, create simplified gz* functions using deflate and inflate */ + +#if defined(Z_HAVE_UNISTD_H) || defined(Z_LARGE) +# include /* for unlink() */ +#endif + +void *myalloc OF((void *, unsigned, unsigned)); +void myfree OF((void *, void *)); + +void *myalloc(q, n, m) + void *q; + unsigned n, m; +{ + (void)q; + return calloc(n, m); +} + +void myfree(q, p) + void *q, *p; +{ + (void)q; + free(p); +} + +typedef struct gzFile_s { + FILE *file; + int write; + int err; + char *msg; + z_stream strm; +} *gzFile; + +gzFile gzopen OF((const char *, const char *)); +gzFile gzdopen OF((int, const char *)); +gzFile gz_open OF((const char *, int, const char *)); + +gzFile gzopen(path, mode) +const char *path; +const char *mode; +{ + return gz_open(path, -1, mode); +} + +gzFile gzdopen(fd, mode) +int fd; +const char *mode; +{ + return gz_open(NULL, fd, mode); +} + +gzFile gz_open(path, fd, mode) + const char *path; + int fd; + const char *mode; +{ + gzFile gz; + int ret; + + gz = malloc(sizeof(struct gzFile_s)); + if (gz == NULL) + return NULL; + gz->write = strchr(mode, 'w') != NULL; + gz->strm.zalloc = myalloc; + gz->strm.zfree = myfree; + gz->strm.opaque = Z_NULL; + if (gz->write) + ret = deflateInit2(&(gz->strm), -1, 8, 15 + 16, 8, 0); + else { + gz->strm.next_in = 0; + gz->strm.avail_in = Z_NULL; + ret = inflateInit2(&(gz->strm), 15 + 16); + } + if (ret != Z_OK) { + free(gz); + return NULL; + } + gz->file = path == NULL ? fdopen(fd, gz->write ? "wb" : "rb") : + fopen(path, gz->write ? "wb" : "rb"); + if (gz->file == NULL) { + gz->write ? deflateEnd(&(gz->strm)) : inflateEnd(&(gz->strm)); + free(gz); + return NULL; + } + gz->err = 0; + gz->msg = ""; + return gz; +} + +int gzwrite OF((gzFile, const void *, unsigned)); + +int gzwrite(gz, buf, len) + gzFile gz; + const void *buf; + unsigned len; +{ + z_stream *strm; + unsigned char out[BUFLEN]; + + if (gz == NULL || !gz->write) + return 0; + strm = &(gz->strm); + strm->next_in = (void *)buf; + strm->avail_in = len; + do { + strm->next_out = out; + strm->avail_out = BUFLEN; + (void)deflate(strm, Z_NO_FLUSH); + fwrite(out, 1, BUFLEN - strm->avail_out, gz->file); + } while (strm->avail_out == 0); + return len; +} + +int gzread OF((gzFile, void *, unsigned)); + +int gzread(gz, buf, len) + gzFile gz; + void *buf; + unsigned len; +{ + int ret; + unsigned got; + unsigned char in[1]; + z_stream *strm; + + if (gz == NULL || gz->write) + return 0; + if (gz->err) + return 0; + strm = &(gz->strm); + strm->next_out = (void *)buf; + strm->avail_out = len; + do { + got = fread(in, 1, 1, gz->file); + if (got == 0) + break; + strm->next_in = in; + strm->avail_in = 1; + ret = inflate(strm, Z_NO_FLUSH); + if (ret == Z_DATA_ERROR) { + gz->err = Z_DATA_ERROR; + gz->msg = strm->msg; + return 0; + } + if (ret == Z_STREAM_END) + inflateReset(strm); + } while (strm->avail_out); + return len - strm->avail_out; +} + +int gzclose OF((gzFile)); + +int gzclose(gz) + gzFile gz; +{ + z_stream *strm; + unsigned char out[BUFLEN]; + + if (gz == NULL) + return Z_STREAM_ERROR; + strm = &(gz->strm); + if (gz->write) { + strm->next_in = Z_NULL; + strm->avail_in = 0; + do { + strm->next_out = out; + strm->avail_out = BUFLEN; + (void)deflate(strm, Z_FINISH); + fwrite(out, 1, BUFLEN - strm->avail_out, gz->file); + } while (strm->avail_out == 0); + deflateEnd(strm); + } + else + inflateEnd(strm); + fclose(gz->file); + free(gz); + return Z_OK; +} + +const char *gzerror OF((gzFile, int *)); + +const char *gzerror(gz, err) + gzFile gz; + int *err; +{ + *err = gz->err; + return gz->msg; +} + +#endif + +static char *prog; + +void error OF((const char *msg)); +void gz_compress OF((FILE *in, gzFile out)); +#ifdef USE_MMAP +int gz_compress_mmap OF((FILE *in, gzFile out)); +#endif +void gz_uncompress OF((gzFile in, FILE *out)); +void file_compress OF((char *file, char *mode)); +void file_uncompress OF((char *file)); +int main OF((int argc, char *argv[])); + +/* =========================================================================== + * Display error message and exit + */ +void error(msg) + const char *msg; +{ + fprintf(stderr, "%s: %s\n", prog, msg); + exit(1); +} + +/* =========================================================================== + * Compress input to output then close both files. + */ + +void gz_compress(in, out) + FILE *in; + gzFile out; +{ + local char buf[BUFLEN]; + int len; + int err; + +#ifdef USE_MMAP + /* Try first compressing with mmap. If mmap fails (minigzip used in a + * pipe), use the normal fread loop. + */ + if (gz_compress_mmap(in, out) == Z_OK) return; +#endif + for (;;) { + len = (int)fread(buf, 1, sizeof(buf), in); + if (ferror(in)) { + perror("fread"); + exit(1); + } + if (len == 0) break; + + if (gzwrite(out, buf, (unsigned)len) != len) error(gzerror(out, &err)); + } + fclose(in); + if (gzclose(out) != Z_OK) error("failed gzclose"); +} + +#ifdef USE_MMAP /* MMAP version, Miguel Albrecht */ + +/* Try compressing the input file at once using mmap. Return Z_OK if + * if success, Z_ERRNO otherwise. + */ +int gz_compress_mmap(in, out) + FILE *in; + gzFile out; +{ + int len; + int err; + int ifd = fileno(in); + caddr_t buf; /* mmap'ed buffer for the entire input file */ + off_t buf_len; /* length of the input file */ + struct stat sb; + + /* Determine the size of the file, needed for mmap: */ + if (fstat(ifd, &sb) < 0) return Z_ERRNO; + buf_len = sb.st_size; + if (buf_len <= 0) return Z_ERRNO; + + /* Now do the actual mmap: */ + buf = mmap((caddr_t) 0, buf_len, PROT_READ, MAP_SHARED, ifd, (off_t)0); + if (buf == (caddr_t)(-1)) return Z_ERRNO; + + /* Compress the whole file at once: */ + len = gzwrite(out, (char *)buf, (unsigned)buf_len); + + if (len != (int)buf_len) error(gzerror(out, &err)); + + munmap(buf, buf_len); + fclose(in); + if (gzclose(out) != Z_OK) error("failed gzclose"); + return Z_OK; +} +#endif /* USE_MMAP */ + +/* =========================================================================== + * Uncompress input to output then close both files. + */ +void gz_uncompress(in, out) + gzFile in; + FILE *out; +{ + local char buf[BUFLEN]; + int len; + int err; + + for (;;) { + len = gzread(in, buf, sizeof(buf)); + if (len < 0) error (gzerror(in, &err)); + if (len == 0) break; + + if ((int)fwrite(buf, 1, (unsigned)len, out) != len) { + error("failed fwrite"); + } + } + if (fclose(out)) error("failed fclose"); + + if (gzclose(in) != Z_OK) error("failed gzclose"); +} + + +/* =========================================================================== + * Compress the given file: create a corresponding .gz file and remove the + * original. + */ +void file_compress(file, mode) + char *file; + char *mode; +{ + local char outfile[MAX_NAME_LEN]; + FILE *in; + gzFile out; + + if (strlen(file) + strlen(GZ_SUFFIX) >= sizeof(outfile)) { + fprintf(stderr, "%s: filename too long\n", prog); + exit(1); + } + +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(outfile, sizeof(outfile), "%s%s", file, GZ_SUFFIX); +#else + strcpy(outfile, file); + strcat(outfile, GZ_SUFFIX); +#endif + + in = fopen(file, "rb"); + if (in == NULL) { + perror(file); + exit(1); + } + out = gzopen(outfile, mode); + if (out == NULL) { + fprintf(stderr, "%s: can't gzopen %s\n", prog, outfile); + exit(1); + } + gz_compress(in, out); + + unlink(file); +} + + +/* =========================================================================== + * Uncompress the given file and remove the original. + */ +void file_uncompress(file) + char *file; +{ + local char buf[MAX_NAME_LEN]; + char *infile, *outfile; + FILE *out; + gzFile in; + unsigned len = strlen(file); + + if (len + strlen(GZ_SUFFIX) >= sizeof(buf)) { + fprintf(stderr, "%s: filename too long\n", prog); + exit(1); + } + +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(buf, sizeof(buf), "%s", file); +#else + strcpy(buf, file); +#endif + + if (len > SUFFIX_LEN && strcmp(file+len-SUFFIX_LEN, GZ_SUFFIX) == 0) { + infile = file; + outfile = buf; + outfile[len-3] = '\0'; + } else { + outfile = file; + infile = buf; +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(buf + len, sizeof(buf) - len, "%s", GZ_SUFFIX); +#else + strcat(infile, GZ_SUFFIX); +#endif + } + in = gzopen(infile, "rb"); + if (in == NULL) { + fprintf(stderr, "%s: can't gzopen %s\n", prog, infile); + exit(1); + } + out = fopen(outfile, "wb"); + if (out == NULL) { + perror(file); + exit(1); + } + + gz_uncompress(in, out); + + unlink(infile); +} + + +/* =========================================================================== + * Usage: minigzip [-c] [-d] [-f] [-h] [-r] [-1 to -9] [files...] + * -c : write to standard output + * -d : decompress + * -f : compress with Z_FILTERED + * -h : compress with Z_HUFFMAN_ONLY + * -r : compress with Z_RLE + * -1 to -9 : compression level + */ + +int main(argc, argv) + int argc; + char *argv[]; +{ + int copyout = 0; + int uncompr = 0; + gzFile file; + char *bname, outmode[20]; + +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(outmode, sizeof(outmode), "%s", "wb6 "); +#else + strcpy(outmode, "wb6 "); +#endif + + prog = argv[0]; + bname = strrchr(argv[0], '/'); + if (bname) + bname++; + else + bname = argv[0]; + argc--, argv++; + + if (!strcmp(bname, "gunzip")) + uncompr = 1; + else if (!strcmp(bname, "zcat")) + copyout = uncompr = 1; + + while (argc > 0) { + if (strcmp(*argv, "-c") == 0) + copyout = 1; + else if (strcmp(*argv, "-d") == 0) + uncompr = 1; + else if (strcmp(*argv, "-f") == 0) + outmode[3] = 'f'; + else if (strcmp(*argv, "-h") == 0) + outmode[3] = 'h'; + else if (strcmp(*argv, "-r") == 0) + outmode[3] = 'R'; + else if ((*argv)[0] == '-' && (*argv)[1] >= '1' && (*argv)[1] <= '9' && + (*argv)[2] == 0) + outmode[2] = (*argv)[1]; + else + break; + argc--, argv++; + } + if (outmode[3] == ' ') + outmode[3] = 0; + if (argc == 0) { + SET_BINARY_MODE(stdin); + SET_BINARY_MODE(stdout); + if (uncompr) { + file = gzdopen(fileno(stdin), "rb"); + if (file == NULL) error("can't gzdopen stdin"); + gz_uncompress(file, stdout); + } else { + file = gzdopen(fileno(stdout), outmode); + if (file == NULL) error("can't gzdopen stdout"); + gz_compress(stdin, file); + } + } else { + if (copyout) { + SET_BINARY_MODE(stdout); + } + do { + if (uncompr) { + if (copyout) { + file = gzopen(*argv, "rb"); + if (file == NULL) + fprintf(stderr, "%s: can't gzopen %s\n", prog, *argv); + else + gz_uncompress(file, stdout); + } else { + file_uncompress(*argv); + } + } else { + if (copyout) { + FILE * in = fopen(*argv, "rb"); + + if (in == NULL) { + perror(*argv); + } else { + file = gzdopen(fileno(stdout), outmode); + if (file == NULL) error("can't gzdopen stdout"); + + gz_compress(in, file); + } + + } else { + file_compress(*argv, outmode); + } + } + } while (argv++, --argc); + } + return 0; +} diff --git a/externe_kniznice/zlib/treebuild.xml b/externe_kniznice/zlib/treebuild.xml new file mode 100644 index 0000000..fd75525 --- /dev/null +++ b/externe_kniznice/zlib/treebuild.xml @@ -0,0 +1,116 @@ + + + + zip compression library + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/externe_kniznice/zlib/trees.c b/externe_kniznice/zlib/trees.c new file mode 100644 index 0000000..50cf4b4 --- /dev/null +++ b/externe_kniznice/zlib/trees.c @@ -0,0 +1,1203 @@ +/* trees.c -- output deflated data using Huffman coding + * Copyright (C) 1995-2017 Jean-loup Gailly + * detect_data_type() function provided freely by Cosmin Truta, 2006 + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process uses several Huffman trees. The more + * common source values are represented by shorter bit sequences. + * + * Each code tree is stored in a compressed form which is itself + * a Huffman encoding of the lengths of all the code strings (in + * ascending order by source values). The actual code strings are + * reconstructed from the lengths in the inflate process, as described + * in the deflate specification. + * + * REFERENCES + * + * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". + * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc + * + * Storer, James A. + * Data Compression: Methods and Theory, pp. 49-50. + * Computer Science Press, 1988. ISBN 0-7167-8156-5. + * + * Sedgewick, R. + * Algorithms, p290. + * Addison-Wesley, 1983. ISBN 0-201-06672-6. + */ + +/* @(#) $Id$ */ + +/* #define GEN_TREES_H */ + +#include "deflate.h" + +#ifdef ZLIB_DEBUG +# include +#endif + +/* =========================================================================== + * Constants + */ + +#define MAX_BL_BITS 7 +/* Bit length codes must not exceed MAX_BL_BITS bits */ + +#define END_BLOCK 256 +/* end of block literal code */ + +#define REP_3_6 16 +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + +#define REPZ_3_10 17 +/* repeat a zero length 3-10 times (3 bits of repeat count) */ + +#define REPZ_11_138 18 +/* repeat a zero length 11-138 times (7 bits of repeat count) */ + +local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ + = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; + +local const int extra_dbits[D_CODES] /* extra bits for each distance code */ + = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ + = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; + +local const uch bl_order[BL_CODES] + = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; +/* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + +/* =========================================================================== + * Local data. These are initialized only once. + */ + +#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ + +#if defined(GEN_TREES_H) || !defined(STDC) +/* non ANSI compilers may not accept trees.h */ + +local ct_data static_ltree[L_CODES+2]; +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + +local ct_data static_dtree[D_CODES]; +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + +uch _dist_code[DIST_CODE_LEN]; +/* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + +uch _length_code[MAX_MATCH-MIN_MATCH+1]; +/* length code for each normalized match length (0 == MIN_MATCH) */ + +local int base_length[LENGTH_CODES]; +/* First normalized length for each code (0 = MIN_MATCH) */ + +local int base_dist[D_CODES]; +/* First normalized distance for each code (0 = distance of 1) */ + +#else +# include "trees.h" +#endif /* GEN_TREES_H */ + +struct static_tree_desc_s { + const ct_data *static_tree; /* static tree or NULL */ + const intf *extra_bits; /* extra bits for each code or NULL */ + int extra_base; /* base index for extra_bits */ + int elems; /* max number of elements in the tree */ + int max_length; /* max bit length for the codes */ +}; + +local const static_tree_desc static_l_desc = +{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; + +local const static_tree_desc static_d_desc = +{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; + +local const static_tree_desc static_bl_desc = +{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; + +/* =========================================================================== + * Local (static) routines in this file. + */ + +local void tr_static_init OF((void)); +local void init_block OF((deflate_state *s)); +local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); +local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); +local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); +local void build_tree OF((deflate_state *s, tree_desc *desc)); +local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local int build_bl_tree OF((deflate_state *s)); +local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, + int blcodes)); +local void compress_block OF((deflate_state *s, const ct_data *ltree, + const ct_data *dtree)); +local int detect_data_type OF((deflate_state *s)); +local unsigned bi_reverse OF((unsigned value, int length)); +local void bi_windup OF((deflate_state *s)); +local void bi_flush OF((deflate_state *s)); + +#ifdef GEN_TREES_H +local void gen_trees_header OF((void)); +#endif + +#ifndef ZLIB_DEBUG +# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) + /* Send a code of the given tree. c and tree must not have side effects */ + +#else /* !ZLIB_DEBUG */ +# define send_code(s, c, tree) \ + { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ + send_bits(s, tree[c].Code, tree[c].Len); } +#endif + +/* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +#define put_short(s, w) { \ + put_byte(s, (uch)((w) & 0xff)); \ + put_byte(s, (uch)((ush)(w) >> 8)); \ +} + +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +#ifdef ZLIB_DEBUG +local void send_bits OF((deflate_state *s, int value, int length)); + +local void send_bits(s, value, length) + deflate_state *s; + int value; /* value to send */ + int length; /* number of bits */ +{ + Tracevv((stderr," l %2d v %4x ", length, value)); + Assert(length > 0 && length <= 15, "invalid length"); + s->bits_sent += (ulg)length; + + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (s->bi_valid > (int)Buf_size - length) { + s->bi_buf |= (ush)value << s->bi_valid; + put_short(s, s->bi_buf); + s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); + s->bi_valid += length - Buf_size; + } else { + s->bi_buf |= (ush)value << s->bi_valid; + s->bi_valid += length; + } +} +#else /* !ZLIB_DEBUG */ + +#define send_bits(s, value, length) \ +{ int len = length;\ + if (s->bi_valid > (int)Buf_size - len) {\ + int val = (int)value;\ + s->bi_buf |= (ush)val << s->bi_valid;\ + put_short(s, s->bi_buf);\ + s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ + s->bi_valid += len - Buf_size;\ + } else {\ + s->bi_buf |= (ush)(value) << s->bi_valid;\ + s->bi_valid += len;\ + }\ +} +#endif /* ZLIB_DEBUG */ + + +/* the arguments must not have side effects */ + +/* =========================================================================== + * Initialize the various 'constant' tables. + */ +local void tr_static_init() +{ +#if defined(GEN_TREES_H) || !defined(STDC) + static int static_init_done = 0; + int n; /* iterates over tree elements */ + int bits; /* bit counter */ + int length; /* length value */ + int code; /* code value */ + int dist; /* distance index */ + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + if (static_init_done) return; + + /* For some embedded targets, global variables are not initialized: */ +#ifdef NO_INIT_GLOBAL_POINTERS + static_l_desc.static_tree = static_ltree; + static_l_desc.extra_bits = extra_lbits; + static_d_desc.static_tree = static_dtree; + static_d_desc.extra_bits = extra_dbits; + static_bl_desc.extra_bits = extra_blbits; +#endif + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES-1; code++) { + base_length[code] = length; + for (n = 0; n < (1< dist code (0..29) */ + dist = 0; + for (code = 0 ; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ + for ( ; code < D_CODES; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { + _dist_code[256 + dist++] = (uch)code; + } + } + Assert (dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; + n = 0; + while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; + while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; + while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; + while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES; n++) { + static_dtree[n].Len = 5; + static_dtree[n].Code = bi_reverse((unsigned)n, 5); + } + static_init_done = 1; + +# ifdef GEN_TREES_H + gen_trees_header(); +# endif +#endif /* defined(GEN_TREES_H) || !defined(STDC) */ +} + +/* =========================================================================== + * Genererate the file trees.h describing the static trees. + */ +#ifdef GEN_TREES_H +# ifndef ZLIB_DEBUG +# include +# endif + +# define SEPARATOR(i, last, width) \ + ((i) == (last)? "\n};\n\n" : \ + ((i) % (width) == (width)-1 ? ",\n" : ", ")) + +void gen_trees_header() +{ + FILE *header = fopen("trees.h", "w"); + int i; + + Assert (header != NULL, "Can't open trees.h"); + fprintf(header, + "/* header created automatically with -DGEN_TREES_H */\n\n"); + + fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); + for (i = 0; i < L_CODES+2; i++) { + fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, + static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); + } + + fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, + static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); + } + + fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); + for (i = 0; i < DIST_CODE_LEN; i++) { + fprintf(header, "%2u%s", _dist_code[i], + SEPARATOR(i, DIST_CODE_LEN-1, 20)); + } + + fprintf(header, + "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); + for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { + fprintf(header, "%2u%s", _length_code[i], + SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); + } + + fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); + for (i = 0; i < LENGTH_CODES; i++) { + fprintf(header, "%1u%s", base_length[i], + SEPARATOR(i, LENGTH_CODES-1, 20)); + } + + fprintf(header, "local const int base_dist[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "%5u%s", base_dist[i], + SEPARATOR(i, D_CODES-1, 10)); + } + + fclose(header); +} +#endif /* GEN_TREES_H */ + +/* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ +void ZLIB_INTERNAL _tr_init(s) + deflate_state *s; +{ + tr_static_init(); + + s->l_desc.dyn_tree = s->dyn_ltree; + s->l_desc.stat_desc = &static_l_desc; + + s->d_desc.dyn_tree = s->dyn_dtree; + s->d_desc.stat_desc = &static_d_desc; + + s->bl_desc.dyn_tree = s->bl_tree; + s->bl_desc.stat_desc = &static_bl_desc; + + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef ZLIB_DEBUG + s->compressed_len = 0L; + s->bits_sent = 0L; +#endif + + /* Initialize the first block of the first file: */ + init_block(s); +} + +/* =========================================================================== + * Initialize a new block. + */ +local void init_block(s) + deflate_state *s; +{ + int n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; + for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; + for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; + + s->dyn_ltree[END_BLOCK].Freq = 1; + s->opt_len = s->static_len = 0L; + s->last_lit = s->matches = 0; +} + +#define SMALLEST 1 +/* Index within the heap array of least frequent node in the Huffman tree */ + + +/* =========================================================================== + * Remove the smallest element from the heap and recreate the heap with + * one less element. Updates heap and heap_len. + */ +#define pqremove(s, tree, top) \ +{\ + top = s->heap[SMALLEST]; \ + s->heap[SMALLEST] = s->heap[s->heap_len--]; \ + pqdownheap(s, tree, SMALLEST); \ +} + +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +#define smaller(tree, n, m, depth) \ + (tree[n].Freq < tree[m].Freq || \ + (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) + +/* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ +local void pqdownheap(s, tree, k) + deflate_state *s; + ct_data *tree; /* the tree to restore */ + int k; /* node to move down */ +{ + int v = s->heap[k]; + int j = k << 1; /* left son of k */ + while (j <= s->heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s->heap_len && + smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s->heap[j], s->depth)) break; + + /* Exchange v with the smallest son */ + s->heap[k] = s->heap[j]; k = j; + + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s->heap[k] = v; +} + +/* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ +local void gen_bitlen(s, desc) + deflate_state *s; + tree_desc *desc; /* the tree descriptor */ +{ + ct_data *tree = desc->dyn_tree; + int max_code = desc->max_code; + const ct_data *stree = desc->stat_desc->static_tree; + const intf *extra = desc->stat_desc->extra_bits; + int base = desc->stat_desc->extra_base; + int max_length = desc->stat_desc->max_length; + int h; /* heap index */ + int n, m; /* iterate over the tree elements */ + int bits; /* bit length */ + int xbits; /* extra bits */ + ush f; /* frequency */ + int overflow = 0; /* number of elements with bit length too large */ + + for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ + + for (h = s->heap_max+1; h < HEAP_SIZE; h++) { + n = s->heap[h]; + bits = tree[tree[n].Dad].Len + 1; + if (bits > max_length) bits = max_length, overflow++; + tree[n].Len = (ush)bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + if (n > max_code) continue; /* not a leaf node */ + + s->bl_count[bits]++; + xbits = 0; + if (n >= base) xbits = extra[n-base]; + f = tree[n].Freq; + s->opt_len += (ulg)f * (unsigned)(bits + xbits); + if (stree) s->static_len += (ulg)f * (unsigned)(stree[n].Len + xbits); + } + if (overflow == 0) return; + + Tracev((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length-1; + while (s->bl_count[bits] == 0) bits--; + s->bl_count[bits]--; /* move one leaf down the tree */ + s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s->bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits != 0; bits--) { + n = s->bl_count[bits]; + while (n != 0) { + m = s->heap[--h]; + if (m > max_code) continue; + if ((unsigned) tree[m].Len != (unsigned) bits) { + Tracev((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s->opt_len += ((ulg)bits - tree[m].Len) * tree[m].Freq; + tree[m].Len = (ush)bits; + } + n--; + } + } +} + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +local void gen_codes (tree, max_code, bl_count) + ct_data *tree; /* the tree to decorate */ + int max_code; /* largest code with non zero frequency */ + ushf *bl_count; /* number of codes at each bit length */ +{ + ush next_code[MAX_BITS+1]; /* next code value for each bit length */ + unsigned code = 0; /* running code value */ + int bits; /* bit index */ + int n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + code = (code + bl_count[bits-1]) << 1; + next_code[bits] = (ush)code; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; + const ct_data *stree = desc->stat_desc->static_tree; + int elems = desc->stat_desc->elems; + int n, m; /* iterate over heap elements */ + int max_code = -1; /* largest code with non zero frequency */ + int node; /* new node being created */ + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s->heap_len = 0, s->heap_max = HEAP_SIZE; + + for (n = 0; n < elems; n++) { + if (tree[n].Freq != 0) { + s->heap[++(s->heap_len)] = max_code = n; + s->depth[n] = 0; + } else { + tree[n].Len = 0; + } + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s->heap_len < 2) { + node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); + tree[node].Freq = 1; + s->depth[node] = 0; + s->opt_len--; if (stree) s->static_len -= stree[node].Len; + /* node is 0 or 1 so it does not have extra bits */ + } + desc->max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + pqremove(s, tree, n); /* n = node of least frequency */ + m = s->heap[SMALLEST]; /* m = node of next least frequency */ + + s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ + s->heap[--(s->heap_max)] = m; + + /* Create a new node father of n and m */ + tree[node].Freq = tree[n].Freq + tree[m].Freq; + s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? + s->depth[n] : s->depth[m]) + 1); + tree[n].Dad = tree[m].Dad = (ush)node; +#ifdef DUMP_BL_TREE + if (tree == s->bl_tree) { + fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", + node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); + } +#endif + /* and insert the new node in the heap */ + s->heap[SMALLEST] = node++; + pqdownheap(s, tree, SMALLEST); + + } while (s->heap_len >= 2); + + s->heap[--(s->heap_max)] = s->heap[SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, (tree_desc *)desc); + + /* The field len is now set, we can generate the bit codes */ + gen_codes ((ct_data *)tree, max_code, s->bl_count); +} + +/* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ +local void scan_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + if (nextlen == 0) max_count = 138, min_count = 3; + tree[max_code+1].Len = (ush)0xffff; /* guard */ + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + s->bl_tree[curlen].Freq += count; + } else if (curlen != 0) { + if (curlen != prevlen) s->bl_tree[curlen].Freq++; + s->bl_tree[REP_3_6].Freq++; + } else if (count <= 10) { + s->bl_tree[REPZ_3_10].Freq++; + } else { + s->bl_tree[REPZ_11_138].Freq++; + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ +local void send_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen == 0) max_count = 138, min_count = 3; + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + do { send_code(s, curlen, s->bl_tree); } while (--count != 0); + + } else if (curlen != 0) { + if (curlen != prevlen) { + send_code(s, curlen, s->bl_tree); count--; + } + Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); + + } else if (count <= 10) { + send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); + + } else { + send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +local int build_bl_tree(s) + deflate_state *s; +{ + int max_blindex; /* index of last bit length code of non zero freq */ + + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); + scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); + + /* Build the bit length tree: */ + build_tree(s, (tree_desc *)(&(s->bl_desc))); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { + if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; + } + /* Update opt_len to include the bit length tree and counts */ + s->opt_len += 3*((ulg)max_blindex+1) + 5+5+4; + Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + s->opt_len, s->static_len)); + + return max_blindex; +} + +/* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ +local void send_all_trees(s, lcodes, dcodes, blcodes) + deflate_state *s; + int lcodes, dcodes, blcodes; /* number of codes for each tree */ +{ + int rank; /* index in bl_order */ + + Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + "too many codes"); + Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes-1, 5); + send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); + } + Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ + Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ + Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); +} + +/* =========================================================================== + * Send a stored block + */ +void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) + deflate_state *s; + charf *buf; /* input block */ + ulg stored_len; /* length of input block */ + int last; /* one if this is the last block for a file */ +{ + send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ + bi_windup(s); /* align on byte boundary */ + put_short(s, (ush)stored_len); + put_short(s, (ush)~stored_len); + zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len); + s->pending += stored_len; +#ifdef ZLIB_DEBUG + s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; + s->compressed_len += (stored_len + 4) << 3; + s->bits_sent += 2*16; + s->bits_sent += stored_len<<3; +#endif +} + +/* =========================================================================== + * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) + */ +void ZLIB_INTERNAL _tr_flush_bits(s) + deflate_state *s; +{ + bi_flush(s); +} + +/* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + */ +void ZLIB_INTERNAL _tr_align(s) + deflate_state *s; +{ + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef ZLIB_DEBUG + s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ +#endif + bi_flush(s); +} + +/* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and write out the encoded block. + */ +void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) + deflate_state *s; + charf *buf; /* input block, or NULL if too old */ + ulg stored_len; /* length of input block */ + int last; /* one if this is the last block for a file */ +{ + ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + int max_blindex = 0; /* index of last bit length code of non zero freq */ + + /* Build the Huffman trees unless a stored block is forced */ + if (s->level > 0) { + + /* Check if the file is binary or text */ + if (s->strm->data_type == Z_UNKNOWN) + s->strm->data_type = detect_data_type(s); + + /* Construct the literal and distance trees */ + build_tree(s, (tree_desc *)(&(s->l_desc))); + Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + + build_tree(s, (tree_desc *)(&(s->d_desc))); + Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s->opt_len+3+7)>>3; + static_lenb = (s->static_len+3+7)>>3; + + Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + s->last_lit)); + + if (static_lenb <= opt_lenb) opt_lenb = static_lenb; + + } else { + Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ + } + +#ifdef FORCE_STORED + if (buf != (char*)0) { /* force stored block */ +#else + if (stored_len+4 <= opt_lenb && buf != (char*)0) { + /* 4: two words for the lengths */ +#endif + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block(s, buf, stored_len, last); + +#ifdef FORCE_STATIC + } else if (static_lenb >= 0) { /* force static trees */ +#else + } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { +#endif + send_bits(s, (STATIC_TREES<<1)+last, 3); + compress_block(s, (const ct_data *)static_ltree, + (const ct_data *)static_dtree); +#ifdef ZLIB_DEBUG + s->compressed_len += 3 + s->static_len; +#endif + } else { + send_bits(s, (DYN_TREES<<1)+last, 3); + send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, + max_blindex+1); + compress_block(s, (const ct_data *)s->dyn_ltree, + (const ct_data *)s->dyn_dtree); +#ifdef ZLIB_DEBUG + s->compressed_len += 3 + s->opt_len; +#endif + } + Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block(s); + + if (last) { + bi_windup(s); +#ifdef ZLIB_DEBUG + s->compressed_len += 7; /* align on byte boundary */ +#endif + } + Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + s->compressed_len-7*last)); +} + +/* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ +int ZLIB_INTERNAL _tr_tally (s, dist, lc) + deflate_state *s; + unsigned dist; /* distance of matched string */ + unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ +{ + s->d_buf[s->last_lit] = (ush)dist; + s->l_buf[s->last_lit++] = (uch)lc; + if (dist == 0) { + /* lc is the unmatched char */ + s->dyn_ltree[lc].Freq++; + } else { + s->matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + Assert((ush)dist < (ush)MAX_DIST(s) && + (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; + s->dyn_dtree[d_code(dist)].Freq++; + } + +#ifdef TRUNCATE_BLOCK + /* Try to guess if it is profitable to stop the current block here */ + if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { + /* Compute an upper bound for the compressed length */ + ulg out_length = (ulg)s->last_lit*8L; + ulg in_length = (ulg)((long)s->strstart - s->block_start); + int dcode; + for (dcode = 0; dcode < D_CODES; dcode++) { + out_length += (ulg)s->dyn_dtree[dcode].Freq * + (5L+extra_dbits[dcode]); + } + out_length >>= 3; + Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", + s->last_lit, in_length, out_length, + 100L - out_length*100L/in_length)); + if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; + } +#endif + return (s->last_lit == s->lit_bufsize-1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ +} + +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +local void compress_block(s, ltree, dtree) + deflate_state *s; + const ct_data *ltree; /* literal tree */ + const ct_data *dtree; /* distance tree */ +{ + unsigned dist; /* distance of matched string */ + int lc; /* match length or unmatched char (if dist == 0) */ + unsigned lx = 0; /* running index in l_buf */ + unsigned code; /* the code to send */ + int extra; /* number of extra bits to send */ + + if (s->last_lit != 0) do { + dist = s->d_buf[lx]; + lc = s->l_buf[lx++]; + if (dist == 0) { + send_code(s, lc, ltree); /* send a literal byte */ + Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code+LITERALS+1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra != 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra != 0) { + dist -= (unsigned)base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + "pendingBuf overflow"); + + } while (lx < s->last_lit); + + send_code(s, END_BLOCK, ltree); +} + +/* =========================================================================== + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "black list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). + * IN assertion: the fields Freq of dyn_ltree are set. + */ +local int detect_data_type(s) + deflate_state *s; +{ + /* black_mask is the bit mask of black-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + unsigned long black_mask = 0xf3ffc07fUL; + int n; + + /* Check for non-textual ("black-listed") bytes. */ + for (n = 0; n <= 31; n++, black_mask >>= 1) + if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) + return Z_BINARY; + + /* Check for textual ("white-listed") bytes. */ + if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 + || s->dyn_ltree[13].Freq != 0) + return Z_TEXT; + for (n = 32; n < LITERALS; n++) + if (s->dyn_ltree[n].Freq != 0) + return Z_TEXT; + + /* There are no "black-listed" or "white-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; +} + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +local unsigned bi_reverse(code, len) + unsigned code; /* the value to invert */ + int len; /* its bit length */ +{ + register unsigned res = 0; + do { + res |= code & 1; + code >>= 1, res <<= 1; + } while (--len > 0); + return res >> 1; +} + +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +local void bi_flush(s) + deflate_state *s; +{ + if (s->bi_valid == 16) { + put_short(s, s->bi_buf); + s->bi_buf = 0; + s->bi_valid = 0; + } else if (s->bi_valid >= 8) { + put_byte(s, (Byte)s->bi_buf); + s->bi_buf >>= 8; + s->bi_valid -= 8; + } +} + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +local void bi_windup(s) + deflate_state *s; +{ + if (s->bi_valid > 8) { + put_short(s, s->bi_buf); + } else if (s->bi_valid > 0) { + put_byte(s, (Byte)s->bi_buf); + } + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef ZLIB_DEBUG + s->bits_sent = (s->bits_sent+7) & ~7; +#endif +} diff --git a/externe_kniznice/zlib/trees.h b/externe_kniznice/zlib/trees.h new file mode 100644 index 0000000..d35639d --- /dev/null +++ b/externe_kniznice/zlib/trees.h @@ -0,0 +1,128 @@ +/* header created automatically with -DGEN_TREES_H */ + +local const ct_data static_ltree[L_CODES+2] = { +{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, +{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, +{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, +{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, +{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, +{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, +{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, +{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, +{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, +{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, +{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, +{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, +{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, +{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, +{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, +{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, +{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, +{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, +{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, +{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, +{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, +{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, +{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, +{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, +{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, +{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, +{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, +{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, +{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, +{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, +{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, +{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, +{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, +{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, +{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, +{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, +{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, +{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, +{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, +{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, +{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, +{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, +{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, +{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, +{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, +{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, +{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, +{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, +{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, +{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, +{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, +{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, +{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, +{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, +{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, +{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, +{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, +{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} +}; + +local const ct_data static_dtree[D_CODES] = { +{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, +{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, +{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, +{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, +{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, +{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} +}; + +const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { + 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, +10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, +11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, +12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, +18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 +}; + +const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, +13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, +17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, +19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, +21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, +22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 +}; + +local const int base_length[LENGTH_CODES] = { +0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, +64, 80, 96, 112, 128, 160, 192, 224, 0 +}; + +local const int base_dist[D_CODES] = { + 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, + 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, + 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 +}; + diff --git a/externe_kniznice/zlib/uncompr.c b/externe_kniznice/zlib/uncompr.c new file mode 100644 index 0000000..f03a1a8 --- /dev/null +++ b/externe_kniznice/zlib/uncompr.c @@ -0,0 +1,93 @@ +/* uncompr.c -- decompress a memory buffer + * Copyright (C) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Decompresses the source buffer into the destination buffer. *sourceLen is + the byte length of the source buffer. Upon entry, *destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, + *destLen is the size of the decompressed data and *sourceLen is the number + of source bytes consumed. Upon return, source + *sourceLen points to the + first unused input byte. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, or + Z_DATA_ERROR if the input data was corrupted, including if the input data is + an incomplete zlib stream. +*/ +int ZEXPORT uncompress2 (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong *sourceLen; +{ + z_stream stream; + int err; + const uInt max = (uInt)-1; + uLong len, left; + Byte buf[1]; /* for detection of incomplete stream when *destLen == 0 */ + + len = *sourceLen; + if (*destLen) { + left = *destLen; + *destLen = 0; + } + else { + left = 1; + dest = buf; + } + + stream.next_in = (z_const Bytef *)source; + stream.avail_in = 0; + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + + err = inflateInit(&stream); + if (err != Z_OK) return err; + + stream.next_out = dest; + stream.avail_out = 0; + + do { + if (stream.avail_out == 0) { + stream.avail_out = left > (uLong)max ? max : (uInt)left; + left -= stream.avail_out; + } + if (stream.avail_in == 0) { + stream.avail_in = len > (uLong)max ? max : (uInt)len; + len -= stream.avail_in; + } + err = inflate(&stream, Z_NO_FLUSH); + } while (err == Z_OK); + + *sourceLen -= len + stream.avail_in; + if (dest != buf) + *destLen = stream.total_out; + else if (stream.total_out && err == Z_BUF_ERROR) + left = 1; + + inflateEnd(&stream); + return err == Z_STREAM_END ? Z_OK : + err == Z_NEED_DICT ? Z_DATA_ERROR : + err == Z_BUF_ERROR && left + stream.avail_out ? Z_DATA_ERROR : + err; +} + +int ZEXPORT uncompress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + return uncompress2(dest, destLen, source, &sourceLen); +} diff --git a/externe_kniznice/zlib/watcom/watcom_f.mak b/externe_kniznice/zlib/watcom/watcom_f.mak new file mode 100644 index 0000000..37f4d74 --- /dev/null +++ b/externe_kniznice/zlib/watcom/watcom_f.mak @@ -0,0 +1,43 @@ +# Makefile for zlib +# OpenWatcom flat model +# Last updated: 28-Dec-2005 + +# To use, do "wmake -f watcom_f.mak" + +C_SOURCE = adler32.c compress.c crc32.c deflate.c & + gzclose.c gzlib.c gzread.c gzwrite.c & + infback.c inffast.c inflate.c inftrees.c & + trees.c uncompr.c zutil.c + +OBJS = adler32.obj compress.obj crc32.obj deflate.obj & + gzclose.obj gzlib.obj gzread.obj gzwrite.obj & + infback.obj inffast.obj inflate.obj inftrees.obj & + trees.obj uncompr.obj zutil.obj + +CC = wcc386 +LINKER = wcl386 +CFLAGS = -zq -mf -3r -fp3 -s -bt=dos -oilrtfm -fr=nul -wx +ZLIB_LIB = zlib_f.lib + +.C.OBJ: + $(CC) $(CFLAGS) $[@ + +all: $(ZLIB_LIB) example.exe minigzip.exe + +$(ZLIB_LIB): $(OBJS) + wlib -b -c $(ZLIB_LIB) -+adler32.obj -+compress.obj -+crc32.obj + wlib -b -c $(ZLIB_LIB) -+gzclose.obj -+gzlib.obj -+gzread.obj -+gzwrite.obj + wlib -b -c $(ZLIB_LIB) -+deflate.obj -+infback.obj + wlib -b -c $(ZLIB_LIB) -+inffast.obj -+inflate.obj -+inftrees.obj + wlib -b -c $(ZLIB_LIB) -+trees.obj -+uncompr.obj -+zutil.obj + +example.exe: $(ZLIB_LIB) example.obj + $(LINKER) -ldos32a -fe=example.exe example.obj $(ZLIB_LIB) + +minigzip.exe: $(ZLIB_LIB) minigzip.obj + $(LINKER) -ldos32a -fe=minigzip.exe minigzip.obj $(ZLIB_LIB) + +clean: .SYMBOLIC + del *.obj + del $(ZLIB_LIB) + @echo Cleaning done diff --git a/externe_kniznice/zlib/watcom/watcom_l.mak b/externe_kniznice/zlib/watcom/watcom_l.mak new file mode 100644 index 0000000..193eed7 --- /dev/null +++ b/externe_kniznice/zlib/watcom/watcom_l.mak @@ -0,0 +1,43 @@ +# Makefile for zlib +# OpenWatcom large model +# Last updated: 28-Dec-2005 + +# To use, do "wmake -f watcom_l.mak" + +C_SOURCE = adler32.c compress.c crc32.c deflate.c & + gzclose.c gzlib.c gzread.c gzwrite.c & + infback.c inffast.c inflate.c inftrees.c & + trees.c uncompr.c zutil.c + +OBJS = adler32.obj compress.obj crc32.obj deflate.obj & + gzclose.obj gzlib.obj gzread.obj gzwrite.obj & + infback.obj inffast.obj inflate.obj inftrees.obj & + trees.obj uncompr.obj zutil.obj + +CC = wcc +LINKER = wcl +CFLAGS = -zq -ml -s -bt=dos -oilrtfm -fr=nul -wx +ZLIB_LIB = zlib_l.lib + +.C.OBJ: + $(CC) $(CFLAGS) $[@ + +all: $(ZLIB_LIB) example.exe minigzip.exe + +$(ZLIB_LIB): $(OBJS) + wlib -b -c $(ZLIB_LIB) -+adler32.obj -+compress.obj -+crc32.obj + wlib -b -c $(ZLIB_LIB) -+gzclose.obj -+gzlib.obj -+gzread.obj -+gzwrite.obj + wlib -b -c $(ZLIB_LIB) -+deflate.obj -+infback.obj + wlib -b -c $(ZLIB_LIB) -+inffast.obj -+inflate.obj -+inftrees.obj + wlib -b -c $(ZLIB_LIB) -+trees.obj -+uncompr.obj -+zutil.obj + +example.exe: $(ZLIB_LIB) example.obj + $(LINKER) -fe=example.exe example.obj $(ZLIB_LIB) + +minigzip.exe: $(ZLIB_LIB) minigzip.obj + $(LINKER) -fe=minigzip.exe minigzip.obj $(ZLIB_LIB) + +clean: .SYMBOLIC + del *.obj + del $(ZLIB_LIB) + @echo Cleaning done diff --git a/externe_kniznice/zlib/win32/DLL_FAQ.txt b/externe_kniznice/zlib/win32/DLL_FAQ.txt new file mode 100644 index 0000000..12c0090 --- /dev/null +++ b/externe_kniznice/zlib/win32/DLL_FAQ.txt @@ -0,0 +1,397 @@ + + Frequently Asked Questions about ZLIB1.DLL + + +This document describes the design, the rationale, and the usage +of the official DLL build of zlib, named ZLIB1.DLL. If you have +general questions about zlib, you should see the file "FAQ" found +in the zlib distribution, or at the following location: + http://www.gzip.org/zlib/zlib_faq.html + + + 1. What is ZLIB1.DLL, and how can I get it? + + - ZLIB1.DLL is the official build of zlib as a DLL. + (Please remark the character '1' in the name.) + + Pointers to a precompiled ZLIB1.DLL can be found in the zlib + web site at: + http://www.zlib.net/ + + Applications that link to ZLIB1.DLL can rely on the following + specification: + + * The exported symbols are exclusively defined in the source + files "zlib.h" and "zlib.def", found in an official zlib + source distribution. + * The symbols are exported by name, not by ordinal. + * The exported names are undecorated. + * The calling convention of functions is "C" (CDECL). + * The ZLIB1.DLL binary is linked to MSVCRT.DLL. + + The archive in which ZLIB1.DLL is bundled contains compiled + test programs that must run with a valid build of ZLIB1.DLL. + It is recommended to download the prebuilt DLL from the zlib + web site, instead of building it yourself, to avoid potential + incompatibilities that could be introduced by your compiler + and build settings. If you do build the DLL yourself, please + make sure that it complies with all the above requirements, + and it runs with the precompiled test programs, bundled with + the original ZLIB1.DLL distribution. + + If, for any reason, you need to build an incompatible DLL, + please use a different file name. + + + 2. Why did you change the name of the DLL to ZLIB1.DLL? + What happened to the old ZLIB.DLL? + + - The old ZLIB.DLL, built from zlib-1.1.4 or earlier, required + compilation settings that were incompatible to those used by + a static build. The DLL settings were supposed to be enabled + by defining the macro ZLIB_DLL, before including "zlib.h". + Incorrect handling of this macro was silently accepted at + build time, resulting in two major problems: + + * ZLIB_DLL was missing from the old makefile. When building + the DLL, not all people added it to the build options. In + consequence, incompatible incarnations of ZLIB.DLL started + to circulate around the net. + + * When switching from using the static library to using the + DLL, applications had to define the ZLIB_DLL macro and + to recompile all the sources that contained calls to zlib + functions. Failure to do so resulted in creating binaries + that were unable to run with the official ZLIB.DLL build. + + The only possible solution that we could foresee was to make + a binary-incompatible change in the DLL interface, in order to + remove the dependency on the ZLIB_DLL macro, and to release + the new DLL under a different name. + + We chose the name ZLIB1.DLL, where '1' indicates the major + zlib version number. We hope that we will not have to break + the binary compatibility again, at least not as long as the + zlib-1.x series will last. + + There is still a ZLIB_DLL macro, that can trigger a more + efficient build and use of the DLL, but compatibility no + longer dependents on it. + + + 3. Can I build ZLIB.DLL from the new zlib sources, and replace + an old ZLIB.DLL, that was built from zlib-1.1.4 or earlier? + + - In principle, you can do it by assigning calling convention + keywords to the macros ZEXPORT and ZEXPORTVA. In practice, + it depends on what you mean by "an old ZLIB.DLL", because the + old DLL exists in several mutually-incompatible versions. + You have to find out first what kind of calling convention is + being used in your particular ZLIB.DLL build, and to use the + same one in the new build. If you don't know what this is all + about, you might be better off if you would just leave the old + DLL intact. + + + 4. Can I compile my application using the new zlib interface, and + link it to an old ZLIB.DLL, that was built from zlib-1.1.4 or + earlier? + + - The official answer is "no"; the real answer depends again on + what kind of ZLIB.DLL you have. Even if you are lucky, this + course of action is unreliable. + + If you rebuild your application and you intend to use a newer + version of zlib (post- 1.1.4), it is strongly recommended to + link it to the new ZLIB1.DLL. + + + 5. Why are the zlib symbols exported by name, and not by ordinal? + + - Although exporting symbols by ordinal is a little faster, it + is risky. Any single glitch in the maintenance or use of the + DEF file that contains the ordinals can result in incompatible + builds and frustrating crashes. Simply put, the benefits of + exporting symbols by ordinal do not justify the risks. + + Technically, it should be possible to maintain ordinals in + the DEF file, and still export the symbols by name. Ordinals + exist in every DLL, and even if the dynamic linking performed + at the DLL startup is searching for names, ordinals serve as + hints, for a faster name lookup. However, if the DEF file + contains ordinals, the Microsoft linker automatically builds + an implib that will cause the executables linked to it to use + those ordinals, and not the names. It is interesting to + notice that the GNU linker for Win32 does not suffer from this + problem. + + It is possible to avoid the DEF file if the exported symbols + are accompanied by a "__declspec(dllexport)" attribute in the + source files. You can do this in zlib by predefining the + ZLIB_DLL macro. + + + 6. I see that the ZLIB1.DLL functions use the "C" (CDECL) calling + convention. Why not use the STDCALL convention? + STDCALL is the standard convention in Win32, and I need it in + my Visual Basic project! + + (For readability, we use CDECL to refer to the convention + triggered by the "__cdecl" keyword, STDCALL to refer to + the convention triggered by "__stdcall", and FASTCALL to + refer to the convention triggered by "__fastcall".) + + - Most of the native Windows API functions (without varargs) use + indeed the WINAPI convention (which translates to STDCALL in + Win32), but the standard C functions use CDECL. If a user + application is intrinsically tied to the Windows API (e.g. + it calls native Windows API functions such as CreateFile()), + sometimes it makes sense to decorate its own functions with + WINAPI. But if ANSI C or POSIX portability is a goal (e.g. + it calls standard C functions such as fopen()), it is not a + sound decision to request the inclusion of , or to + use non-ANSI constructs, for the sole purpose to make the user + functions STDCALL-able. + + The functionality offered by zlib is not in the category of + "Windows functionality", but is more like "C functionality". + + Technically, STDCALL is not bad; in fact, it is slightly + faster than CDECL, and it works with variable-argument + functions, just like CDECL. It is unfortunate that, in spite + of using STDCALL in the Windows API, it is not the default + convention used by the C compilers that run under Windows. + The roots of the problem reside deep inside the unsafety of + the K&R-style function prototypes, where the argument types + are not specified; but that is another story for another day. + + The remaining fact is that CDECL is the default convention. + Even if an explicit convention is hard-coded into the function + prototypes inside C headers, problems may appear. The + necessity to expose the convention in users' callbacks is one + of these problems. + + The calling convention issues are also important when using + zlib in other programming languages. Some of them, like Ada + (GNAT) and Fortran (GNU G77), have C bindings implemented + initially on Unix, and relying on the C calling convention. + On the other hand, the pre- .NET versions of Microsoft Visual + Basic require STDCALL, while Borland Delphi prefers, although + it does not require, FASTCALL. + + In fairness to all possible uses of zlib outside the C + programming language, we choose the default "C" convention. + Anyone interested in different bindings or conventions is + encouraged to maintain specialized projects. The "contrib/" + directory from the zlib distribution already holds a couple + of foreign bindings, such as Ada, C++, and Delphi. + + + 7. I need a DLL for my Visual Basic project. What can I do? + + - Define the ZLIB_WINAPI macro before including "zlib.h", when + building both the DLL and the user application (except that + you don't need to define anything when using the DLL in Visual + Basic). The ZLIB_WINAPI macro will switch on the WINAPI + (STDCALL) convention. The name of this DLL must be different + than the official ZLIB1.DLL. + + Gilles Vollant has contributed a build named ZLIBWAPI.DLL, + with the ZLIB_WINAPI macro turned on, and with the minizip + functionality built in. For more information, please read + the notes inside "contrib/vstudio/readme.txt", found in the + zlib distribution. + + + 8. I need to use zlib in my Microsoft .NET project. What can I + do? + + - Henrik Ravn has contributed a .NET wrapper around zlib. Look + into contrib/dotzlib/, inside the zlib distribution. + + + 9. If my application uses ZLIB1.DLL, should I link it to + MSVCRT.DLL? Why? + + - It is not required, but it is recommended to link your + application to MSVCRT.DLL, if it uses ZLIB1.DLL. + + The executables (.EXE, .DLL, etc.) that are involved in the + same process and are using the C run-time library (i.e. they + are calling standard C functions), must link to the same + library. There are several libraries in the Win32 system: + CRTDLL.DLL, MSVCRT.DLL, the static C libraries, etc. + Since ZLIB1.DLL is linked to MSVCRT.DLL, the executables that + depend on it should also be linked to MSVCRT.DLL. + + +10. Why are you saying that ZLIB1.DLL and my application should + be linked to the same C run-time (CRT) library? I linked my + application and my DLLs to different C libraries (e.g. my + application to a static library, and my DLLs to MSVCRT.DLL), + and everything works fine. + + - If a user library invokes only pure Win32 API (accessible via + and the related headers), its DLL build will work + in any context. But if this library invokes standard C API, + things get more complicated. + + There is a single Win32 library in a Win32 system. Every + function in this library resides in a single DLL module, that + is safe to call from anywhere. On the other hand, there are + multiple versions of the C library, and each of them has its + own separate internal state. Standalone executables and user + DLLs that call standard C functions must link to a C run-time + (CRT) library, be it static or shared (DLL). Intermixing + occurs when an executable (not necessarily standalone) and a + DLL are linked to different CRTs, and both are running in the + same process. + + Intermixing multiple CRTs is possible, as long as their + internal states are kept intact. The Microsoft Knowledge Base + articles KB94248 "HOWTO: Use the C Run-Time" and KB140584 + "HOWTO: Link with the Correct C Run-Time (CRT) Library" + mention the potential problems raised by intermixing. + + If intermixing works for you, it's because your application + and DLLs are avoiding the corruption of each of the CRTs' + internal states, maybe by careful design, or maybe by fortune. + + Also note that linking ZLIB1.DLL to non-Microsoft CRTs, such + as those provided by Borland, raises similar problems. + + +11. Why are you linking ZLIB1.DLL to MSVCRT.DLL? + + - MSVCRT.DLL exists on every Windows 95 with a new service pack + installed, or with Microsoft Internet Explorer 4 or later, and + on all other Windows 4.x or later (Windows 98, Windows NT 4, + or later). It is freely distributable; if not present in the + system, it can be downloaded from Microsoft or from other + software provider for free. + + The fact that MSVCRT.DLL does not exist on a virgin Windows 95 + is not so problematic. Windows 95 is scarcely found nowadays, + Microsoft ended its support a long time ago, and many recent + applications from various vendors, including Microsoft, do not + even run on it. Furthermore, no serious user should run + Windows 95 without a proper update installed. + + +12. Why are you not linking ZLIB1.DLL to + <> ? + + - We considered and abandoned the following alternatives: + + * Linking ZLIB1.DLL to a static C library (LIBC.LIB, or + LIBCMT.LIB) is not a good option. People are using the DLL + mainly to save disk space. If you are linking your program + to a static C library, you may as well consider linking zlib + in statically, too. + + * Linking ZLIB1.DLL to CRTDLL.DLL looks appealing, because + CRTDLL.DLL is present on every Win32 installation. + Unfortunately, it has a series of problems: it does not + work properly with Microsoft's C++ libraries, it does not + provide support for 64-bit file offsets, (and so on...), + and Microsoft discontinued its support a long time ago. + + * Linking ZLIB1.DLL to MSVCR70.DLL or MSVCR71.DLL, supplied + with the Microsoft .NET platform, and Visual C++ 7.0/7.1, + raises problems related to the status of ZLIB1.DLL as a + system component. According to the Microsoft Knowledge Base + article KB326922 "INFO: Redistribution of the Shared C + Runtime Component in Visual C++ .NET", MSVCR70.DLL and + MSVCR71.DLL are not supposed to function as system DLLs, + because they may clash with MSVCRT.DLL. Instead, the + application's installer is supposed to put these DLLs + (if needed) in the application's private directory. + If ZLIB1.DLL depends on a non-system runtime, it cannot + function as a redistributable system component. + + * Linking ZLIB1.DLL to non-Microsoft runtimes, such as + Borland's, or Cygwin's, raises problems related to the + reliable presence of these runtimes on Win32 systems. + It's easier to let the DLL build of zlib up to the people + who distribute these runtimes, and who may proceed as + explained in the answer to Question 14. + + +13. If ZLIB1.DLL cannot be linked to MSVCR70.DLL or MSVCR71.DLL, + how can I build/use ZLIB1.DLL in Microsoft Visual C++ 7.0 + (Visual Studio .NET) or newer? + + - Due to the problems explained in the Microsoft Knowledge Base + article KB326922 (see the previous answer), the C runtime that + comes with the VC7 environment is no longer considered a + system component. That is, it should not be assumed that this + runtime exists, or may be installed in a system directory. + Since ZLIB1.DLL is supposed to be a system component, it may + not depend on a non-system component. + + In order to link ZLIB1.DLL and your application to MSVCRT.DLL + in VC7, you need the library of Visual C++ 6.0 or older. If + you don't have this library at hand, it's probably best not to + use ZLIB1.DLL. + + We are hoping that, in the future, Microsoft will provide a + way to build applications linked to a proper system runtime, + from the Visual C++ environment. Until then, you have a + couple of alternatives, such as linking zlib in statically. + If your application requires dynamic linking, you may proceed + as explained in the answer to Question 14. + + +14. I need to link my own DLL build to a CRT different than + MSVCRT.DLL. What can I do? + + - Feel free to rebuild the DLL from the zlib sources, and link + it the way you want. You should, however, clearly state that + your build is unofficial. You should give it a different file + name, and/or install it in a private directory that can be + accessed by your application only, and is not visible to the + others (i.e. it's neither in the PATH, nor in the SYSTEM or + SYSTEM32 directories). Otherwise, your build may clash with + applications that link to the official build. + + For example, in Cygwin, zlib is linked to the Cygwin runtime + CYGWIN1.DLL, and it is distributed under the name CYGZ.DLL. + + +15. May I include additional pieces of code that I find useful, + link them in ZLIB1.DLL, and export them? + + - No. A legitimate build of ZLIB1.DLL must not include code + that does not originate from the official zlib source code. + But you can make your own private DLL build, under a different + file name, as suggested in the previous answer. + + For example, zlib is a part of the VCL library, distributed + with Borland Delphi and C++ Builder. The DLL build of VCL + is a redistributable file, named VCLxx.DLL. + + +16. May I remove some functionality out of ZLIB1.DLL, by enabling + macros like NO_GZCOMPRESS or NO_GZIP at compile time? + + - No. A legitimate build of ZLIB1.DLL must provide the complete + zlib functionality, as implemented in the official zlib source + code. But you can make your own private DLL build, under a + different file name, as suggested in the previous answer. + + +17. I made my own ZLIB1.DLL build. Can I test it for compliance? + + - We prefer that you download the official DLL from the zlib + web site. If you need something peculiar from this DLL, you + can send your suggestion to the zlib mailing list. + + However, in case you do rebuild the DLL yourself, you can run + it with the test programs found in the DLL distribution. + Running these test programs is not a guarantee of compliance, + but a failure can imply a detected problem. + +** + +This document is written and maintained by +Cosmin Truta diff --git a/externe_kniznice/zlib/win32/Makefile.bor b/externe_kniznice/zlib/win32/Makefile.bor new file mode 100644 index 0000000..d152bbb --- /dev/null +++ b/externe_kniznice/zlib/win32/Makefile.bor @@ -0,0 +1,110 @@ +# Makefile for zlib +# Borland C++ for Win32 +# +# Usage: +# make -f win32/Makefile.bor +# make -f win32/Makefile.bor LOCAL_ZLIB=-DASMV OBJA=match.obj OBJPA=+match.obj + +# ------------ Borland C++ ------------ + +# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7) +# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or +# added to the declaration of LOC here: +LOC = $(LOCAL_ZLIB) + +CC = bcc32 +AS = bcc32 +LD = bcc32 +AR = tlib +CFLAGS = -a -d -k- -O2 $(LOC) +ASFLAGS = $(LOC) +LDFLAGS = $(LOC) + + +# variables +ZLIB_LIB = zlib.lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +#OBJA = +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj +OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj +#OBJPA= + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $< + +.asm.obj: + $(AS) -c $(ASFLAGS) $< + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: test/example.c zlib.h zconf.h + +minigzip.obj: test/minigzip.c zlib.h zconf.h + + +# For the sake of the old Borland make, +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) $(OBJA) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + $(AR) $(ZLIB_LIB) $(OBJPA) + + +# testing +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + + +# cleanup +clean: + -del $(ZLIB_LIB) + -del *.obj + -del *.exe + -del *.tds + -del zlib.bak + -del foo.gz diff --git a/externe_kniznice/zlib/win32/Makefile.gcc b/externe_kniznice/zlib/win32/Makefile.gcc new file mode 100644 index 0000000..305be50 --- /dev/null +++ b/externe_kniznice/zlib/win32/Makefile.gcc @@ -0,0 +1,182 @@ +# Makefile for zlib, derived from Makefile.dj2. +# Modified for mingw32 by C. Spieler, 6/16/98. +# Updated for zlib 1.2.x by Christian Spieler and Cosmin Truta, Mar-2003. +# Last updated: Mar 2012. +# Tested under Cygwin and MinGW. + +# Copyright (C) 1995-2003 Jean-loup Gailly. +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile, or to compile and test, type from the top level zlib directory: +# +# make -fwin32/Makefile.gcc; make test testdll -fwin32/Makefile.gcc +# +# To use the asm code, type: +# cp contrib/asm?86/match.S ./match.S +# make LOC=-DASMV OBJA=match.o -fwin32/Makefile.gcc +# +# To install libz.a, zconf.h and zlib.h in the system directories, type: +# +# make install -fwin32/Makefile.gcc +# +# BINARY_PATH, INCLUDE_PATH and LIBRARY_PATH must be set. +# +# To install the shared lib, append SHARED_MODE=1 to the make command : +# +# make install -fwin32/Makefile.gcc SHARED_MODE=1 + +# Note: +# If the platform is *not* MinGW (e.g. it is Cygwin or UWIN), +# the DLL name should be changed from "zlib1.dll". + +STATICLIB = libz.a +SHAREDLIB = zlib1.dll +IMPLIB = libz.dll.a + +# +# Set to 1 if shared object needs to be installed +# +SHARED_MODE=0 + +#LOC = -DASMV +#LOC = -DZLIB_DEBUG -g + +PREFIX = +CC = $(PREFIX)gcc +CFLAGS = $(LOC) -O3 -Wall + +AS = $(CC) +ASFLAGS = $(LOC) -Wall + +LD = $(CC) +LDFLAGS = $(LOC) + +AR = $(PREFIX)ar +ARFLAGS = rcs + +RC = $(PREFIX)windres +RCFLAGS = --define GCC_WINDRES + +STRIP = $(PREFIX)strip + +CP = cp -fp +# If GNU install is available, replace $(CP) with install. +INSTALL = $(CP) +RM = rm -f + +prefix ?= /usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o deflate.o gzclose.o gzlib.o gzread.o \ + gzwrite.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o +OBJA = + +all: $(STATICLIB) $(SHAREDLIB) $(IMPLIB) example.exe minigzip.exe example_d.exe minigzip_d.exe + +test: example.exe minigzip.exe + ./example + echo hello world | ./minigzip | ./minigzip -d + +testdll: example_d.exe minigzip_d.exe + ./example_d + echo hello world | ./minigzip_d | ./minigzip_d -d + +.c.o: + $(CC) $(CFLAGS) -c -o $@ $< + +.S.o: + $(AS) $(ASFLAGS) -c -o $@ $< + +$(STATICLIB): $(OBJS) $(OBJA) + $(AR) $(ARFLAGS) $@ $(OBJS) $(OBJA) + +$(IMPLIB): $(SHAREDLIB) + +$(SHAREDLIB): win32/zlib.def $(OBJS) $(OBJA) zlibrc.o + $(CC) -shared -Wl,--out-implib,$(IMPLIB) $(LDFLAGS) \ + -o $@ win32/zlib.def $(OBJS) $(OBJA) zlibrc.o + $(STRIP) $@ + +example.exe: example.o $(STATICLIB) + $(LD) $(LDFLAGS) -o $@ example.o $(STATICLIB) + $(STRIP) $@ + +minigzip.exe: minigzip.o $(STATICLIB) + $(LD) $(LDFLAGS) -o $@ minigzip.o $(STATICLIB) + $(STRIP) $@ + +example_d.exe: example.o $(IMPLIB) + $(LD) $(LDFLAGS) -o $@ example.o $(IMPLIB) + $(STRIP) $@ + +minigzip_d.exe: minigzip.o $(IMPLIB) + $(LD) $(LDFLAGS) -o $@ minigzip.o $(IMPLIB) + $(STRIP) $@ + +example.o: test/example.c zlib.h zconf.h + $(CC) $(CFLAGS) -I. -c -o $@ test/example.c + +minigzip.o: test/minigzip.c zlib.h zconf.h + $(CC) $(CFLAGS) -I. -c -o $@ test/minigzip.c + +zlibrc.o: win32/zlib1.rc + $(RC) $(RCFLAGS) -o $@ win32/zlib1.rc + +.PHONY: install uninstall clean + +install: zlib.h zconf.h $(STATICLIB) $(IMPLIB) + @if test -z "$(DESTDIR)$(INCLUDE_PATH)" -o -z "$(DESTDIR)$(LIBRARY_PATH)" -o -z "$(DESTDIR)$(BINARY_PATH)"; then \ + echo INCLUDE_PATH, LIBRARY_PATH, and BINARY_PATH must be specified; \ + exit 1; \ + fi + -@mkdir -p '$(DESTDIR)$(INCLUDE_PATH)' + -@mkdir -p '$(DESTDIR)$(LIBRARY_PATH)' '$(DESTDIR)$(LIBRARY_PATH)'/pkgconfig + -if [ "$(SHARED_MODE)" = "1" ]; then \ + mkdir -p '$(DESTDIR)$(BINARY_PATH)'; \ + $(INSTALL) $(SHAREDLIB) '$(DESTDIR)$(BINARY_PATH)'; \ + $(INSTALL) $(IMPLIB) '$(DESTDIR)$(LIBRARY_PATH)'; \ + fi + -$(INSTALL) zlib.h '$(DESTDIR)$(INCLUDE_PATH)' + -$(INSTALL) zconf.h '$(DESTDIR)$(INCLUDE_PATH)' + -$(INSTALL) $(STATICLIB) '$(DESTDIR)$(LIBRARY_PATH)' + sed \ + -e 's|@prefix@|${prefix}|g' \ + -e 's|@exec_prefix@|${exec_prefix}|g' \ + -e 's|@libdir@|$(LIBRARY_PATH)|g' \ + -e 's|@sharedlibdir@|$(LIBRARY_PATH)|g' \ + -e 's|@includedir@|$(INCLUDE_PATH)|g' \ + -e 's|@VERSION@|'`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' zlib.h`'|g' \ + zlib.pc.in > '$(DESTDIR)$(LIBRARY_PATH)'/pkgconfig/zlib.pc + +uninstall: + -if [ "$(SHARED_MODE)" = "1" ]; then \ + $(RM) '$(DESTDIR)$(BINARY_PATH)'/$(SHAREDLIB); \ + $(RM) '$(DESTDIR)$(LIBRARY_PATH)'/$(IMPLIB); \ + fi + -$(RM) '$(DESTDIR)$(INCLUDE_PATH)'/zlib.h + -$(RM) '$(DESTDIR)$(INCLUDE_PATH)'/zconf.h + -$(RM) '$(DESTDIR)$(LIBRARY_PATH)'/$(STATICLIB) + +clean: + -$(RM) $(STATICLIB) + -$(RM) $(SHAREDLIB) + -$(RM) $(IMPLIB) + -$(RM) *.o + -$(RM) *.exe + -$(RM) foo.gz + +adler32.o: zlib.h zconf.h +compress.o: zlib.h zconf.h +crc32.o: crc32.h zlib.h zconf.h +deflate.o: deflate.h zutil.h zlib.h zconf.h +gzclose.o: zlib.h zconf.h gzguts.h +gzlib.o: zlib.h zconf.h gzguts.h +gzread.o: zlib.h zconf.h gzguts.h +gzwrite.o: zlib.h zconf.h gzguts.h +inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +inftrees.o: zutil.h zlib.h zconf.h inftrees.h +trees.o: deflate.h zutil.h zlib.h zconf.h trees.h +uncompr.o: zlib.h zconf.h +zutil.o: zutil.h zlib.h zconf.h diff --git a/externe_kniznice/zlib/win32/Makefile.msc b/externe_kniznice/zlib/win32/Makefile.msc new file mode 100644 index 0000000..6831882 --- /dev/null +++ b/externe_kniznice/zlib/win32/Makefile.msc @@ -0,0 +1,163 @@ +# Makefile for zlib using Microsoft (Visual) C +# zlib is copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler +# +# Usage: +# nmake -f win32/Makefile.msc (standard build) +# nmake -f win32/Makefile.msc LOC=-DFOO (nonstandard build) +# nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" \ +# OBJA="inffas32.obj match686.obj" (use ASM code, x86) +# nmake -f win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF -I." \ +# OBJA="inffasx64.obj gvmat64.obj inffas8664.obj" (use ASM code, x64) + +# The toplevel directory of the source tree. +# +TOP = . + +# optional build flags +LOC = + +# variables +STATICLIB = zlib.lib +SHAREDLIB = zlib1.dll +IMPLIB = zdll.lib + +CC = cl +AS = ml +LD = link +AR = lib +RC = rc +CFLAGS = -nologo -MD -W3 -O2 -Oy- -Zi -Fd"zlib" $(LOC) +WFLAGS = -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE +ASFLAGS = -coff -Zi $(LOC) +LDFLAGS = -nologo -debug -incremental:no -opt:ref +ARFLAGS = -nologo +RCFLAGS = /dWIN32 /r + +OBJS = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj \ + gzwrite.obj infback.obj inflate.obj inftrees.obj inffast.obj trees.obj uncompr.obj zutil.obj +OBJA = + + +# targets +all: $(STATICLIB) $(SHAREDLIB) $(IMPLIB) \ + example.exe minigzip.exe example_d.exe minigzip_d.exe + +$(STATICLIB): $(OBJS) $(OBJA) + $(AR) $(ARFLAGS) -out:$@ $(OBJS) $(OBJA) + +$(IMPLIB): $(SHAREDLIB) + +$(SHAREDLIB): $(TOP)/win32/zlib.def $(OBJS) $(OBJA) zlib1.res + $(LD) $(LDFLAGS) -def:$(TOP)/win32/zlib.def -dll -implib:$(IMPLIB) \ + -out:$@ -base:0x5A4C0000 $(OBJS) $(OBJA) zlib1.res + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;2 + +example.exe: example.obj $(STATICLIB) + $(LD) $(LDFLAGS) example.obj $(STATICLIB) + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;1 + +minigzip.exe: minigzip.obj $(STATICLIB) + $(LD) $(LDFLAGS) minigzip.obj $(STATICLIB) + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;1 + +example_d.exe: example.obj $(IMPLIB) + $(LD) $(LDFLAGS) -out:$@ example.obj $(IMPLIB) + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;1 + +minigzip_d.exe: minigzip.obj $(IMPLIB) + $(LD) $(LDFLAGS) -out:$@ minigzip.obj $(IMPLIB) + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;1 + +{$(TOP)}.c.obj: + $(CC) -c $(WFLAGS) $(CFLAGS) $< + +{$(TOP)/test}.c.obj: + $(CC) -c -I$(TOP) $(WFLAGS) $(CFLAGS) $< + +{$(TOP)/contrib/masmx64}.c.obj: + $(CC) -c $(WFLAGS) $(CFLAGS) $< + +{$(TOP)/contrib/masmx64}.asm.obj: + $(AS) -c $(ASFLAGS) $< + +{$(TOP)/contrib/masmx86}.asm.obj: + $(AS) -c $(ASFLAGS) $< + +adler32.obj: $(TOP)/adler32.c $(TOP)/zlib.h $(TOP)/zconf.h + +compress.obj: $(TOP)/compress.c $(TOP)/zlib.h $(TOP)/zconf.h + +crc32.obj: $(TOP)/crc32.c $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/crc32.h + +deflate.obj: $(TOP)/deflate.c $(TOP)/deflate.h $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h + +gzclose.obj: $(TOP)/gzclose.c $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/gzguts.h + +gzlib.obj: $(TOP)/gzlib.c $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/gzguts.h + +gzread.obj: $(TOP)/gzread.c $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/gzguts.h + +gzwrite.obj: $(TOP)/gzwrite.c $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/gzguts.h + +infback.obj: $(TOP)/infback.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/inftrees.h $(TOP)/inflate.h \ + $(TOP)/inffast.h $(TOP)/inffixed.h + +inffast.obj: $(TOP)/inffast.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/inftrees.h $(TOP)/inflate.h \ + $(TOP)/inffast.h + +inflate.obj: $(TOP)/inflate.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/inftrees.h $(TOP)/inflate.h \ + $(TOP)/inffast.h $(TOP)/inffixed.h + +inftrees.obj: $(TOP)/inftrees.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/inftrees.h + +trees.obj: $(TOP)/trees.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h $(TOP)/deflate.h $(TOP)/trees.h + +uncompr.obj: $(TOP)/uncompr.c $(TOP)/zlib.h $(TOP)/zconf.h + +zutil.obj: $(TOP)/zutil.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h + +gvmat64.obj: $(TOP)/contrib\masmx64\gvmat64.asm + +inffasx64.obj: $(TOP)/contrib\masmx64\inffasx64.asm + +inffas8664.obj: $(TOP)/contrib\masmx64\inffas8664.c $(TOP)/zutil.h $(TOP)/zlib.h $(TOP)/zconf.h \ + $(TOP)/inftrees.h $(TOP)/inflate.h $(TOP)/inffast.h + +inffas32.obj: $(TOP)/contrib\masmx86\inffas32.asm + +match686.obj: $(TOP)/contrib\masmx86\match686.asm + +example.obj: $(TOP)/test/example.c $(TOP)/zlib.h $(TOP)/zconf.h + +minigzip.obj: $(TOP)/test/minigzip.c $(TOP)/zlib.h $(TOP)/zconf.h + +zlib1.res: $(TOP)/win32/zlib1.rc + $(RC) $(RCFLAGS) /fo$@ $(TOP)/win32/zlib1.rc + +# testing +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +testdll: example_d.exe minigzip_d.exe + example_d + echo hello world | minigzip_d | minigzip_d -d + + +# cleanup +clean: + -del $(STATICLIB) + -del $(SHAREDLIB) + -del $(IMPLIB) + -del *.obj + -del *.res + -del *.exp + -del *.exe + -del *.pdb + -del *.manifest + -del foo.gz diff --git a/externe_kniznice/zlib/win32/README-WIN32.txt b/externe_kniznice/zlib/win32/README-WIN32.txt new file mode 100644 index 0000000..df7ab7f --- /dev/null +++ b/externe_kniznice/zlib/win32/README-WIN32.txt @@ -0,0 +1,103 @@ +ZLIB DATA COMPRESSION LIBRARY + +zlib 1.2.11 is a general purpose data compression library. All the code is +thread safe. The data format used by the zlib library is described by RFCs +(Request for Comments) 1950 to 1952 in the files +http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) +and rfc1952.txt (gzip format). + +All functions of the compression library are documented in the file zlib.h +(volunteer to write man pages welcome, contact zlib@gzip.org). Two compiled +examples are distributed in this package, example and minigzip. The example_d +and minigzip_d flavors validate that the zlib1.dll file is working correctly. + +Questions about zlib should be sent to . The zlib home page +is http://zlib.net/ . Before reporting a problem, please check this site to +verify that you have the latest version of zlib; otherwise get the latest +version and check whether the problem still exists or not. + +PLEASE read DLL_FAQ.txt, and the the zlib FAQ http://zlib.net/zlib_faq.html +before asking for help. + + +Manifest: + +The package zlib-1.2.11-win32-x86.zip will contain the following files: + + README-WIN32.txt This document + ChangeLog Changes since previous zlib packages + DLL_FAQ.txt Frequently asked questions about zlib1.dll + zlib.3.pdf Documentation of this library in Adobe Acrobat format + + example.exe A statically-bound example (using zlib.lib, not the dll) + example.pdb Symbolic information for debugging example.exe + + example_d.exe A zlib1.dll bound example (using zdll.lib) + example_d.pdb Symbolic information for debugging example_d.exe + + minigzip.exe A statically-bound test program (using zlib.lib, not the dll) + minigzip.pdb Symbolic information for debugging minigzip.exe + + minigzip_d.exe A zlib1.dll bound test program (using zdll.lib) + minigzip_d.pdb Symbolic information for debugging minigzip_d.exe + + zlib.h Install these files into the compilers' INCLUDE path to + zconf.h compile programs which use zlib.lib or zdll.lib + + zdll.lib Install these files into the compilers' LIB path if linking + zdll.exp a compiled program to the zlib1.dll binary + + zlib.lib Install these files into the compilers' LIB path to link zlib + zlib.pdb into compiled programs, without zlib1.dll runtime dependency + (zlib.pdb provides debugging info to the compile time linker) + + zlib1.dll Install this binary shared library into the system PATH, or + the program's runtime directory (where the .exe resides) + zlib1.pdb Install in the same directory as zlib1.dll, in order to debug + an application crash using WinDbg or similar tools. + +All .pdb files above are entirely optional, but are very useful to a developer +attempting to diagnose program misbehavior or a crash. Many additional +important files for developers can be found in the zlib127.zip source package +available from http://zlib.net/ - review that package's README file for details. + + +Acknowledgments: + +The deflate format used by zlib was defined by Phil Katz. The deflate and +zlib specifications were written by L. Peter Deutsch. Thanks to all the +people who reported problems and suggested various improvements in zlib; they +are too numerous to cite here. + + +Copyright notice: + + (C) 1995-2017 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +If you use the zlib library in a product, we would appreciate *not* receiving +lengthy legal documents to sign. The sources are provided for free but without +warranty of any kind. The library has been entirely written by Jean-loup +Gailly and Mark Adler; it does not include third-party code. + +If you redistribute modified sources, we would appreciate that you include in +the file ChangeLog history information documenting your changes. Please read +the FAQ for more information on the distribution of modified source versions. diff --git a/externe_kniznice/zlib/win32/VisualC.txt b/externe_kniznice/zlib/win32/VisualC.txt new file mode 100644 index 0000000..1005b21 --- /dev/null +++ b/externe_kniznice/zlib/win32/VisualC.txt @@ -0,0 +1,3 @@ + +To build zlib using the Microsoft Visual C++ environment, +use the appropriate project from the contrib/vstudio/ directory. diff --git a/externe_kniznice/zlib/win32/zlib.def b/externe_kniznice/zlib/win32/zlib.def new file mode 100644 index 0000000..a2188b0 --- /dev/null +++ b/externe_kniznice/zlib/win32/zlib.def @@ -0,0 +1,94 @@ +; zlib data compression library +EXPORTS +; basic functions + zlibVersion + deflate + deflateEnd + inflate + inflateEnd +; advanced functions + deflateSetDictionary + deflateGetDictionary + deflateCopy + deflateReset + deflateParams + deflateTune + deflateBound + deflatePending + deflatePrime + deflateSetHeader + inflateSetDictionary + inflateGetDictionary + inflateSync + inflateCopy + inflateReset + inflateReset2 + inflatePrime + inflateMark + inflateGetHeader + inflateBack + inflateBackEnd + zlibCompileFlags +; utility functions + compress + compress2 + compressBound + uncompress + uncompress2 + gzopen + gzdopen + gzbuffer + gzsetparams + gzread + gzfread + gzwrite + gzfwrite + gzprintf + gzvprintf + gzputs + gzgets + gzputc + gzgetc + gzungetc + gzflush + gzseek + gzrewind + gztell + gzoffset + gzeof + gzdirect + gzclose + gzclose_r + gzclose_w + gzerror + gzclearerr +; large file functions + gzopen64 + gzseek64 + gztell64 + gzoffset64 + adler32_combine64 + crc32_combine64 +; checksum functions + adler32 + adler32_z + crc32 + crc32_z + adler32_combine + crc32_combine +; various hacks, don't look :) + deflateInit_ + deflateInit2_ + inflateInit_ + inflateInit2_ + inflateBackInit_ + gzgetc_ + zError + inflateSyncPoint + get_crc_table + inflateUndermine + inflateValidate + inflateCodesUsed + inflateResetKeep + deflateResetKeep + gzopen_w diff --git a/externe_kniznice/zlib/win32/zlib1.rc b/externe_kniznice/zlib/win32/zlib1.rc new file mode 100644 index 0000000..234e641 --- /dev/null +++ b/externe_kniznice/zlib/win32/zlib1.rc @@ -0,0 +1,40 @@ +#include +#include "../zlib.h" + +#ifdef GCC_WINDRES +VS_VERSION_INFO VERSIONINFO +#else +VS_VERSION_INFO VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE +#endif + FILEVERSION ZLIB_VER_MAJOR,ZLIB_VER_MINOR,ZLIB_VER_REVISION,0 + PRODUCTVERSION ZLIB_VER_MAJOR,ZLIB_VER_MINOR,ZLIB_VER_REVISION,0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS 1 +#else + FILEFLAGS 0 +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + BEGIN + VALUE "FileDescription", "zlib data compression library\0" + VALUE "FileVersion", ZLIB_VERSION "\0" + VALUE "InternalName", "zlib1.dll\0" + VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + VALUE "OriginalFilename", "zlib1.dll\0" + VALUE "ProductName", "zlib\0" + VALUE "ProductVersion", ZLIB_VERSION "\0" + VALUE "Comments", "For more information visit http://www.zlib.net/\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/externe_kniznice/zlib/zconf.h b/externe_kniznice/zlib/zconf.h new file mode 100644 index 0000000..5e1d68a --- /dev/null +++ b/externe_kniznice/zlib/zconf.h @@ -0,0 +1,534 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols and init macros */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# define adler32_z z_adler32_z +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define crc32_z z_crc32_z +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateGetDictionary z_deflateGetDictionary +# define deflateInit z_deflateInit +# define deflateInit2 z_deflateInit2 +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzfread z_gzfread +# define gzfwrite z_gzfwrite +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzvprintf z_gzvprintf +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit z_inflateBackInit +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCodesUsed z_inflateCodesUsed +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetDictionary z_inflateGetDictionary +# define inflateGetHeader z_inflateGetHeader +# define inflateInit z_inflateInit +# define inflateInit2 z_inflateInit2 +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateResetKeep z_inflateResetKeep +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateValidate z_inflateValidate +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# define uncompress2 z_uncompress2 +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +#ifdef Z_SOLO + typedef unsigned long z_size_t; +#else +# define z_longlong long long +# if defined(NO_SIZE_T) + typedef unsigned NO_SIZE_T z_size_t; +# elif defined(STDC) +# include + typedef size_t z_size_t; +# else + typedef unsigned long z_size_t; +# endif +# undef z_longlong +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus about 7 kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/externe_kniznice/zlib/zconf.h.cmakein b/externe_kniznice/zlib/zconf.h.cmakein new file mode 100644 index 0000000..a7f24cc --- /dev/null +++ b/externe_kniznice/zlib/zconf.h.cmakein @@ -0,0 +1,536 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H +#cmakedefine Z_PREFIX +#cmakedefine Z_HAVE_UNISTD_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols and init macros */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# define adler32_z z_adler32_z +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define crc32_z z_crc32_z +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateGetDictionary z_deflateGetDictionary +# define deflateInit z_deflateInit +# define deflateInit2 z_deflateInit2 +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzfread z_gzfread +# define gzfwrite z_gzfwrite +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzvprintf z_gzvprintf +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit z_inflateBackInit +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCodesUsed z_inflateCodesUsed +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetDictionary z_inflateGetDictionary +# define inflateGetHeader z_inflateGetHeader +# define inflateInit z_inflateInit +# define inflateInit2 z_inflateInit2 +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateResetKeep z_inflateResetKeep +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateValidate z_inflateValidate +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# define uncompress2 z_uncompress2 +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +#ifdef Z_SOLO + typedef unsigned long z_size_t; +#else +# define z_longlong long long +# if defined(NO_SIZE_T) + typedef unsigned NO_SIZE_T z_size_t; +# elif defined(STDC) +# include + typedef size_t z_size_t; +# else + typedef unsigned long z_size_t; +# endif +# undef z_longlong +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus about 7 kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/externe_kniznice/zlib/zconf.h.in b/externe_kniznice/zlib/zconf.h.in new file mode 100644 index 0000000..5e1d68a --- /dev/null +++ b/externe_kniznice/zlib/zconf.h.in @@ -0,0 +1,534 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols and init macros */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# define adler32_z z_adler32_z +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define crc32_z z_crc32_z +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateGetDictionary z_deflateGetDictionary +# define deflateInit z_deflateInit +# define deflateInit2 z_deflateInit2 +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzfread z_gzfread +# define gzfwrite z_gzfwrite +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzvprintf z_gzvprintf +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit z_inflateBackInit +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCodesUsed z_inflateCodesUsed +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetDictionary z_inflateGetDictionary +# define inflateGetHeader z_inflateGetHeader +# define inflateInit z_inflateInit +# define inflateInit2 z_inflateInit2 +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateResetKeep z_inflateResetKeep +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateValidate z_inflateValidate +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# define uncompress2 z_uncompress2 +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +#ifdef Z_SOLO + typedef unsigned long z_size_t; +#else +# define z_longlong long long +# if defined(NO_SIZE_T) + typedef unsigned NO_SIZE_T z_size_t; +# elif defined(STDC) +# include + typedef size_t z_size_t; +# else + typedef unsigned long z_size_t; +# endif +# undef z_longlong +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus about 7 kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/externe_kniznice/zlib/zlib.3 b/externe_kniznice/zlib/zlib.3 new file mode 100644 index 0000000..bda4eb0 --- /dev/null +++ b/externe_kniznice/zlib/zlib.3 @@ -0,0 +1,149 @@ +.TH ZLIB 3 "15 Jan 2017" +.SH NAME +zlib \- compression/decompression library +.SH SYNOPSIS +[see +.I zlib.h +for full description] +.SH DESCRIPTION +The +.I zlib +library is a general purpose data compression library. +The code is thread safe, assuming that the standard library functions +used are thread safe, such as memory allocation routines. +It provides in-memory compression and decompression functions, +including integrity checks of the uncompressed data. +This version of the library supports only one compression method (deflation) +but other algorithms may be added later +with the same stream interface. +.LP +Compression can be done in a single step if the buffers are large enough +or can be done by repeated calls of the compression function. +In the latter case, +the application must provide more input and/or consume the output +(providing more output space) before each call. +.LP +The library also supports reading and writing files in +.IR gzip (1) +(.gz) format +with an interface similar to that of stdio. +.LP +The library does not install any signal handler. +The decoder checks the consistency of the compressed data, +so the library should never crash even in the case of corrupted input. +.LP +All functions of the compression library are documented in the file +.IR zlib.h . +The distribution source includes examples of use of the library +in the files +.I test/example.c +and +.IR test/minigzip.c, +as well as other examples in the +.IR examples/ +directory. +.LP +Changes to this version are documented in the file +.I ChangeLog +that accompanies the source. +.LP +.I zlib +is built in to many languages and operating systems, including but not limited to +Java, Python, .NET, PHP, Perl, Ruby, Swift, and Go. +.LP +An experimental package to read and write files in the .zip format, +written on top of +.I zlib +by Gilles Vollant (info@winimage.com), +is available at: +.IP +http://www.winimage.com/zLibDll/minizip.html +and also in the +.I contrib/minizip +directory of the main +.I zlib +source distribution. +.SH "SEE ALSO" +The +.I zlib +web site can be found at: +.IP +http://zlib.net/ +.LP +The data format used by the +.I zlib +library is described by RFC +(Request for Comments) 1950 to 1952 in the files: +.IP +http://tools.ietf.org/html/rfc1950 (for the zlib header and trailer format) +.br +http://tools.ietf.org/html/rfc1951 (for the deflate compressed data format) +.br +http://tools.ietf.org/html/rfc1952 (for the gzip header and trailer format) +.LP +Mark Nelson wrote an article about +.I zlib +for the Jan. 1997 issue of Dr. Dobb's Journal; +a copy of the article is available at: +.IP +http://marknelson.us/1997/01/01/zlib-engine/ +.SH "REPORTING PROBLEMS" +Before reporting a problem, +please check the +.I zlib +web site to verify that you have the latest version of +.IR zlib ; +otherwise, +obtain the latest version and see if the problem still exists. +Please read the +.I zlib +FAQ at: +.IP +http://zlib.net/zlib_faq.html +.LP +before asking for help. +Send questions and/or comments to zlib@gzip.org, +or (for the Windows DLL version) to Gilles Vollant (info@winimage.com). +.SH AUTHORS AND LICENSE +Version 1.2.11 +.LP +Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler +.LP +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. +.LP +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: +.LP +.nr step 1 1 +.IP \n[step]. 3 +The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. +.IP \n+[step]. +Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. +.IP \n+[step]. +This notice may not be removed or altered from any source distribution. +.LP +Jean-loup Gailly Mark Adler +.br +jloup@gzip.org madler@alumni.caltech.edu +.LP +The deflate format used by +.I zlib +was defined by Phil Katz. +The deflate and +.I zlib +specifications were written by L. Peter Deutsch. +Thanks to all the people who reported problems and suggested various +improvements in +.IR zlib ; +who are too numerous to cite here. +.LP +UNIX manual page by R. P. C. Rodgers, +U.S. National Library of Medicine (rodgers@nlm.nih.gov). +.\" end of man page diff --git a/externe_kniznice/zlib/zlib.3.pdf b/externe_kniznice/zlib/zlib.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6fa519c5bdf5df33b2f17549e1df142c619c916c GIT binary patch literal 19318 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 to the Adler-32 checksum of all input read + so far (that is, total_in bytes). If a gzip stream is being generated, then + strm->adler will be the CRC-32 checksum of the input read so far. (See + deflateInit2 below.) + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). If in doubt, the data is + considered binary. This field is only for information purposes and does not + affect the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was Z_NULL or the state was inadvertently written over + by the application), or Z_BUF_ERROR if no progress is possible (for example + avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and + deflate() can be called again with more input and more output space to + continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, msg + may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. In the current version of inflate, the provided input is not + read or consumed. The allocation of a sliding window will be deferred to + the first call of inflate (if the decompression does not complete on the + first call). If zalloc and zfree are set to Z_NULL, inflateInit updates + them to use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit does not perform any decompression. + Actual decompression will be done by inflate(). So next_in, and avail_in, + next_out, and avail_out are unused and unchanged. The current + implementation of inflateInit() does not process any header information -- + that is deferred until inflate() is called. +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), then next_in and avail_in are updated + accordingly, and processing will resume at this point for the next call of + inflate(). + + - Generate more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there is + no more input data or no more space in the output buffer (see below about + the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating the next_* and avail_* values accordingly. If the + caller of inflate() does not provide both available input and available + output space, it is possible that there will be no progress made. The + application can consume the uncompressed output when it wants, for example + when the output buffer is full (avail_out == 0), or after each call of + inflate(). If inflate returns Z_OK and with zero avail_out, it must be + called again after making room in the output buffer because there might be + more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, + Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() + stop if and when it gets to the next deflate block boundary. When decoding + the zlib or gzip format, this will cause inflate() to return immediately + after the header and before the first block. When doing a raw inflate, + inflate() will go ahead and process the first block, and will return when it + gets to the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + To assist in this, on return inflate() always sets strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 if + inflate() is currently decoding the last block in the deflate stream, plus + 128 if inflate() returned immediately after decoding an end-of-block code or + decoding the complete header up to just before the first byte of the deflate + stream. The end-of-block will not be indicated until all of the uncompressed + data from that block has been written to strm->next_out. The number of + unused bits may in general be greater than seven, except when bit 7 of + data_type is set, in which case the number of unused bits will be less than + eight. data_type is set as noted here every time inflate() returns for all + flush options, and so can be used to determine the amount of currently + consumed input in bits. + + The Z_TREES option behaves as Z_BLOCK does, but it also returns when the + end of each deflate block header is reached, before any actual data in that + block is decoded. This allows the caller to determine the length of the + deflate block header for later use in random access within a deflate block. + 256 is added to the value of strm->data_type when inflate() returns + immediately after reaching the end of the deflate block header. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step (a + single call of inflate), the parameter flush should be set to Z_FINISH. In + this case all pending input is processed and all pending output is flushed; + avail_out must be large enough to hold all of the uncompressed data for the + operation to complete. (The size of the uncompressed data may have been + saved by the compressor for this purpose.) The use of Z_FINISH is not + required to perform an inflation in one step. However it may be used to + inform inflate that a faster approach can be used for the single inflate() + call. Z_FINISH also informs inflate to not maintain a sliding window if the + stream completes, which reduces inflate's memory footprint. If the stream + does not complete, either because not all of the stream is provided or not + enough output space is provided, then a sliding window will be allocated and + inflate() can be called again to continue the operation as if Z_NO_FLUSH had + been used. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the effects of the flush parameter in this implementation are + on the return value of inflate() as noted below, when inflate() returns early + when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of + memory for a sliding window when Z_FINISH is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the Adler-32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the Adler-32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed Adler-32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() can decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically, if requested when + initializing with inflateInit2(). Any information contained in the gzip + header is not retained unless inflateGetHeader() is used. When processing + gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output + produced so far. The CRC-32 is checked against the gzip trailer, as is the + uncompressed length, modulo 2^32. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value, in which case strm->msg points to a string with a more specific + error), Z_STREAM_ERROR if the stream structure was inconsistent (for example + next_in or next_out was Z_NULL, or the state was inadvertently written over + by the application), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR + if no progress was possible or if there was not enough room in the output + buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may + then call inflateSync() to look for a good compression block if a partial + recovery of the data is to be attempted. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + inflateEnd returns Z_OK if success, or Z_STREAM_ERROR if the stream state + was inconsistent. +*/ + + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by the + caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + For the current implementation of deflate(), a windowBits value of 8 (a + window size of 256 bytes) is not supported. As a result, a request for 8 + will result in 9 (a 512-byte window). In that case, providing 8 to + inflateInit2() will result in an error when the zlib header with 9 is + checked against the initialization of inflate(). The remedy is to not use 8 + with deflateInit2() with this initialization, or at least in that case use 9 + with inflateInit2(). + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute a check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), no + header crc, and the operating system will be set to the appropriate value, + if the operating system was determined at compile time. If a gzip stream is + being written, strm->adler is a CRC-32 instead of an Adler-32. + + For raw deflate or gzip encoding, a request for a 256-byte window is + rejected as invalid, since only the zlib header provides a means of + transmitting the window size to the decompressor. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but is + slow and reduces compression ratio; memLevel=9 uses maximum memory for + optimal speed. The default value is 8. See zconf.h for total memory usage + as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as + fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The + strategy parameter only affects the compression ratio but not the + correctness of the compressed output even if it is not set appropriately. + Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler + decoder for special applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid + method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is + incompatible with the version assumed by the caller (ZLIB_VERSION). msg is + set to null if there is no error message. deflateInit2 does not perform any + compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. When using the zlib format, this + function must be called immediately after deflateInit, deflateInit2 or + deflateReset, and before any call of deflate. When doing raw deflate, this + function must be called either before any call of deflate, or immediately + after the completion of a deflate block, i.e. after all input has been + consumed and all output has been delivered when using any of the flush + options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The + compressor and decompressor must use exactly the same dictionary (see + inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size + provided in deflateInit or deflateInit2. Thus the strings most likely to be + useful should be put at the end of the dictionary, not at the front. In + addition, the current implementation of deflate will use at most the window + size minus 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the Adler-32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The Adler-32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + Adler-32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if not at a block boundary for raw deflate). deflateSetDictionary does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by deflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If deflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + deflateGetDictionary() may return a length less than the window size, even + when more than the window size in input has been provided. It may return up + to 258 bytes less in that case, due to how zlib's implementation of deflate + manages the sliding window and lookahead for matches, where matches can be + up to 258 bytes long. If the application needs the last window-size bytes of + input, then that would need to be saved by the application outside of zlib. + + deflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and can + consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, but + does not free and reallocate the internal compression state. The stream + will leave the compression level and any other attributes that may have been + set unchanged. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2(). This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different strategy. + If the compression approach (which is a function of the level) or the + strategy is changed, and if any input has been consumed in a previous + deflate() call, then the input available so far is compressed with the old + level and strategy using deflate(strm, Z_BLOCK). There are three approaches + for the compression levels 0, 1..3, and 4..9 respectively. The new level + and strategy will take effect at the next call of deflate(). + + If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does + not have enough output space to complete, then the parameter change will not + take effect. In this case, deflateParams() can be called again with the + same parameters and more output space to try again. + + In order to assure a change in the parameters on the first try, the + deflate stream should be flushed using deflate() with Z_BLOCK or other flush + request until strm.avail_out is not zero, before calling deflateParams(). + Then no more input data should be provided before the deflateParams() call. + If this is done, the old level and strategy will be applied to the data + compressed before deflateParams(), and the new level and strategy will be + applied to the the data compressed after deflateParams(). + + deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream + state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if + there was not enough output space to complete the compression of the + available input data before a change in the strategy or approach. Note that + in the case of a Z_BUF_ERROR, the parameters are not changed. A return + value of Z_BUF_ERROR is not fatal, in which case deflateParams() can be + retried with more output space. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() or + deflateInit2(), and after deflateSetHeader(), if used. This would be used + to allocate an output buffer for deflation in a single pass, and so would be + called before deflate(). If that first deflate() call is provided the + sourceLen input bytes, an output buffer allocated to the size returned by + deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed + to return Z_STREAM_END. Note that it is possible for the compressed size to + be larger than the value returned by deflateBound() if flush options other + than Z_FINISH or Z_NO_FLUSH are used. +*/ + +ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, + unsigned *pending, + int *bits)); +/* + deflatePending() returns the number of bytes and bits of output that have + been generated, but not yet provided in the available output. The bytes not + provided would be due to the available output space having being consumed. + The number of bits of output not provided are between 0 and 7, where they + await more bits to join them in order to fill out a full byte. If pending + or bits are Z_NULL, then those values are not set. + + deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. + */ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the bits + leftover from a previous deflate stream when appending to it. As such, this + function can only be used for raw deflate, and must be used before the first + deflate() call after a deflateInit2() or deflateReset(). bits must be less + than or equal to 16, and that many of the least significant bits of value + will be inserted in the output. + + deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough + room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be zero to request that inflate use the window size in + the zlib header of the compressed stream. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an Adler-32 or a CRC-32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a + CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see + below), inflate() will not automatically decode concatenated gzip streams. + inflate() will return Z_STREAM_END at the end of the gzip stream. The state + would need to be reset to continue decoding a subsequent gzip stream. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit2 does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit2() does not process any header information -- that is + deferred until inflate() is called. +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the Adler-32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called at any + time to set the dictionary. If the provided dictionary is smaller than the + window and there is already data in the window, then the provided dictionary + will amend what's there. The application must insure that the dictionary + that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect Adler-32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by inflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If inflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a possible full flush point (see above + for the description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync searches for a 00 00 FF FF pattern in the compressed data. + All full flush points have this pattern, but not all occurrences of this + pattern are full flush points. + + inflateSync returns Z_OK if a possible full flush point has been found, + Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point + has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. + In the success case, the application may save the current current value of + total_in which indicates where valid compressed data was found. In the + error case, the application may repeatedly call inflateSync, providing more + input each time, until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate the internal decompression state. The + stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, + int windowBits)); +/* + This function is the same as inflateReset, but it also permits changing + the wrap and window size requests. The windowBits parameter is interpreted + the same as it is for inflateInit2. If the window size is changed, then the + memory allocated for the window is freed, and the window will be reallocated + by inflate() if needed. + + inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL), or if + the windowBits parameter is invalid. +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + If bits is negative, then the input stream bit buffer is emptied. Then + inflatePrime() can be called again to put bits in the buffer. This is used + to clear out bits leftover after feeding inflate a block description prior + to feeding inflate codes. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +/* + This function returns two values, one in the lower 16 bits of the return + value, and the other in the remaining upper bits, obtained by shifting the + return value down 16 bits. If the upper value is -1 and the lower value is + zero, then inflate() is currently decoding information outside of a block. + If the upper value is -1 and the lower value is non-zero, then inflate is in + the middle of a stored block, with the lower value equaling the number of + bytes from the input remaining to copy. If the upper value is not -1, then + it is the number of bits back from the current bit position in the input of + the code (literal or length/distance pair) currently being processed. In + that case the lower value is the number of bytes already emitted for that + code. + + A code is being processed if inflate is waiting for more input to complete + decoding of the code, or if it has completed decoding but is waiting for + more output space to write the literal or match data. + + inflateMark() is used to mark locations in the input data for random + access, which may be at bit positions, and to note those cases where the + output of a code may span boundaries of random access blocks. The current + location in the input stream can be determined from avail_in and data_type + as noted in the description for the Z_BLOCK flush parameter for inflate. + + inflateMark returns the value noted above, or -65536 if the provided + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be + used to force inflate() to return immediately after header processing is + complete and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When any + of extra, name, or comment are not Z_NULL and the respective field is not + present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the parameters are invalid, Z_MEM_ERROR if the internal state could not be + allocated, or Z_VERSION_ERROR if the version of the library does not match + the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, + z_const unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is potentially more efficient than + inflate() for file i/o applications, in that it avoids copying between the + output and the sliding window by simply making the window itself the output + buffer. inflate() can be faster on modern CPUs when used with large + buffers. inflateBack() trusts the application to not change the output + buffer passed by the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free the + allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects only + the raw deflate stream to decompress. This is different from the default + behavior of inflate(), which expects a zlib header and trailer around the + deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero -- buf is ignored in that + case -- and inflateBack() will return a buffer error. inflateBack() will + call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. + out() should return zero on success, or non-zero on failure. If out() + returns non-zero, inflateBack() will return with an error. Neither in() nor + out() are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format error + in the deflate stream (in which case strm->msg is set to indicate the nature + of the error), or Z_STREAM_ERROR if the stream was not properly initialized. + In the case of Z_BUF_ERROR, an input or output error can be distinguished + using strm->next_in which will be Z_NULL only if in() returned an error. If + strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning + non-zero. (in() will always be called before out(), so strm->next_in is + assured to be defined if out() returns non-zero.) Note that inflateBack() + cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: ZLIB_DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + +#ifndef Z_SOLO + + /* utility functions */ + +/* + The following utility functions are implemented on top of the basic + stream-oriented functions. To simplify the interface, some default options + are assumed (compression level and memory usage, standard memory allocation + functions). The source code of these utility functions can be modified if + you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed data. compress() is equivalent to compress2() with a level + parameter of Z_DEFAULT_COMPRESSION. + + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed data. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before a + compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, destLen + is the actual size of the uncompressed data. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In + the case where there is not enough room, uncompress() will fill the output + buffer with the uncompressed data up to that point. +*/ + +ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong *sourceLen)); +/* + Same as uncompress, except that sourceLen is a pointer, where the + length of the source is *sourceLen. On return, *sourceLen is the number of + source bytes consumed. +*/ + + /* gzip file access functions */ + +/* + This library supports reading and writing files in gzip (.gz) format with + an interface similar to that of stdio, using the functions that start with + "gz". The gzip format is different from the zlib format. gzip is a gzip + wrapper, documented in RFC 1952, wrapped around a deflate stream. +*/ + +typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ + +/* +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); + + Opens a gzip (.gz) file for reading or writing. The mode parameter is as + in fopen ("rb" or "wb") but can also include a compression level ("wb9") or + a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only + compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' + for fixed code compression as in "wb9F". (See the description of + deflateInit2 for more information about the strategy parameter.) 'T' will + request transparent writing or appending with no compression and not using + the gzip format. + + "a" can be used instead of "w" to request that the gzip stream that will + be written be appended to the file. "+" will result in an error, since + reading and writing to the same gzip file is not supported. The addition of + "x" when writing will create the file exclusively, which fails if the file + already exists. On systems that support it, the addition of "e" when + reading or writing will set the flag to close the file on an execve() call. + + These functions, as well as gzip, will read and decode a sequence of gzip + streams in a file. The append function of gzopen() can be used to create + such a file. (Also see gzflush() for another way to do this.) When + appending, gzopen does not test whether the file begins with a gzip stream, + nor does it look for the end of the gzip streams to begin appending. gzopen + will simply append a gzip stream to the existing file. + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. When + reading, this will be detected automatically by looking for the magic two- + byte gzip header. + + gzopen returns NULL if the file could not be opened, if there was + insufficient memory to allocate the gzFile state, or if an invalid mode was + specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). + errno can be checked to determine if the reason gzopen failed was that the + file could not be opened. +*/ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen associates a gzFile with the file descriptor fd. File descriptors + are obtained from calls like open, dup, creat, pipe or fileno (if the file + has been previously opened with fopen). The mode parameter is as in gzopen. + + The next call of gzclose on the returned gzFile will also close the file + descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor + fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, + mode);. The duplicated descriptor should be saved to avoid a leak, since + gzdopen does not close fd if it fails. If you are using fileno() to get the + file descriptor from a FILE *, then you will have to use dup() to avoid + double-close()ing the file descriptor. Both gzclose() and fclose() will + close the associated file descriptor, so they need to have different file + descriptors. + + gzdopen returns NULL if there was insufficient memory to allocate the + gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not + provided, or '+' was provided), or if fd is -1. The file descriptor is not + used until the next gz* read, write, seek, or close operation, so gzdopen + will not detect if fd is invalid (unless fd is -1). +*/ + +ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +/* + Set the internal buffer size used by this library's functions. The + default buffer size is 8192 bytes. This function must be called after + gzopen() or gzdopen(), and before any other calls that read or write the + file. The buffer memory allocation is always deferred to the first read or + write. Three times that size in buffer space is allocated. A larger buffer + size of, for example, 64K or 128K bytes will noticeably increase the speed + of decompression (reading). + + The new buffer size also affects the maximum length for gzprintf(). + + gzbuffer() returns 0 on success, or -1 on failure, such as being called + too late. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. Previously provided + data is flushed before the parameter change. + + gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not + opened for writing, Z_ERRNO if there is an error writing the flushed data, + or Z_MEM_ERROR if there is a memory allocation error. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. If + the input file is not in gzip format, gzread copies the given number of + bytes into the buffer directly from the file. + + After reaching the end of a gzip stream in the input, gzread will continue + to read, looking for another gzip stream. Any number of gzip streams may be + concatenated in the input file, and will all be decompressed by gzread(). + If something other than a gzip stream is encountered after a gzip stream, + that remaining trailing garbage is ignored (and no error is returned). + + gzread can be used to read a gzip file that is being concurrently written. + Upon reaching the end of the input, gzread will return with the available + data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then + gzclearerr can be used to clear the end of file indicator in order to permit + gzread to be tried again. Z_OK indicates that a gzip stream was completed + on the last gzread. Z_BUF_ERROR indicates that the input file ended in the + middle of a gzip stream. Note that gzread does not return -1 in the event + of an incomplete gzip stream. This error is deferred until gzclose(), which + will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip + stream. Alternatively, gzerror can be used before gzclose to detect this + case. + + gzread returns the number of uncompressed bytes actually read, less than + len for end of file, or -1 for error. If len is too large to fit in an int, + then nothing is read, -1 is returned, and the error state is set to + Z_STREAM_ERROR. +*/ + +ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, + gzFile file)); +/* + Read up to nitems items of size size from file to buf, otherwise operating + as gzread() does. This duplicates the interface of stdio's fread(), with + size_t request and return types. If the library defines size_t, then + z_size_t is identical to size_t. If not, then z_size_t is an unsigned + integer type that can contain a pointer. + + gzfread() returns the number of full items read of size size, or zero if + the end of the file was reached and a full item could not be read, or if + there was an error. gzerror() must be consulted if zero is returned in + order to determine if there was an error. If the multiplication of size and + nitems overflows, i.e. the product does not fit in a z_size_t, then nothing + is read, zero is returned, and the error state is set to Z_STREAM_ERROR. + + In the event that the end of file is reached and only a partial item is + available at the end, i.e. the remaining uncompressed data length is not a + multiple of size, then the final partial item is nevetheless read into buf + and the end-of-file flag is set. The length of the partial item read is not + provided, but could be inferred from the result of gztell(). This behavior + is the same as the behavior of fread() implementations in common libraries, + but it prevents the direct use of gzfread() to read a concurrently written + file, reseting and retrying on end-of-file, when size is not 1. +*/ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes written or 0 in case of + error. +*/ + +ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, + z_size_t nitems, gzFile file)); +/* + gzfwrite() writes nitems items of size size from buf to file, duplicating + the interface of stdio's fwrite(), with size_t request and return types. If + the library defines size_t, then z_size_t is identical to size_t. If not, + then z_size_t is an unsigned integer type that can contain a pointer. + + gzfwrite() returns the number of full items written of size size, or zero + if there was an error. If the multiplication of size and nitems overflows, + i.e. the product does not fit in a z_size_t, then nothing is written, zero + is returned, and the error state is set to Z_STREAM_ERROR. +*/ + +ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the arguments to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written, or a negative zlib error code in case + of error. The number of uncompressed bytes written is limited to 8191, or + one less than the buffer size given to gzbuffer(). The caller should assure + that this limit is not exceeded. If it is exceeded, then gzprintf() will + return an error (0) with nothing written. In this case, there may also be a + buffer overflow with unpredictable consequences, which is possible only if + zlib was compiled with the insecure functions sprintf() or vsprintf() + because the secure snprintf() or vsnprintf() functions were not available. + This can be determined using zlibCompileFlags(). +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or a + newline character is read and transferred to buf, or an end-of-file + condition is encountered. If any characters are read or if len == 1, the + string is terminated with a null character. If no characters are read due + to an end-of-file or len < 1, then the buffer is left untouched. + + gzgets returns buf which is a null-terminated string, or it returns NULL + for end-of-file or in case of error. If there was an error, the contents at + buf are indeterminate. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. gzputc + returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte or -1 + in case of end of file or error. This is implemented as a macro for speed. + As such, it does not do all of the checking the other functions do. I.e. + it does not check to see if file is NULL, nor whether the structure file + points to has been clobbered or not. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read as the first character + on the next read. At least one character of push-back is allowed. + gzungetc() returns the character pushed, or -1 on failure. gzungetc() will + fail if c is -1, and may fail if a character has been pushed but not read + yet. If gzungetc is used immediately after gzopen or gzdopen, at least the + output buffer size of pushed characters is allowed. (See gzbuffer above.) + The pushed character will be discarded if the stream is repositioned with + gzseek() or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter flush + is as in the deflate() function. The return value is the zlib error number + (see function gzerror below). gzflush is only permitted when writing. + + If the flush parameter is Z_FINISH, the remaining data is written and the + gzip stream is completed in the output. If gzwrite() is called again, a new + gzip stream will be started in the output. gzread() is able to read such + concatenated gzip streams. + + gzflush should be called only when strictly necessary because it will + degrade compression if called too often. +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); + + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); + + Returns the starting position for the next gzread or gzwrite on the given + compressed file. This position represents a number of bytes in the + uncompressed data stream, and is zero when starting, even if appending or + reading a gzip stream from the middle of a file using gzdopen(). + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); + + Returns the current offset in the file being read or written. This offset + includes the count of bytes that precede the gzip stream, for example when + appending or when using gzdopen() for reading. When reading, the offset + does not include as yet unused buffered input. This information can be used + for a progress indicator. On error, gzoffset() returns -1. +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns true (1) if the end-of-file indicator has been set while reading, + false (0) otherwise. Note that the end-of-file indicator is set only if the + read tried to go past the end of the input, but came up short. Therefore, + just like feof(), gzeof() may return false even if there is no more data to + read, in the event that the last read request was for the exact number of + bytes remaining in the input file. This will happen if the input file size + is an exact multiple of the buffer size. + + If gzeof() returns true, then the read functions will return no more data, + unless the end-of-file indicator is reset by gzclearerr() and the input file + has grown since the previous end of file was detected. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns true (1) if file is being copied directly while reading, or false + (0) if file is a gzip stream being decompressed. + + If the input file is empty, gzdirect() will return true, since the input + does not contain a gzip stream. + + If gzdirect() is used immediately after gzopen() or gzdopen() it will + cause buffers to be allocated to allow reading the file to determine if it + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). + + When writing, gzdirect() returns true (1) if transparent writing was + requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: + gzdirect() is not needed when writing. Transparent writing must be + explicitly requested, so the application already knows the answer. When + linking statically, using gzdirect() will include all of the zlib code for + gzip file reading and decompression, which may not be desired.) +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file and + deallocates the (de)compression state. Note that once file is closed, you + cannot call gzerror with file, since its structures have been deallocated. + gzclose must not be called more than once on the same file, just as free + must not be called more than once on the same allocation. + + gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a + file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the + last read ended in the middle of a gzip stream, or Z_OK on success. +*/ + +ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +/* + Same as gzclose(), but gzclose_r() is only for use when reading, and + gzclose_w() is only for use when writing or appending. The advantage to + using these instead of gzclose() is that they avoid linking in zlib + compression or decompression code that is not used when only reading or only + writing respectively. If gzclose() is used, then both compression and + decompression code will be included the application when linking to a static + zlib library. +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the given + compressed file. errnum is set to zlib error number. If an error occurred + in the file system and not in the compression library, errnum is set to + Z_ERRNO and the application may consult errno to get the exact error code. + + The application must not modify the returned string. Future calls to + this function may invalidate the previously returned string. If file is + closed, then the string previously returned by gzerror will no longer be + available. + + gzerror() should be used to distinguish errors from end-of-file for those + functions above that do not distinguish those cases in their return values. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + +#endif /* !Z_SOLO */ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the compression + library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is Z_NULL, this function returns the + required initial value for the checksum. + + An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed + much faster. + + Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf, + z_size_t len)); +/* + Same as adler32(), but with a size_t length. +*/ + +/* +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); + + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note + that the z_off_t type (like off_t) is a signed integer. If len2 is + negative, the result has no meaning or utility. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is Z_NULL, this function returns the required + initial value for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf, + z_size_t len)); +/* + Same as crc32(), but with a size_t length. +*/ + +/* +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#ifdef Z_PREFIX_SET +# define z_deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +# define z_inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) +#else +# define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +# define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +# define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +# define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +# define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) +#endif + +#ifndef Z_SOLO + +/* gzgetc() macro and its supporting function and exposed data structure. Note + * that the real internal state is much larger than the exposed structure. + * This abbreviated structure exposes just enough for the gzgetc() macro. The + * user should not mess with these exposed elements, since their names or + * behavior could change in the future, perhaps even capriciously. They can + * only be used by the gzgetc() macro. You have been warned. + */ +struct gzFile_s { + unsigned have; + unsigned char *next; + z_off64_t pos; +}; +ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +# define z_gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) +#else +# define gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) +#endif + +/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or + * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if + * both are true, the application gets the *64 functions, and the regular + * functions are changed to 64 bits) -- in case these are set on systems + * without large file support, _LFS64_LARGEFILE must also be true + */ +#ifdef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); +#endif + +#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) +# ifdef Z_PREFIX_SET +# define z_gzopen z_gzopen64 +# define z_gzseek z_gzseek64 +# define z_gztell z_gztell64 +# define z_gzoffset z_gzoffset64 +# define z_adler32_combine z_adler32_combine64 +# define z_crc32_combine z_crc32_combine64 +# else +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# endif +# ifndef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +# endif +#else + ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); +#endif + +#else /* Z_SOLO */ + + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + +#endif /* !Z_SOLO */ + +/* undocumented functions */ +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); +ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); +ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); +ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp)); +ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); +ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); +#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO) +ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, + const char *mode)); +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, + const char *format, + va_list va)); +# endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/externe_kniznice/zlib/zlib.map b/externe_kniznice/zlib/zlib.map new file mode 100644 index 0000000..82ce98c --- /dev/null +++ b/externe_kniznice/zlib/zlib.map @@ -0,0 +1,94 @@ +ZLIB_1.2.0 { + global: + compressBound; + deflateBound; + inflateBack; + inflateBackEnd; + inflateBackInit_; + inflateCopy; + local: + deflate_copyright; + inflate_copyright; + inflate_fast; + inflate_table; + zcalloc; + zcfree; + z_errmsg; + gz_error; + gz_intmax; + _*; +}; + +ZLIB_1.2.0.2 { + gzclearerr; + gzungetc; + zlibCompileFlags; +} ZLIB_1.2.0; + +ZLIB_1.2.0.8 { + deflatePrime; +} ZLIB_1.2.0.2; + +ZLIB_1.2.2 { + adler32_combine; + crc32_combine; + deflateSetHeader; + inflateGetHeader; +} ZLIB_1.2.0.8; + +ZLIB_1.2.2.3 { + deflateTune; + gzdirect; +} ZLIB_1.2.2; + +ZLIB_1.2.2.4 { + inflatePrime; +} ZLIB_1.2.2.3; + +ZLIB_1.2.3.3 { + adler32_combine64; + crc32_combine64; + gzopen64; + gzseek64; + gztell64; + inflateUndermine; +} ZLIB_1.2.2.4; + +ZLIB_1.2.3.4 { + inflateReset2; + inflateMark; +} ZLIB_1.2.3.3; + +ZLIB_1.2.3.5 { + gzbuffer; + gzoffset; + gzoffset64; + gzclose_r; + gzclose_w; +} ZLIB_1.2.3.4; + +ZLIB_1.2.5.1 { + deflatePending; +} ZLIB_1.2.3.5; + +ZLIB_1.2.5.2 { + deflateResetKeep; + gzgetc_; + inflateResetKeep; +} ZLIB_1.2.5.1; + +ZLIB_1.2.7.1 { + inflateGetDictionary; + gzvprintf; +} ZLIB_1.2.5.2; + +ZLIB_1.2.9 { + inflateCodesUsed; + inflateValidate; + uncompress2; + gzfread; + gzfwrite; + deflateGetDictionary; + adler32_z; + crc32_z; +} ZLIB_1.2.7.1; diff --git a/externe_kniznice/zlib/zlib.pc.cmakein b/externe_kniznice/zlib/zlib.pc.cmakein new file mode 100644 index 0000000..a5e6429 --- /dev/null +++ b/externe_kniznice/zlib/zlib.pc.cmakein @@ -0,0 +1,13 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=@CMAKE_INSTALL_PREFIX@ +libdir=@INSTALL_LIB_DIR@ +sharedlibdir=@INSTALL_LIB_DIR@ +includedir=@INSTALL_INC_DIR@ + +Name: zlib +Description: zlib compression library +Version: @VERSION@ + +Requires: +Libs: -L${libdir} -L${sharedlibdir} -lz +Cflags: -I${includedir} diff --git a/externe_kniznice/zlib/zlib.pc.in b/externe_kniznice/zlib/zlib.pc.in new file mode 100644 index 0000000..7e5acf9 --- /dev/null +++ b/externe_kniznice/zlib/zlib.pc.in @@ -0,0 +1,13 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +sharedlibdir=@sharedlibdir@ +includedir=@includedir@ + +Name: zlib +Description: zlib compression library +Version: @VERSION@ + +Requires: +Libs: -L${libdir} -L${sharedlibdir} -lz +Cflags: -I${includedir} diff --git a/externe_kniznice/zlib/zlib2ansi b/externe_kniznice/zlib/zlib2ansi new file mode 100644 index 0000000..15e3e16 --- /dev/null +++ b/externe_kniznice/zlib/zlib2ansi @@ -0,0 +1,152 @@ +#!/usr/bin/perl + +# Transform K&R C function definitions into ANSI equivalent. +# +# Author: Paul Marquess +# Version: 1.0 +# Date: 3 October 2006 + +# TODO +# +# Asumes no function pointer parameters. unless they are typedefed. +# Assumes no literal strings that look like function definitions +# Assumes functions start at the beginning of a line + +use strict; +use warnings; + +local $/; +$_ = <>; + +my $sp = qr{ \s* (?: /\* .*? \*/ )? \s* }x; # assume no nested comments + +my $d1 = qr{ $sp (?: [\w\*\s]+ $sp)* $sp \w+ $sp [\[\]\s]* $sp }x ; +my $decl = qr{ $sp (?: \w+ $sp )+ $d1 }xo ; +my $dList = qr{ $sp $decl (?: $sp , $d1 )* $sp ; $sp }xo ; + + +while (s/^ + ( # Start $1 + ( # Start $2 + .*? # Minimal eat content + ( ^ \w [\w\s\*]+ ) # $3 -- function name + \s* # optional whitespace + ) # $2 - Matched up to before parameter list + + \( \s* # Literal "(" + optional whitespace + ( [^\)]+ ) # $4 - one or more anythings except ")" + \s* \) # optional whitespace surrounding a Literal ")" + + ( (?: $dList )+ ) # $5 + + $sp ^ { # literal "{" at start of line + ) # Remember to $1 + //xsom + ) +{ + my $all = $1 ; + my $prefix = $2; + my $param_list = $4 ; + my $params = $5; + + StripComments($params); + StripComments($param_list); + $param_list =~ s/^\s+//; + $param_list =~ s/\s+$//; + + my $i = 0 ; + my %pList = map { $_ => $i++ } + split /\s*,\s*/, $param_list; + my $pMatch = '(\b' . join('|', keys %pList) . '\b)\W*$' ; + + my @params = split /\s*;\s*/, $params; + my @outParams = (); + foreach my $p (@params) + { + if ($p =~ /,/) + { + my @bits = split /\s*,\s*/, $p; + my $first = shift @bits; + $first =~ s/^\s*//; + push @outParams, $first; + $first =~ /^(\w+\s*)/; + my $type = $1 ; + push @outParams, map { $type . $_ } @bits; + } + else + { + $p =~ s/^\s+//; + push @outParams, $p; + } + } + + + my %tmp = map { /$pMatch/; $_ => $pList{$1} } + @outParams ; + + @outParams = map { " $_" } + sort { $tmp{$a} <=> $tmp{$b} } + @outParams ; + + print $prefix ; + print "(\n" . join(",\n", @outParams) . ")\n"; + print "{" ; + +} + +# Output any trailing code. +print ; +exit 0; + + +sub StripComments +{ + + no warnings; + + # Strip C & C++ coments + # From the perlfaq + $_[0] =~ + + s{ + /\* ## Start of /* ... */ comment + [^*]*\*+ ## Non-* followed by 1-or-more *'s + ( + [^/*][^*]*\*+ + )* ## 0-or-more things which don't start with / + ## but do end with '*' + / ## End of /* ... */ comment + + | ## OR C++ Comment + // ## Start of C++ comment // + [^\n]* ## followed by 0-or-more non end of line characters + + | ## OR various things which aren't comments: + + ( + " ## Start of " ... " string + ( + \\. ## Escaped char + | ## OR + [^"\\] ## Non "\ + )* + " ## End of " ... " string + + | ## OR + + ' ## Start of ' ... ' string + ( + \\. ## Escaped char + | ## OR + [^'\\] ## Non '\ + )* + ' ## End of ' ... ' string + + | ## OR + + . ## Anything other char + [^/"'\\]* ## Chars which doesn't start a comment, string or escape + ) + }{$2}gxs; + +} diff --git a/externe_kniznice/zlib/zutil.c b/externe_kniznice/zlib/zutil.c new file mode 100644 index 0000000..a76c6b0 --- /dev/null +++ b/externe_kniznice/zlib/zutil.c @@ -0,0 +1,325 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2017 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" +#ifndef Z_SOLO +# include "gzguts.h" +#endif + +z_const char * const z_errmsg[10] = { + (z_const char *)"need dictionary", /* Z_NEED_DICT 2 */ + (z_const char *)"stream end", /* Z_STREAM_END 1 */ + (z_const char *)"", /* Z_OK 0 */ + (z_const char *)"file error", /* Z_ERRNO (-1) */ + (z_const char *)"stream error", /* Z_STREAM_ERROR (-2) */ + (z_const char *)"data error", /* Z_DATA_ERROR (-3) */ + (z_const char *)"insufficient memory", /* Z_MEM_ERROR (-4) */ + (z_const char *)"buffer error", /* Z_BUF_ERROR (-5) */ + (z_const char *)"incompatible version",/* Z_VERSION_ERROR (-6) */ + (z_const char *)"" +}; + + +const char * ZEXPORT zlibVersion() +{ + return ZLIB_VERSION; +} + +uLong ZEXPORT zlibCompileFlags() +{ + uLong flags; + + flags = 0; + switch ((int)(sizeof(uInt))) { + case 2: break; + case 4: flags += 1; break; + case 8: flags += 2; break; + default: flags += 3; + } + switch ((int)(sizeof(uLong))) { + case 2: break; + case 4: flags += 1 << 2; break; + case 8: flags += 2 << 2; break; + default: flags += 3 << 2; + } + switch ((int)(sizeof(voidpf))) { + case 2: break; + case 4: flags += 1 << 4; break; + case 8: flags += 2 << 4; break; + default: flags += 3 << 4; + } + switch ((int)(sizeof(z_off_t))) { + case 2: break; + case 4: flags += 1 << 6; break; + case 8: flags += 2 << 6; break; + default: flags += 3 << 6; + } +#ifdef ZLIB_DEBUG + flags += 1 << 8; +#endif +#if defined(ASMV) || defined(ASMINF) + flags += 1 << 9; +#endif +#ifdef ZLIB_WINAPI + flags += 1 << 10; +#endif +#ifdef BUILDFIXED + flags += 1 << 12; +#endif +#ifdef DYNAMIC_CRC_TABLE + flags += 1 << 13; +#endif +#ifdef NO_GZCOMPRESS + flags += 1L << 16; +#endif +#ifdef NO_GZIP + flags += 1L << 17; +#endif +#ifdef PKZIP_BUG_WORKAROUND + flags += 1L << 20; +#endif +#ifdef FASTEST + flags += 1L << 21; +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifdef NO_vsnprintf + flags += 1L << 25; +# ifdef HAS_vsprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_vsnprintf_void + flags += 1L << 26; +# endif +# endif +#else + flags += 1L << 24; +# ifdef NO_snprintf + flags += 1L << 25; +# ifdef HAS_sprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_snprintf_void + flags += 1L << 26; +# endif +# endif +#endif + return flags; +} + +#ifdef ZLIB_DEBUG +#include +# ifndef verbose +# define verbose 0 +# endif +int ZLIB_INTERNAL z_verbose = verbose; + +void ZLIB_INTERNAL z_error (m) + char *m; +{ + fprintf(stderr, "%s\n", m); + exit(1); +} +#endif + +/* exported to allow conversion of error code to string for compress() and + * uncompress() + */ +const char * ZEXPORT zError(err) + int err; +{ + return ERR_MSG(err); +} + +#if defined(_WIN32_WCE) + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. + */ + int errno = 0; +#endif + +#ifndef HAVE_MEMCPY + +void ZLIB_INTERNAL zmemcpy(dest, source, len) + Bytef* dest; + const Bytef* source; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +int ZLIB_INTERNAL zmemcmp(s1, s2, len) + const Bytef* s1; + const Bytef* s2; + uInt len; +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void ZLIB_INTERNAL zmemzero(dest, len) + Bytef* dest; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif + +#ifndef Z_SOLO + +#ifdef SYS16BIT + +#ifdef __TURBOC__ +/* Turbo C in 16-bit mode */ + +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf; + ulg bsize = (ulg)items*size; + + (void)opaque; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +{ + int n; + + (void)opaque; + + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + Assert(0, "zcfree: ptr not found"); +} + +#endif /* __TURBOC__ */ + + +#ifdef M_I86 +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) +{ + (void)opaque; + return _halloc((long)items, size); +} + +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +{ + (void)opaque; + _hfree(ptr); +} + +#endif /* M_I86 */ + +#endif /* SYS16BIT */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern voidp calloc OF((uInt items, uInt size)); +extern void free OF((voidpf ptr)); +#endif + +voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) + voidpf opaque; + unsigned items; + unsigned size; +{ + (void)opaque; + return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : + (voidpf)calloc(items, size); +} + +void ZLIB_INTERNAL zcfree (opaque, ptr) + voidpf opaque; + voidpf ptr; +{ + (void)opaque; + free(ptr); +} + +#endif /* MY_ZCALLOC */ + +#endif /* !Z_SOLO */ diff --git a/externe_kniznice/zlib/zutil.h b/externe_kniznice/zlib/zutil.h new file mode 100644 index 0000000..b079ea6 --- /dev/null +++ b/externe_kniznice/zlib/zutil.h @@ -0,0 +1,271 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include "zlib.h" + +#if defined(STDC) && !defined(Z_SOLO) +# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) +# include +# endif +# include +# include +#endif + +#ifdef Z_SOLO + typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ +#endif + +#ifndef local +# define local static +#endif +/* since "static" is used to mean two completely different things in C, we + define "local" for the non-static meaning of "static", for readability + (compile with -Dlocal if your debugger can't find static symbols) */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# ifndef Z_SOLO +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include +# endif +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 1 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 2 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#ifdef __370__ +# if __TARGET_LIB__ < 0x20000000 +# define OS_CODE 4 +# elif __TARGET_LIB__ < 0x40000000 +# define OS_CODE 11 +# else +# define OS_CODE 8 +# endif +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 5 +#endif + +#ifdef OS2 +# define OS_CODE 6 +# if defined(M_I86) && !defined(Z_SOLO) +# include +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 7 +# ifndef Z_SOLO +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +# endif +#endif + +#ifdef __acorn +# define OS_CODE 13 +#endif + +#if defined(WIN32) && !defined(__CYGWIN__) +# define OS_CODE 10 +#endif + +#ifdef _BEOS_ +# define OS_CODE 16 +#endif + +#ifdef __TOS_OS400__ +# define OS_CODE 18 +#endif + +#ifdef __APPLE__ +# define OS_CODE 19 +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + +#if defined(__BORLANDC__) && !defined(MSDOS) + #pragma warn -8004 + #pragma warn -8008 + #pragma warn -8066 +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_WIN32) && \ + (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 3 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(pyr) || defined(Z_SOLO) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef ZLIB_DEBUG +# include + extern int ZLIB_INTERNAL z_verbose; + extern void ZLIB_INTERNAL z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + +#ifndef Z_SOLO + voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, + unsigned size)); + void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); +#endif + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +/* Reverse the bytes in a 32-bit value */ +#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +#endif /* ZUTIL_H */ diff --git a/kniznica/komunikacia.c b/kniznica/komunikacia.c index f890e6b..ae53003 100644 --- a/kniznica/komunikacia.c +++ b/kniznica/komunikacia.c @@ -3,7 +3,7 @@ // Meno studenta: Tomas Lukac // // Veduci BP: prof. Ing. Milos Drutarovsky CSc. // // Skola: KEMT FEI TUKE // -// Datum poslednej upravy: 15.4.2020 // +// Datum poslednej upravy: 5.6.2020 // ////////////////////////////////////////////////// #include "komunikacia.h" @@ -321,5 +321,171 @@ int cakat_na_komunikaciu(int cislo_portu) return cislo_soketu; } +int rs232_otvorit_rozhranie(int cislo_rozhrania, int rychlost, char* rezim, int kontrola_toku_dat) +{ + int uspech = 0; + uspech = RS232_OpenComport(cislo_rozhrania, rychlost, rezim, kontrola_toku_dat); + if(uspech == 1) + { + fprintf(stderr, "Nebolo mozne otvorit seriove rozhranie\n"); + return -1; + } + return 0; +} + +int rs232_zatvorit_rozhranie(int cislo_rozhrania) +{ + RS232_CloseComport(cislo_rozhrania); + return 0; +} + +int rs232_odoslat_spravu(int cislo_rozhrania, char* sprava, int velkost_spravy) +{ + int uspech = 0; + int odoslane_data = 0; + + //kontrolne vzory, ktore jednoznacne identifikuju zaciatok a koniec spravy + unsigned char zaciatok_spravy[] = {0xAA, 0xAA, 0xAA, 0xAA}; + unsigned char koniec_spravy[] = {0xBB, 0xBB, 0xBB, 0xBB}; + + //vytvorenie bajtov ktore budu niest informaciu o velkosti posielanej spravy + unsigned char* velkost_spravy_hex = calloc(4, sizeof(unsigned char)); + velkost_spravy_hex[0] = (velkost_spravy >> 24) & 0xFF; + velkost_spravy_hex[1] = (velkost_spravy >> 16) & 0xFF; + velkost_spravy_hex[2] = (velkost_spravy >> 8) & 0xFF; + velkost_spravy_hex[3] = velkost_spravy & 0xFF; + + //odoslanie kontrolnych vzorov, bajtov s velkostou spravy a samotnych dat na seriove rozhranie + uspech = RS232_SendBuf(cislo_rozhrania, (unsigned char*)zaciatok_spravy, sizeof(zaciatok_spravy)); + if(uspech <= 0) + { + fprintf(stderr, "Nastala chyba pri odoslani kontrolneho vzoru\n"); + return -1; + } + uspech = RS232_SendBuf(cislo_rozhrania, (unsigned char*)velkost_spravy_hex, 4); + if(uspech <= 0) + { + fprintf(stderr, "Nastala chyba pri odoslani kontrolneho vzoru\n"); + return -1; + } + odoslane_data = (int)RS232_SendBuf(cislo_rozhrania, (unsigned char*)sprava, velkost_spravy); + RS232_SendBuf(cislo_rozhrania, (unsigned char*)koniec_spravy, sizeof(koniec_spravy)); + if(uspech <= 0) + { + fprintf(stderr, "Nastala chyba pri odoslani kontrolneho vzoru\n"); + return -1; + } + + free(velkost_spravy_hex); + + return odoslane_data; +} +int rs232_prijat_spravu(int cislo_rozhrania, const char* komunikacny_subor) +{ + //otvorenie suboru do ktoreho sa zapisuju prijate binarne data + //ktore sa nasledne nacitaju do buffera (buf) pre desifrovanie + FILE* subor = fopen(komunikacny_subor, "ab+"); + + int uspech = 0; + int prebieha_nacitanie = 0; + int prebieha_nacitanie_velkosti_spravy = 0; + unsigned char znak; + + //mnozstvo nacitanych dat + int nacitane_data = 0; + //velkost spravy, ktora sa bude prijmat + int velkost_spravy = 0; + //urcuje kolko bajtov z informacie o velkosti spravy + //uz bolo prijatych z celkoveho poctu (4) + int velkost_spravy_bajt = 0; + int velkost_spravy_pocet_bajtov = 4; + + //kontrolne vzory, ktore jednoznacne identifikuju zaciatok a koniec spravy + unsigned char zaciatok_spravy[] = {0xAA, 0xAA, 0xAA, 0xAA}; + int zaciatok_spravy_pozicia = 0; //aktualna pozicia v kontrolnom vzore + unsigned char koniec_spravy[] = {0xBB, 0xBB, 0xBB, 0xBB}; + int koniec_spravy_pozicia = 0; //aktualna pozicia v kontrolnom vzore + int velkost_kontrolneho_vzoru = sizeof(zaciatok_spravy)/sizeof(zaciatok_spravy[0]); + + while(1) + { + uspech = RS232_PollComport(cislo_rozhrania, &znak, 1); + if(uspech > 0) + { + //ak nacitanie spravy este nezacalo, ale bol najdeny bajt, ktory je sucastou kontrolneho vzoru, + //ktory urcuje zaciatok spravy, posun sa v kontrolnom vzore o jednu poziciu a cakaj ci nebudu + //prichadzat dalsie bajty z tohto kontrolneho vzoru + if(!prebieha_nacitanie && (znak == zaciatok_spravy[zaciatok_spravy_pozicia]) && + (zaciatok_spravy_pozicia < velkost_kontrolneho_vzoru - 1)) + { + zaciatok_spravy_pozicia++; + } + //ak prebehlo nacitanie vsetkych bajtov, ktore su sucastou kontrolneho vzoru urcujuceho zaciatok spravy + //ocakavaj prichod bajtov, ktore budu niest informaciu o velkosti spravy + else if(!prebieha_nacitanie && (znak == zaciatok_spravy[zaciatok_spravy_pozicia]) && + (zaciatok_spravy_pozicia == velkost_kontrolneho_vzoru - 1)) + { + prebieha_nacitanie_velkosti_spravy = 1; + zaciatok_spravy_pozicia = 0; + } + //pokracuj v nacitavani bajtov urcujucich velkost spravy, dokym nie su vsetky nacitane + //a po nacitani vsetkych bajtov moze zacat nacitanie spravy + else if(!prebieha_nacitanie && prebieha_nacitanie_velkosti_spravy) + { + velkost_spravy_bajt++; + if(velkost_spravy_bajt == velkost_spravy_pocet_bajtov) + { + prebieha_nacitanie = 1; + prebieha_nacitanie_velkosti_spravy = 0; + } + } + //ak prebieha nacitanie a bol najdeny bajt, ktory je sucastou kontrolneho vzoru, ktory urcuje koniec spravy, + //posun sa v kontrolnom vzore o jednu poziciu a cakaj ci nebudu prichadzat dalsie bajty z tohto kontrolneho vzoru + else if((prebieha_nacitanie && (znak == koniec_spravy[koniec_spravy_pozicia]) && + (koniec_spravy_pozicia == 0)) || (!prebieha_nacitanie && (znak == koniec_spravy[koniec_spravy_pozicia]) && + (koniec_spravy_pozicia < velkost_kontrolneho_vzoru - 1))) + { + koniec_spravy_pozicia++; + prebieha_nacitanie = 0; + } + //v pripade ak zacalo nacitanie kontrolneho vzoru, ktory urcuje koniec spravy, ale nebol najdeny posledny znak z tohto vzoru + //nacitaj do suboru docasne nezapisane znaky, ktore su sucastou kontrolneho vzoru a zaroven nacitaj aktualny znak + else if(!prebieha_nacitanie_velkosti_spravy && !prebieha_nacitanie && znak != koniec_spravy[koniec_spravy_pozicia]) + { + for(int i = 0; i < koniec_spravy_pozicia; i++) + { + fwrite((char*)&koniec_spravy[i], 1, uspech, subor); + nacitane_data += uspech; + } + fwrite((char*)&znak, 1, uspech, subor); + nacitane_data += uspech; + + koniec_spravy_pozicia = 0; + prebieha_nacitanie = 1; + } + //ak prebehlo nacitanie vsetkych bajtov, ktore su sucastou kontrolneho vzoru urcujuceho koniec spravy + //ukonci nacitanie spravy + else if(!prebieha_nacitanie_velkosti_spravy && !prebieha_nacitanie && (znak == koniec_spravy[0]) && + (koniec_spravy_pozicia == 3)) + { + prebieha_nacitanie = 0; + koniec_spravy_pozicia = 0; + break; + } + //inak prebieha nacitanie, cize zapis aktualny znak (bajt) do suboru + else + { + if(prebieha_nacitanie && !prebieha_nacitanie_velkosti_spravy) + { + fwrite((char*)&znak, 1, uspech, subor); + nacitane_data += uspech; + } + } + } + } + fclose(subor); + return nacitane_data; +} + diff --git a/kniznica/komunikacia.h b/kniznica/komunikacia.h index c534e9e..886ddd8 100644 --- a/kniznica/komunikacia.h +++ b/kniznica/komunikacia.h @@ -3,7 +3,7 @@ // Meno studenta: Tomas Lukac // // Veduci BP: prof. Ing. Milos Drutarovsky CSc. // // Skola: KEMT FEI TUKE // -// Datum poslednej upravy: 15.4.2020 // +// Datum poslednej upravy: 5.6.2020 // ////////////////////////////////////////////////// #ifndef __KOMUNIKACIA_H__ @@ -15,7 +15,7 @@ #include #include "kryptografia.h" -#include "rs232.h" +#include "../externe_kniznice/teuniz_rs232/rs232.h" #define VELKOST_CESTY 64 //velkost retazca, kt. uklada lokaciu suboru #define VELKOST_SUBOR 32 //velkost retazca, kt. uklada velkost prenasaneho suboru @@ -76,7 +76,38 @@ int cakat_na_komunikaciu(int cislo_portu); // RS232 KOMUNIKACNY KANAL // ///////////////////////////// -//.. +/** + * rs232_otvorit_rozhranie: realizuje otvorenie RS232 serioveho rozhrania + * @parameter int cislo_rozhrania: cislo RS232 serioveho rozhrania + * @parameter char* rezim: umoznuje nastavit rozhranie pri otvoreni + * @parameter int kontrola_toku_dat: umoznuje vypnut(0)/zapnut(1) kontrolu dat pomocou RTS/CTS signalov + * @vrati int : operacia bola uspesna(0), neuspesna(-1) + */ +int rs232_otvorit_rozhranie(int cislo_rozhrania, int rychlost, char* rezimu, int kontrola_toku_dat); + +/** + * rs232_zatvorit_rozhranie: realizuje zatvorenie RS232 serioveho rozhrania + * @parameter int cislo_rozhrania: cislo RS232 serioveho rozhrania + * @vrati int : operacia bola uspesna(0), neuspesna(-1) + */ +int rs232_zatvorit_rozhranie(int cislo_rozhrania); + +/** + * rs232_odoslat_spravu: realizuje poslanie spravy cez rs232 prenosovy kanal + * @parameter int cislo_rozhrania: cislo RS232 serioveho rozhrania + * @parameter char* sprava: ukazuje na buffer + * @parameter int velkost_spravy: velkost spravy na odoslanie + * @vrati int : pocet odoslanych bajtov + */ +int rs232_odoslat_spravu(int cislo_rozhrania, char* sprava, int velkost_spravy); + +/** + * rs232_prijat_spravu: realizuje prijatie spravy na rs232 seriovom rozhrani + * @parameter int cislo_rozhrania: cislo RS232 serioveho rozhrania + * @parameter const char* komunikacny_subor: cesta ku suboru, do ktoreho sa zapisuje komunikacia + * @vrati int : pocet prijatych bajtov + */ +int rs232_prijat_spravu(int cislo_rozhrania, const char* komunikacny_subor); ////////////////////// // PRACA SO SUBORMI // diff --git a/kniznica/kryptografia.c b/kniznica/kryptografia.c index 93c24a3..7672315 100644 --- a/kniznica/kryptografia.c +++ b/kniznica/kryptografia.c @@ -3,7 +3,7 @@ // Meno studenta: Tomas Lukac // // Veduci BP: prof. Ing. Milos Drutarovsky CSc. // // Skola: KEMT FEI TUKE // -// Datum poslednej upravy: 15.4.2020 // +// Datum poslednej upravy: 5.6.2020 // ////////////////////////////////////////////////// #include "kryptografia.h" @@ -39,15 +39,31 @@ WOLFSSL_CTX* nastavit_ctx_server() return ctx; } +void nastav_typ_aplikacie(nastavenia_aplikacie* nastavenia, typ_aplikacie typ_a) +{ + nastavenia->typ_a = typ_a; +} + void nastav_sifry(WOLFSSL_CTX* ctx, const char* sifry) { wolfSSL_CTX_set_cipher_list(ctx, sifry); } -void nastav_funkciu(nastavenia_aplikacie* nastavenia, char* typ_vypoctu, hashovacia_funkcia funkcia) +void nastav_funkciu(nastavenia_aplikacie* nastavenia, char* typ_vypoctu, hashovacia_funkcia h_funkcia, crc_funkcia c_funkcia) { strcpy(nastavenia->typ_vypoctu, typ_vypoctu); - nastavenia->funkcia = funkcia; + if(!strcmp(typ_vypoctu, "hash")) + { + nastavenia->h_funkcia = h_funkcia; + } + else if(!strcmp(typ_vypoctu, "crc")) + { + nastavenia->c_funkcia = c_funkcia; + } + else + { + fprintf(stderr, "Nepodarilo sa nastavit funkciu pre vypocet kontrolneho suctu.\n"); + } } void zobraz_sifru(WOLFSSL* ssl) @@ -285,9 +301,9 @@ int generovat_ecc_certifikat(int pocet_bitov, ecc_curve_id kluc_krivka, int algo //premenne pre ukladanie dat certifikatu Cert certifikat; - byte der_certifikat[VELKOST_BUFFERA]; + unsigned char der_certifikat[VELKOST_BUFFERA]; word32 der_certifikat_velkost; - byte pem_certifikat[VELKOST_BUFFERA]; + unsigned char pem_certifikat[VELKOST_BUFFERA]; word32 pem_certifikat_velkost; //vygenerovanie a podpis certifikatu @@ -348,9 +364,9 @@ int vygenerovat_rsa_ziadost(int pocet_bitov, int exponent, int algoritmus, char* //premenne pre ukladanie dat vygenerovaneho kluca RsaKey kluc; - byte der_kluc[VELKOST_BUFFERA]; + unsigned char der_kluc[VELKOST_BUFFERA]; word32 der_kluc_velkost; - byte pem_kluc[VELKOST_BUFFERA]; + unsigned char pem_kluc[VELKOST_BUFFERA]; word32 pem_kluc_velkost; //vygenerovanie kluca @@ -378,9 +394,9 @@ int vygenerovat_rsa_ziadost(int pocet_bitov, int exponent, int algoritmus, char* //premenne pre ukladanie dat ziadosti Cert ziadost; - byte der_ziadost[VELKOST_BUFFERA]; + unsigned char der_ziadost[VELKOST_BUFFERA]; word32 der_ziadost_velkost; - byte pem_ziadost[VELKOST_BUFFERA]; + unsigned char pem_ziadost[VELKOST_BUFFERA]; word32 pem_ziadost_velkost; //vygenerovanie a podpis ziadosti @@ -425,9 +441,9 @@ int vygenerovat_ecc_ziadost(int pocet_bitov, ecc_curve_id kluc_krivka, int algor //premenne pre ukladanie dat vygenerovaneho kluca ecc_key kluc; - byte der_kluc[VELKOST_BUFFERA]; + unsigned char der_kluc[VELKOST_BUFFERA]; word32 der_kluc_velkost; - byte pem_kluc[VELKOST_BUFFERA]; + unsigned char pem_kluc[VELKOST_BUFFERA]; word32 pem_kluc_velkost; //vygenerovanie kluca @@ -455,9 +471,9 @@ int vygenerovat_ecc_ziadost(int pocet_bitov, ecc_curve_id kluc_krivka, int algor //premenne pre ukladanie dat ziadosti Cert ziadost; - byte der_ziadost[VELKOST_BUFFERA]; + unsigned char der_ziadost[VELKOST_BUFFERA]; word32 der_ziadost_velkost; - byte pem_ziadost[VELKOST_BUFFERA]; + unsigned char pem_ziadost[VELKOST_BUFFERA]; word32 pem_ziadost_velkost; //vygenerovanie a podpis ziadosti @@ -530,132 +546,124 @@ void zobraz_certifikat(WOLFSSL* ssl) char* pole; if (!certifikat) { - printf("Nebolo mozne ziskat ziadny certifikat\n"); + fprintf(stderr, "Nebolo mozne ziskat ziadny certifikat\n"); } if ((pole = wolfSSL_X509_NAME_oneline(wolfSSL_X509_get_subject_name(certifikat), 0, 0))) { printf("Subjekt: %s\n", pole); - //wolfSSL_free(line); } if ((pole = wolfSSL_X509_NAME_oneline(wolfSSL_X509_get_issuer_name(certifikat), 0, 0))) { printf("Certifikacna autorita: %s\n", pole); - //wolfSSL_free(line); } X509_free(certifikat); } -byte* generovat_kontrolny_sucet_suboru(nastavenia_aplikacie* nastavenia, const char* cesta, int* velkost) +unsigned char* generovat_kontrolny_sucet_suboru(nastavenia_aplikacie* nastavenia, const char* cesta, int* velkost) { int pocet_bajtov; FILE* subor = fopen(cesta, "rb"); - unsigned char data[100000]; - memset(data, 0, 100000); - byte* vysledok; + unsigned char data[VELKOST_SUBORU]; + memset(data, 0, VELKOST_SUBORU); + unsigned char* vysledok; if(!strcmp(nastavenia->typ_vypoctu, "crc")) { - //crc32 - *velkost = 11; - vysledok = calloc(11, sizeof(byte)); - fread((unsigned char*)data, 1, 100000, subor); - int i, j; - unsigned int byte, crc, mask; - i = 0; - crc = 0xFFFFFFFF; - while (data[i] != 0) + if(nastavenia->c_funkcia == funkcia_CRC32) { - byte = data[i]; - crc = crc ^ byte; - for (j = 7; j >= 0; j--) - { - mask = -(crc & 1); - crc = (crc >> 1) ^ (0xEDB88320 & mask); - } - i = i + 1; + *velkost = CRC32_VELKOST; + vysledok = calloc(CRC32_VELKOST, sizeof(unsigned char)); + unsigned int crc = crc32(0L, Z_NULL, 0); + crc = crc32(crc, data, 10); + sprintf(vysledok, "%u", crc); } - crc = crc ^ 0xFFFFFFFF; - sprintf(vysledok, "%u", crc); + else + { + fprintf(stderr, "Nepodarilo sa vybrat funkciu pre vypocet kontrolneho suctu.\n"); + return NULL; + } } else if(!strcmp(nastavenia->typ_vypoctu, "hash")) { - if(nastavenia->funkcia == funkcia_SHA) + if(nastavenia->h_funkcia == funkcia_SHA) { *velkost = SHA_DIGEST_SIZE; - vysledok = calloc(SHA_DIGEST_SIZE, sizeof(byte)); + vysledok = calloc(SHA_DIGEST_SIZE, sizeof(unsigned char)); Sha sha; wc_InitSha(&sha); - while ((pocet_bajtov = fread (data, 1, 100000, subor)) != 0) + while ((pocet_bajtov = fread (data, 1, VELKOST_SUBORU, subor)) != 0) wc_ShaUpdate(&sha, data, pocet_bajtov); wc_ShaFinal(&sha, vysledok); } - else if(nastavenia->funkcia == funkcia_SHA224) + else if(nastavenia->h_funkcia == funkcia_SHA224) { *velkost = SHA224_DIGEST_SIZE; - vysledok = calloc(SHA224_DIGEST_SIZE, sizeof(byte)); + vysledok = calloc(SHA224_DIGEST_SIZE, sizeof(unsigned char)); Sha224 sha; wc_InitSha224(&sha); - while ((pocet_bajtov = fread (data, 1, 1024, subor)) != 0) + while ((pocet_bajtov = fread (data, 1, VELKOST_SUBORU, subor)) != 0) wc_Sha224Update(&sha, data, pocet_bajtov); wc_Sha224Final(&sha, vysledok); } - else if(nastavenia->funkcia == funkcia_SHA256) + else if(nastavenia->h_funkcia == funkcia_SHA256) { *velkost = SHA256_DIGEST_SIZE; - byte* vysledok = calloc(SHA256_DIGEST_SIZE, sizeof(byte)); + vysledok = calloc(SHA256_DIGEST_SIZE, sizeof(unsigned char)); Sha256 sha; wc_InitSha256(&sha); - while ((pocet_bajtov = fread (data, 1, 1024, subor)) != 0) + while ((pocet_bajtov = fread (data, 1, VELKOST_SUBORU, subor)) != 0) wc_Sha256Update(&sha, data, pocet_bajtov); wc_Sha256Final(&sha, vysledok); } - else if(nastavenia->funkcia == funkcia_SHA384) + else if(nastavenia->h_funkcia == funkcia_SHA384) { *velkost = SHA384_DIGEST_SIZE; - vysledok = calloc(SHA384_DIGEST_SIZE, sizeof(byte)); + vysledok = calloc(SHA384_DIGEST_SIZE, sizeof(unsigned char)); Sha384 sha; wc_InitSha384(&sha); - while ((pocet_bajtov = fread (data, 1, 1024, subor)) != 0) + while ((pocet_bajtov = fread (data, 1, VELKOST_SUBORU, subor)) != 0) wc_Sha384Update(&sha, data, pocet_bajtov); wc_Sha384Final(&sha, vysledok); } - else if(nastavenia->funkcia == funkcia_SHA512) + else if(nastavenia->h_funkcia == funkcia_SHA512) { *velkost = WC_SHA512_DIGEST_SIZE; - vysledok = calloc(WC_SHA512_DIGEST_SIZE, sizeof(byte)); + vysledok = calloc(WC_SHA512_DIGEST_SIZE, sizeof(unsigned char)); wc_Sha512 sha; wc_InitSha512(&sha); - while ((pocet_bajtov = fread (data, 1, 1024, subor)) != 0) + while ((pocet_bajtov = fread (data, 1, VELKOST_SUBORU, subor)) != 0) wc_Sha512Update(&sha, data, pocet_bajtov); wc_Sha512Final(&sha, vysledok); } - else if(nastavenia->funkcia == funkcia_BLAKE2B) + else if(nastavenia->h_funkcia == funkcia_BLAKE2B) { - *velkost = 64; - vysledok = calloc(64, sizeof(byte)); + *velkost = BLAKE2B_VELKOST; + vysledok = calloc(BLAKE2B_VELKOST, sizeof(unsigned char)); Blake2b b2b; - wc_InitBlake2b(&b2b, 64); - while ((pocet_bajtov = fread (data, 1, 1024, subor)) != 0) + wc_InitBlake2b(&b2b, BLAKE2B_VELKOST); + while ((pocet_bajtov = fread (data, 1, VELKOST_SUBORU, subor)) != 0) wc_Blake2bUpdate(&b2b, data, pocet_bajtov); - wc_Blake2bFinal(&b2b, vysledok, 64); + wc_Blake2bFinal(&b2b, vysledok, BLAKE2B_VELKOST); } - else if(nastavenia->funkcia == funkcia_RIPEMD160) + else if(nastavenia->h_funkcia == funkcia_RIPEMD160) { *velkost = RIPEMD_DIGEST_SIZE; - vysledok = calloc(RIPEMD_DIGEST_SIZE, sizeof(byte)); + vysledok = calloc(RIPEMD_DIGEST_SIZE, sizeof(unsigned char)); RipeMd ripemd; wc_InitRipeMd(&ripemd); - while ((pocet_bajtov = fread (data, 1, 1024, subor)) != 0) + while ((pocet_bajtov = fread (data, 1, VELKOST_SUBORU, subor)) != 0) wc_RipeMdUpdate(&ripemd, data, pocet_bajtov); wc_RipeMdFinal(&ripemd, vysledok); } else { fprintf(stderr, "Nepodarilo sa vybrat funkciu pre vypocet kontrolneho suctu.\n"); + return NULL; } } else { fprintf(stderr, "Nepodarilo sa vybrat funkciu pre vypocet kontrolneho suctu.\n"); + return NULL; } fclose(subor); return vysledok; diff --git a/kniznica/kryptografia.h b/kniznica/kryptografia.h index 7eaa9e4..3dae189 100644 --- a/kniznica/kryptografia.h +++ b/kniznica/kryptografia.h @@ -3,7 +3,7 @@ // Meno studenta: Tomas Lukac // // Veduci BP: prof. Ing. Milos Drutarovsky CSc. // // Skola: KEMT FEI TUKE // -// Datum poslednej upravy: 15.4.2020 // +// Datum poslednej upravy: 5.6.2020 // ////////////////////////////////////////////////// #ifndef __KRYPTOGRAFIA_H__ @@ -21,31 +21,63 @@ #include #include #include +#include "../externe_kniznice/zlib/zlib.h" #include #include #define VELKOST_BUFFERA 4096 +#define VELKOST_SUBORU 10000 +#define CRC32_VELKOST 10 +#define BLAKE2B_VELKOST 64 +/** + * enum typ_aplikacie: obsahuje mozne typy aplikacie + */ +typedef enum typ_aplikacie { + klient, server +} typ_aplikacie; + +/** + * enum hashovacia_funkcia: obsahuje mozne hashovacie funkcie na vypocet kontrolneho suctu suboru + */ typedef enum hashovacia_funkcia { funkcia_SHA, funkcia_SHA224, funkcia_SHA256, funkcia_SHA384, funkcia_SHA512, - funkcia_BLAKE2B, funkcia_RIPEMD160, ziadna + funkcia_BLAKE2B, funkcia_RIPEMD160 } hashovacia_funkcia; +/* + * enum crc_funkcia: obsahuje mozne crc funkcie na vypocet kontrolneho suctu suboru + */ +typedef enum crc_funkcia { + funkcia_CRC32 +} crc_funkcia; + +/* + * struct nastavenia_aplikacie: struktura, ktora uchovava nastavenia nastavene pocas behu aplikacie + */ typedef struct nastavenia_aplikacie { - hashovacia_funkcia funkcia; + typ_aplikacie typ_a; char typ_vypoctu[32]; + hashovacia_funkcia h_funkcia; + crc_funkcia c_funkcia; + //Pozn. + //Dalej rozsiritelne o napr. ukladanie bezpecnostnych parametrov + //(certifikaty, kluce, resp. vypocitane crc, mac kody a podobne) } nastavenia_aplikacie; /** - * generovat_hash: realizuje vypocet kontrolneho suctu zo suboru, ktoreho lokacia je predana v argumente + * generovat_kontrolny_sucet_suboru: realizuje vypocet kontrolneho suctu zo suboru, ktoreho lokacia je predana v argumente * @parameter char* funkcia : nazov funkcie pre vypocet kontrolneho suctu * @parameter char* cesta : lokacia suboru * @parameter int* velkost : uklada velkost kontrolneho suctu, ktoreho hodnota sa dynamicky priradi * na zaklade nazvu funkcie uvedenom v prvom argumente - * @vrati smernik na vygenerovany hash + * @vrati smernik na vygenerovany kontrolny sucet + * Poznamka: + * funkcia dynamicky alokuje pamat o velkosti, ktora zavisi od nastavenej crc/hash funkcie v nastaveniach, + * takze tuto pamat je nutne nasledne dealokovat manualne */ -byte* generovat_kontrolny_sucet_suboru(nastavenia_aplikacie* nastavenia, const char* cesta, int* velkost); +unsigned char* generovat_kontrolny_sucet_suboru(nastavenia_aplikacie* nastavenia, const char* cesta, int* velkost); /** * generovat_ecc_certifikat: realizuje vygenerovania sukromneho kluca, nacitanie sukromneho kluca autority, @@ -114,15 +146,24 @@ void zobraz_sifru(WOLFSSL* ssl); */ void nastav_sifry(WOLFSSL_CTX* ctx, const char* sifry); +/** + * nastav_typ_aplikacie: umoznuje nastavit typ aplikacie + * @parameter nastavenia_aplikacie* nastavenia: reprezentuje nastavenia aplikacie + * @parameter typ_aplikacie typ: umoznuje nastavit typ aplikacie + moznosti: klient, server + */ +void nastav_typ_aplikacie(nastavenia_aplikacie* nastavenia, typ_aplikacie typ); /** * nastav_funkciu: nastavi hashovaciu funkciu ktora bude pouzita pri vypocte kontrolneho suctu suboru - * @parameter nastavenia_aplikacie* nastavenia: reprezentuje nastavenia aplikacie: server alebo klient - * @paramater hashovacia_funkcia funkcia : nazov hashovacej funkcie + * @parameter nastavenia_aplikacie* nastavenia: reprezentuje nastavenia aplikacie * @parameter char* typ_vypoctu : umoznuje vyber medzi "crc" a "hash" kontrolnym suctom + * @paramater hashovacia_funkcia h_funkcia : nazov hashovacej funkcie moznosti: funkcia_SHA, funkcia_SHA224, funkcia_SHA256, funkcia_SHA384, funkcia_SHA512, funkcia_BLAKE2B, funkcia_RIPEMD160 + * @parameter crc_funkcia c_funkcia : nazov crc funkcie + moznosti: funkcia_CRC32 */ -void nastav_funkciu(nastavenia_aplikacie* nastavenia, char* typ_vypoctu, hashovacia_funkcia funkcia); +void nastav_funkciu(nastavenia_aplikacie* nastavenia, char* typ_vypoctu, hashovacia_funkcia h_funkcia, crc_funkcia c_funkcia); /** * nacitat_certifikaty: realizuje nacitanie certifikatov zo suborov do struktury WOLFSSL_CTX diff --git a/readme.txt b/readme.txt index 79ce531..85d5b21 100644 --- a/readme.txt +++ b/readme.txt @@ -2,8 +2,8 @@ Bakalarska praca Meno studenta: Tomas Lukac Veduci BP: prof. Ing. Milos Drutarovsky CSc. Skola: KEMT FEI TUKE -Datum poslednej upravy: 15.4.2020 -Verzia: 0.2 +Datum poslednej upravy: 5.6.2020 +Verzia: 0.3 ---------------------------- Zoznam zdrojovych suborov certifikaty @@ -44,6 +44,33 @@ Zoznam zdrojovych suborov |__Makefile |__server.txt +Kniznica + 1. Komunikacna cast + ... + 2. Kryptograficka cast + ... + +Externe kniznice + 1.TEUNIZ/RS232 + Kniznica napisana v jazyku C, ktora umoznuje pracu so seriovym rozhranim RS232 + na platformach Linux a Windows. + Pouzita verzia: May 31, 2019 + Viac informacii: https://www.teuniz.net/RS-232 + 2. WOLFSSL + Kniznica napisana v jazyku C, ktora umoznuje vytvorenie zabezpeceneho prenosoveho kanala + pomocou protokolu SSL/TLS. Podporuje embedded zariadenia, IoT, desktop, RTOS, cloudy, ... + Podporuje standardy do verzii TLS 1.3 a DTLS 1.2. Podla vyvojarov je 20x mensia ako OpenSSL. + Jej sucastou je krytograficka kniznica wolfCrypt, obsahujuca nastroje na sifrovanie, + vymenu klucov, vypocet kontrolnych suctov a ine. + Pouzita verzia: 4.4.0 + Viac informacii: https://www.wolfssl.com + 3. ZLIB + Kniznica napisana v jazyku C, umoznujuca kompresiu a dekompresiu dat. Je to volny software + s otvorenym zdrojovym kodom. V SSL/TLS knizniciach je casto vyuzivana na kompresiu TLS spojeni, + ale v mojej kniznici som ju pouzil na vypocet CRC32 kontrolneho suctu. + Pouzita verzia: 1.2.11 + Viac informacii: https://www.zlib.net + Opis aplikacie Realizuje zabezpecenu vymenu sprav medzi klientom a serverom a autentizaciu servera klientom vyuzitim kniznice WolfSSL. Ako prvu je potrebne spustit aplikaciu na strane servera s prepinacom port s hodnotou, ktora urcuje ake bude cislo portu, na ktorom bude server @@ -54,7 +81,7 @@ Opis aplikacie pre ip adresu: -ip adresa. Po vytvoreni zabezpeceneho prenosoveho kanalu sa klient pokusi odoslat subor, ktoreho lokacia mu bola predana pri spusteni pomocou parametru -s subor. Pred samotnym poslanim klient najprv vyhotovi kontrolny sucet suboru, ktory odosle po zabezpecenom kanali serveru. Ten po prijati suboru overi ci sa zhoduje prijaty kontrolny sucet s jeho, ktory vyhotovil po prijati suboru. Ak pri prijati suboru - nenastala chyba a kontrolne sucty sa zhoduju server oznami ze prijem bol uspesny a dalej caka na komunikaciu. + nenastala chyba a kontrolne sucty sa zhoduju server oznami ze prijem bol uspesny a ukonci svoju cinnost. Klientsky program po odoslani suboru ukonci svoju cinnost. Generovanie certifikatov RSA (OpenSSL) @@ -108,6 +135,9 @@ Navod na prelozenie a spustenie (Windows) a) wolfssl.dll -> kniznica wolfssl b) vcruntime140.dll -> visual c++ runtime c) api-ms-win-crt-runtime-l1-1-0.dll + d) msvcr100.dll + e) zlib1.dll -> kniznica zlib + f) rs232.dll -> kniznica teuniz/rs232 2. prelozenie programov (v podadresari tcpip_kanal alebo rs232_kanal) make all 3. spustenie (prenosovy kanal TCP/IP) diff --git a/rs232_kanal/klient/Makefile b/rs232_kanal/klient/Makefile index f34f639..fb1dd08 100644 --- a/rs232_kanal/klient/Makefile +++ b/rs232_kanal/klient/Makefile @@ -3,14 +3,14 @@ ## Meno studenta: Tomas Lukac ## ## Veduci BP: prof. Ing. Milos Drutarovsky CSc. ## ## Skola: KEMT FEI TUKE ## -## Datum poslednej upravy: 15.4.2020 ## +## Datum poslednej upravy: 5.6.2020 ## ################################################## #prekladac CC = gcc #prepinace pre prekladac -CFLAGS = -Wcpp -Werror -I./../../wolfssl/ +CFLAGS = -Wcpp -Werror -I./../../externe_kniznice/ SOURCES = $(wildcard ../../kniznica/*.c) \ $(wildcard *.c) OBJECTS = $(SOURCES:.c=.o) @@ -21,12 +21,12 @@ ifeq ($(OS), Windows_NT) ifeq ($(PROCESSOR_ARCHITECTURE), AMD64) ARCH += -m64 CFLAGS += $(ARCH) - LDFLAGS += -L./../../wolfssl/64bit_kniznice/ -lwolfssl -lws2_32 + LDFLAGS += -L./../../externe_kniznice/64bit_dll/ -lwolfssl -lws2_32 -lzlib1 -lrs232 endif ifeq ($(PROCESSOR_ARCHITECTURE), x86) ARCH += -m32 CFLAGS += $(ARCH) - LDFLAGS += -L./../../wolfssl/32bit_kniznice/ -lwolfssl -lws2_32 + LDFLAGS += -L./../../externe_kniznice/32bit_dll/ -lwolfssl -lws2_32 -lzlib1 -lrs232 endif else UNAME_S := $(shell uname -s) diff --git a/rs232_kanal/klient/klient.c b/rs232_kanal/klient/klient.c index 80ce3d7..a2a4e7d 100644 --- a/rs232_kanal/klient/klient.c +++ b/rs232_kanal/klient/klient.c @@ -3,7 +3,7 @@ // Meno studenta: Tomas Lukac // // Veduci BP: prof. Ing. Milos Drutarovsky CSc. // // Skola: KEMT FEI TUKE // -// Datum poslednej upravy: 15.4.2020 // +// Datum poslednej upravy: 5.6.2020 // ////////////////////////////////////////////////// #include @@ -12,6 +12,7 @@ #include #include #include +#include #ifdef _WIN32 #include @@ -25,7 +26,6 @@ #include "../../kniznica/kryptografia.h" #include "../../kniznica/komunikacia.h" -#include "../../kniznica/rs232.h" #define RSA_VELKOST 2048 #define ECC_VELKOST 32 @@ -40,159 +40,66 @@ #define VYGENEROVANY_CERTIFIKAT "../../certifikaty/klient/vygenerovany_certifikat.pem" #define KOMUNIKACNY_SUBOR "klient.txt" -int rs232_prijat; +//subor do ktoreho sa zapisuje komunikacia +int k_subor; + int cislo_rozhrania = 0; + +//velkost dat ktore sa prave nachadzaju v seriovom bufferi +//a cakaju na nacitanie do buffera pre desifrovanie int aktualne_data = 0; -int rs232_citanie(WOLFSSL *ssl, char *buf, int sz, void *ctx) -{ - int uspech = 0; - int prebieha_nacitanie = 0; - int prebieha_nacitanie_velkosti_spravy = 0; - unsigned char znak; +//mnozstvo dat ktore boli nacitane do buffera pre desifrovanie +//pri zavolani funkcie rs232_citanie() +int nacitane_data = 0; - +int rs232_citanie(WOLFSSL *ssl, char *buf, int sz, void *ctx) +{ //ziskanie dat zo serioveho rozhrania if(aktualne_data == 0) - { - //otvorenie suboru do ktoreho sa zapisuju prijate binarne data - //ktore sa nasledne nacitaju do buffera (buf) pre desifrovanie - FILE* f = fopen(KOMUNIKACNY_SUBOR, "ab+"); - - //mnozstvo nacitanych dat - int nacitane_data = 0; - //velkost spravy, ktora sa bude prijmat - int velkost_spravy = 0; - //urcuje kolko bajtov z informacie o velkosti spravy - //uz bolo prijatych z celkoveho poctu (4) - int velkost_spravy_bajt = 0; - int velkost_spravy_pocet_bajtov = 4; - - //kontrolne vzory, ktore jednoznacne identifikuju zaciatok a koniec spravy - unsigned char zaciatok_spravy[] = {0xAA, 0xAA, 0xAA, 0xAA}; - int zaciatok_spravy_pozicia = 0; //aktualna pozicia v kontrolnom vzore - unsigned char koniec_spravy[] = {0xBB, 0xBB, 0xBB, 0xBB}; - int koniec_spravy_pozicia = 0; //aktualna pozicia v kontrolnom vzore - int velkost_kontrolneho_vzoru = sizeof(zaciatok_spravy)/sizeof(zaciatok_spravy[0]); - - while(1) + { + aktualne_data = rs232_prijat_spravu(cislo_rozhrania, KOMUNIKACNY_SUBOR); + if(aktualne_data <= 0) { - uspech = RS232_PollComport(cislo_rozhrania, &znak, 1); - if(uspech > 0) - { - //ak nacitanie spravy este nezacalo, ale bol najdeny bajt, ktory je sucastou kontrolneho vzoru, - //ktory urcuje zaciatok spravy, posun sa v kontrolnom vzore o jednu poziciu a cakaj ci nebudu - //prichadzat dalsie bajty z tohto kontrolneho vzoru - if(!prebieha_nacitanie && (znak == zaciatok_spravy[zaciatok_spravy_pozicia]) && - (zaciatok_spravy_pozicia < velkost_kontrolneho_vzoru - 1)) - { - zaciatok_spravy_pozicia++; - } - //ak prebehlo nacitanie vsetkych bajtov, ktore su sucastou kontrolneho vzoru urcujuceho zaciatok spravy - //ocakavaj prichod bajtov, ktore budu niest informaciu o velkosti spravy - else if(!prebieha_nacitanie && (znak == zaciatok_spravy[zaciatok_spravy_pozicia]) && - (zaciatok_spravy_pozicia == velkost_kontrolneho_vzoru - 1)) - { - prebieha_nacitanie_velkosti_spravy = 1; - zaciatok_spravy_pozicia = 0; - } - //pokracuj v nacitavani bajtov urcujucich velkost spravy, dokym nie su vsetky nacitane - //a po nacitani vsetkych bajtov moze zacat nacitanie spravy - else if(!prebieha_nacitanie && prebieha_nacitanie_velkosti_spravy) - { - velkost_spravy_bajt++; - if(velkost_spravy_bajt == velkost_spravy_pocet_bajtov) - { - prebieha_nacitanie = 1; - prebieha_nacitanie_velkosti_spravy = 0; - } - } - //ak prebieha nacitanie a bol najdeny bajt, ktory je sucastou kontrolneho vzoru, ktory urcuje koniec spravy, - //posun sa v kontrolnom vzore o jednu poziciu a cakaj ci nebudu prichadzat dalsie bajty z tohto kontrolneho vzoru - else if((prebieha_nacitanie && (znak == koniec_spravy[koniec_spravy_pozicia]) && - (koniec_spravy_pozicia == 0)) || (!prebieha_nacitanie && (znak == koniec_spravy[koniec_spravy_pozicia]) && - (koniec_spravy_pozicia < velkost_kontrolneho_vzoru - 1))) - { - koniec_spravy_pozicia++; - prebieha_nacitanie = 0; - } - //v pripade ak zacalo nacitanie kontrolneho vzoru, ktory urcuje koniec spravy, ale nebol najdeny posledny znak z tohto vzoru - //nacitaj do suboru docasne nezapisane znaky, ktore su sucastou kontrolneho vzoru a zaroven nacitaj aktualny znak - else if(!prebieha_nacitanie_velkosti_spravy && !prebieha_nacitanie && znak != koniec_spravy[koniec_spravy_pozicia]) - { - for(int i = 0; i < koniec_spravy_pozicia; i++) - { - fwrite((char*)&koniec_spravy[i], 1, uspech, f); - nacitane_data += uspech; - } - fwrite((char*)&znak, 1, uspech, f); - nacitane_data += uspech; - - koniec_spravy_pozicia = 0; - prebieha_nacitanie = 1; - } - //ak prebehlo nacitanie vsetkych bajtov, ktore su sucastou kontrolneho vzoru urcujuceho koniec spravy - //ukonci nacitanie spravy - else if(!prebieha_nacitanie_velkosti_spravy && !prebieha_nacitanie && (znak == koniec_spravy[0]) && - (koniec_spravy_pozicia == 3)) - { - prebieha_nacitanie = 0; - koniec_spravy_pozicia = 0; - break; - } - //inak prebieha nacitanie, cize zapis aktualny znak (bajt) do suboru - else - { - if(prebieha_nacitanie && !prebieha_nacitanie_velkosti_spravy) - { - fwrite((char*)&znak, 1, uspech, f); - nacitane_data += uspech; - } - } - } + fprintf(stderr, "Nastala chyba pri prijati spravy\n"); + return -1; } - aktualne_data = nacitane_data; - nacitane_data = 0; - fclose(f); } + //nacitanie dat zo suboru do buffera pre desifrovanie - uspech = 0; - while(uspech <= 0) - uspech = read(rs232_prijat, buf, sz); - aktualne_data -= uspech; - - return uspech; + nacitane_data = 0; + while(nacitane_data <= 0) + nacitane_data = read(k_subor, buf, sz); + aktualne_data -= nacitane_data; + + return nacitane_data; } int rs232_zapis(WOLFSSL *ssl, char *buf, int sz, void *ctx) { int uspech = 0; - - //kontrolne vzory, ktore jednoznacne identifikuju zaciatok a koniec spravy - unsigned char zaciatok_spravy[] = {0xAA, 0xAA, 0xAA, 0xAA}; - unsigned char koniec_spravy[] = {0xBB, 0xBB, 0xBB, 0xBB}; - - //vytvorenie bajtov ktore budu niest informaciu o velkosti posielanej spravy - unsigned char* velkost_spravy = calloc(4, sizeof(unsigned char)); - velkost_spravy[0] = (sz >> 24) & 0xFF; - velkost_spravy[1] = (sz >> 16) & 0xFF; - velkost_spravy[2] = (sz >> 8) & 0xFF; - velkost_spravy[3] = sz & 0xFF; - - //odoslanie kontrolnych vzorov, bajtov s velkostou spravy a samotnych dat na seriove rozhranie - RS232_SendBuf(cislo_rozhrania, (unsigned char*)zaciatok_spravy, sizeof(zaciatok_spravy)); - RS232_SendBuf(cislo_rozhrania, (unsigned char*)velkost_spravy, 4); - uspech = (int)RS232_SendBuf(cislo_rozhrania, (unsigned char*)buf, sz); - RS232_SendBuf(cislo_rozhrania, (unsigned char*)koniec_spravy, sizeof(koniec_spravy)); - free(velkost_spravy); + int odoslane_data = 0; - return uspech; + //poslanie dat na seriove rozhranie + odoslane_data = rs232_odoslat_spravu(cislo_rozhrania, buf, sz); + if(odoslane_data < 1) + { + fprintf(stderr, "Nastala chyba pri posielani dat\n"); + return -1; + } + + return odoslane_data; } int main(int argc, char const *argv[]) { + //nastavenie rezimu rezhrania + //8 -> pocet bitov, N -> no parity, 1 -> jeden stopbit char rezim[]={'8','N','1', 0}; + + //nastavenie rychlosti rozhrania v baudoch int rychlost = 9600; + WOLFSSL *ssl; WOLFSSL_CTX *ctx = NULL; const char* subor = NULL; @@ -201,9 +108,8 @@ int main(int argc, char const *argv[]) int nacitanie_zo_suboru = 0; int generovanie_certifikatu = 0; nastavenia_aplikacie nastavenia; - RS232_flushRXTX(cislo_rozhrania); - rs232_prijat = open(KOMUNIKACNY_SUBOR, O_RDWR | O_NOCTTY | O_NDELAY); + k_subor = open(KOMUNIKACNY_SUBOR, O_RDWR | O_NOCTTY | O_NDELAY); int uspech; if((ctx = nastavit_ctx_klient()) == NULL) @@ -238,9 +144,8 @@ int main(int argc, char const *argv[]) else { cislo_rozhrania = atoi(argv[i+1]); - if(RS232_OpenComport(cislo_rozhrania, rychlost, rezim, 1)) + if(rs232_otvorit_rozhranie(cislo_rozhrania, rychlost, rezim, 1)) { - fprintf(stderr, "Nebolo mozne otvorit seriove rozhranie\n"); return -1; } } @@ -347,8 +252,8 @@ int main(int argc, char const *argv[]) } //priradenie file descriptora suboru ako I/O pre TLS spojenie - wolfSSL_set_fd(ssl, rs232_prijat); - wolfSSL_set_using_nonblock(ssl, rs232_prijat); + wolfSSL_set_fd(ssl, k_subor); + wolfSSL_set_using_nonblock(ssl, k_subor); //pokus o inizicalizaciu TLS handshaku so serverom uspech = wolfSSL_connect(ssl); @@ -359,21 +264,29 @@ int main(int argc, char const *argv[]) wolfSSL_ERR_error_string(chyba, popis_chyby); fprintf(stderr, "Nastala chyba v spojeni.\nCislo chyby: %d\nDovod chyby: %s\n", chyba, popis_chyby); printf("Skontrolujte certifikaty.\n"); + fclose(fopen(KOMUNIKACNY_SUBOR, "wb")); free(popis_chyby); return -1; } zobraz_sifru(ssl); zobraz_certifikat(ssl); - nastav_funkciu(&nastavenia, "crc", ziadna); - poslat_subor(ssl, ctx, subor, &nastavenia); + + //nastavenie funkcie pre vypocet kontrolneho suctu + //nastavime typ "crc" alebo "hash" a nazov funkcie, nazov druhej funkcie nastavime na NULL + nastav_funkciu(&nastavenia, "crc", (hashovacia_funkcia)NULL, funkcia_CRC32); + + if(poslat_subor(ssl, ctx, subor, &nastavenia) == -1) + { + fclose(fopen(KOMUNIKACNY_SUBOR, "wb")); + return -1; + } //ukoncenie spojenia, vymazanie komunikacneho suboru //a vycistenie serioveho buffera ukoncit_spojenie(ssl, ctx); - RS232_flushRXTX(cislo_rozhrania); - RS232_CloseComport(cislo_rozhrania); - close(rs232_prijat); + rs232_zatvorit_rozhranie(cislo_rozhrania); + close(k_subor); fclose(fopen(KOMUNIKACNY_SUBOR, "wb")); return 0; } \ No newline at end of file diff --git a/rs232_kanal/klient/nieco.txt b/rs232_kanal/klient/nieco.txt deleted file mode 100644 index ac1a098..0000000 --- a/rs232_kanal/klient/nieco.txt +++ /dev/null @@ -1 +0,0 @@ -jano \ No newline at end of file diff --git a/rs232_kanal/klient/obr.jpg b/rs232_kanal/klient/obr.jpg new file mode 100644 index 0000000000000000000000000000000000000000..127a9a304622bec3d3431526053bf7beea412081 GIT binary patch literal 14242 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 literal 0 HcmV?d00001 diff --git a/rs232_kanal/klient/spustit_klient.bat b/rs232_kanal/klient/spustit_klient.bat index 0e064cb..ea30ce3 100644 --- a/rs232_kanal/klient/spustit_klient.bat +++ b/rs232_kanal/klient/spustit_klient.bat @@ -3,7 +3,7 @@ :: Meno studenta: Tomas Lukac :: :: Veduci BP: prof. Ing. Milos Drutarovsky CSc. :: :: Skola: KEMT FEI TUKE :: -:: Datum poslednej upravy: 15.4.2020 :: +:: Datum poslednej upravy: 5.6.2020 :: :::::::::::::::::::::::::::::::::::::::::::::::::: :: Program je mozne spustit s prepinacmi: @@ -13,4 +13,4 @@ :: -s cesta-ku-suboru sluzi na nacitanie cesty k suboru, ktory chceme odoslat ::Priklady spustenia: -klient -port 4 -n rsa -s nieco.txt +klient -port 4 -n rsa -s obr.jpg diff --git a/rs232_kanal/server/Makefile b/rs232_kanal/server/Makefile index 9a08ea6..86d2d2d 100644 --- a/rs232_kanal/server/Makefile +++ b/rs232_kanal/server/Makefile @@ -3,14 +3,14 @@ ## Meno studenta: Tomas Lukac ## ## Veduci BP: prof. Ing. Milos Drutarovsky CSc. ## ## Skola: KEMT FEI TUKE ## -## Datum poslednej upravy: 15.4.2020 ## +## Datum poslednej upravy: 5.6.2020 ## ################################################## #prekladac CC = gcc #prepinace pre prekladac -CFLAGS = -Wcpp -Werror -I./../../wolfssl/ +CFLAGS = -Wcpp -Werror -I./../../externe_kniznice/ SOURCES = $(wildcard ../../kniznica/*.c) \ $(wildcard *.c) OBJECTS = $(SOURCES:.c=.o) @@ -21,12 +21,12 @@ ifeq ($(OS), Windows_NT) ifeq ($(PROCESSOR_ARCHITECTURE), AMD64) ARCH += -m64 CFLAGS += $(ARCH) - LDFLAGS += -L./../../wolfssl/64bit_kniznice/ -lwolfssl -lws2_32 + LDFLAGS += -L./../../externe_kniznice/64bit_dll/ -lwolfssl -lws2_32 -lzlib1 -lrs232 endif ifeq ($(PROCESSOR_ARCHITECTURE), x86) ARCH += -m32 CFLAGS += $(ARCH) - LDFLAGS += -L./../../wolfssl/32bit_kniznice/ -lwolfssl -lws2_32 + LDFLAGS += -L./../../externe_kniznice/32bit_dll/ -lwolfssl -lws2_32 -lzlib1 -lrs232 endif else UNAME_S := $(shell uname -s) diff --git a/rs232_kanal/server/nieco.txt b/rs232_kanal/server/nieco.txt deleted file mode 100644 index ac1a098..0000000 --- a/rs232_kanal/server/nieco.txt +++ /dev/null @@ -1 +0,0 @@ -jano \ No newline at end of file diff --git a/rs232_kanal/server/obr.jpg b/rs232_kanal/server/obr.jpg new file mode 100644 index 0000000000000000000000000000000000000000..127a9a304622bec3d3431526053bf7beea412081 GIT binary patch literal 14242 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 literal 0 HcmV?d00001 diff --git a/rs232_kanal/server/server.c b/rs232_kanal/server/server.c index ee1e691..4ba0018 100644 --- a/rs232_kanal/server/server.c +++ b/rs232_kanal/server/server.c @@ -3,7 +3,7 @@ // Meno studenta: Tomas Lukac // // Veduci BP: prof. Ing. Milos Drutarovsky CSc. // // Skola: KEMT FEI TUKE // -// Datum poslednej upravy: 15.4.2020 // +// Datum poslednej upravy: 5.6.2020 // ////////////////////////////////////////////////// #include @@ -25,7 +25,6 @@ #include "../../kniznica/kryptografia.h" #include "../../kniznica/komunikacia.h" -#include "../../kniznica/rs232.h" #define RSA_VELKOST 2048 #define ECC_VELKOST 32 @@ -40,168 +39,73 @@ #define VYGENEROVANY_CERTIFIKAT "../../certifikaty/server/vygenerovany_certifikat.pem" #define KOMUNIKACNY_SUBOR "server.txt" -int rs232_prijat; +//subor do ktoreho sa zapisuje komunikacia +int k_subor; + int cislo_rozhrania = 0; + +//velkost dat ktore sa prave nachadzaju v seriovom bufferi +//a cakaju na nacitanie do buffera pre desifrovanie int aktualne_data = 0; -int rs232_citanie(WOLFSSL *ssl, char *buf, int sz, void *ctx) -{ - int uspech = 0; - int prebieha_nacitanie = 0; - int prebieha_nacitanie_velkosti_spravy = 0; - unsigned char znak; +//mnozstvo dat ktore boli nacitane do buffera pre desifrovanie +//pri zavolani funkcie rs232_citanie() +int nacitane_data = 0; - +int rs232_citanie(WOLFSSL *ssl, char *buf, int sz, void *ctx) +{ //ziskanie dat zo serioveho rozhrania if(aktualne_data == 0) - { - //otvorenie suboru do ktoreho sa zapisuju prijate binarne data - //ktore sa nasledne nacitaju do buffera (buf) pre desifrovanie - FILE* f = fopen(KOMUNIKACNY_SUBOR, "ab+"); - - //mnozstvo nacitanych dat - int nacitane_data = 0; - //velkost spravy, ktora sa bude prijmat - int velkost_spravy = 0; - //urcuje kolko bajtov z informacie o velkosti spravy - //uz bolo prijatych z celkoveho poctu (4) - int velkost_spravy_bajt = 0; - int velkost_spravy_pocet_bajtov = 4; - - //kontrolne vzory, ktore jednoznacne identifikuju zaciatok a koniec spravy - unsigned char zaciatok_spravy[] = {0xAA, 0xAA, 0xAA, 0xAA}; - int zaciatok_spravy_pozicia = 0; //aktualna pozicia v kontrolnom vzore - unsigned char koniec_spravy[] = {0xBB, 0xBB, 0xBB, 0xBB}; - int koniec_spravy_pozicia = 0; //aktualna pozicia v kontrolnom vzore - int velkost_kontrolneho_vzoru = sizeof(zaciatok_spravy)/sizeof(zaciatok_spravy[0]); - - while(1) + { + aktualne_data = rs232_prijat_spravu(cislo_rozhrania, KOMUNIKACNY_SUBOR); + if(aktualne_data <= 0) { - uspech = RS232_PollComport(cislo_rozhrania, &znak, 1); - if(uspech > 0) - { - //ak nacitanie spravy este nezacalo, ale bol najdeny bajt, ktory je sucastou kontrolneho vzoru, - //ktory urcuje zaciatok spravy, posun sa v kontrolnom vzore o jednu poziciu a cakaj ci nebudu - //prichadzat dalsie bajty z tohto kontrolneho vzoru - if(!prebieha_nacitanie && (znak == zaciatok_spravy[zaciatok_spravy_pozicia]) && - (zaciatok_spravy_pozicia < velkost_kontrolneho_vzoru - 1)) - { - zaciatok_spravy_pozicia++; - } - //ak prebehlo nacitanie vsetkych bajtov, ktore su sucastou kontrolneho vzoru urcujuceho zaciatok spravy - //ocakavaj prichod bajtov, ktore budu niest informaciu o velkosti spravy - else if(!prebieha_nacitanie && (znak == zaciatok_spravy[zaciatok_spravy_pozicia]) && - (zaciatok_spravy_pozicia == velkost_kontrolneho_vzoru - 1)) - { - prebieha_nacitanie_velkosti_spravy = 1; - zaciatok_spravy_pozicia = 0; - } - //pokracuj v nacitavani bajtov urcujucich velkost spravy, dokym nie su vsetky nacitane - //a po nacitani vsetkych bajtov moze zacat nacitanie spravy - else if(!prebieha_nacitanie && prebieha_nacitanie_velkosti_spravy) - { - velkost_spravy_bajt++; - if(velkost_spravy_bajt == velkost_spravy_pocet_bajtov) - { - prebieha_nacitanie = 1; - prebieha_nacitanie_velkosti_spravy = 0; - } - } - //ak prebieha nacitanie a bol najdeny bajt, ktory je sucastou kontrolneho vzoru, ktory urcuje koniec spravy, - //posun sa v kontrolnom vzore o jednu poziciu a cakaj ci nebudu prichadzat dalsie bajty z tohto kontrolneho vzoru - else if((prebieha_nacitanie && (znak == koniec_spravy[koniec_spravy_pozicia]) && - (koniec_spravy_pozicia == 0)) || (!prebieha_nacitanie && (znak == koniec_spravy[koniec_spravy_pozicia]) && - (koniec_spravy_pozicia < velkost_kontrolneho_vzoru - 1))) - { - koniec_spravy_pozicia++; - prebieha_nacitanie = 0; - } - //v pripade ak zacalo nacitanie kontrolneho vzoru, ktory urcuje koniec spravy, ale nebol najdeny posledny znak z tohto vzoru - //nacitaj do suboru docasne nezapisane znaky, ktore su sucastou kontrolneho vzoru a zaroven nacitaj aktualny znak - else if(!prebieha_nacitanie_velkosti_spravy && !prebieha_nacitanie && znak != koniec_spravy[koniec_spravy_pozicia]) - { - for(int i = 0; i < koniec_spravy_pozicia; i++) - { - fwrite((char*)&koniec_spravy[i], 1, uspech, f); - nacitane_data += uspech; - } - fwrite((char*)&znak, 1, uspech, f); - nacitane_data += uspech; - - koniec_spravy_pozicia = 0; - prebieha_nacitanie = 1; - } - //ak prebehlo nacitanie vsetkych bajtov, ktore su sucastou kontrolneho vzoru urcujuceho koniec spravy - //ukonci nacitanie spravy - else if(!prebieha_nacitanie_velkosti_spravy && !prebieha_nacitanie && (znak == koniec_spravy[0]) && - (koniec_spravy_pozicia == 3)) - { - prebieha_nacitanie = 0; - koniec_spravy_pozicia = 0; - break; - } - //inak prebieha nacitanie, cize zapis aktualny znak (bajt) do suboru - else - { - if(prebieha_nacitanie && !prebieha_nacitanie_velkosti_spravy) - { - fwrite((char*)&znak, 1, uspech, f); - nacitane_data += uspech; - } - } - } + fprintf(stderr, "Nastala chyba pri prijati spravy\n"); + return -1; } - aktualne_data = nacitane_data; - nacitane_data = 0; - fclose(f); } + //nacitanie dat zo suboru do buffera pre desifrovanie - uspech = 0; - while(uspech <= 0) - uspech = read(rs232_prijat, buf, sz); - aktualne_data -= uspech; - - return uspech; + nacitane_data = 0; + while(nacitane_data <= 0) + nacitane_data = read(k_subor, buf, sz); + aktualne_data -= nacitane_data; + return nacitane_data; } int rs232_zapis(WOLFSSL *ssl, char *buf, int sz, void *ctx) { int uspech = 0; - - //kontrolne vzory, ktore jednoznacne identifikuju zaciatok a koniec spravy - unsigned char zaciatok_spravy[] = {0xAA, 0xAA, 0xAA, 0xAA}; - unsigned char koniec_spravy[] = {0xBB, 0xBB, 0xBB, 0xBB}; - - //vytvorenie bajtov ktore budu niest informaciu o velkosti posielanej spravy - unsigned char* velkost_spravy = calloc(4, sizeof(unsigned char)); - velkost_spravy[0] = (sz >> 24) & 0xFF; - velkost_spravy[1] = (sz >> 16) & 0xFF; - velkost_spravy[2] = (sz >> 8) & 0xFF; - velkost_spravy[3] = sz & 0xFF; - - //odoslanie kontrolnych vzorov, bajtov s velkostou spravy a samotnych dat na seriove rozhranie - RS232_SendBuf(cislo_rozhrania, (unsigned char*)zaciatok_spravy, sizeof(zaciatok_spravy)); - RS232_SendBuf(cislo_rozhrania, (unsigned char*)velkost_spravy, 4); - uspech = (int)RS232_SendBuf(cislo_rozhrania, (unsigned char*)buf, sz); - RS232_SendBuf(cislo_rozhrania, (unsigned char*)koniec_spravy, sizeof(koniec_spravy)); - free(velkost_spravy); + int odoslane_data = 0; - return uspech; + //poslanie dat na seriove rozhranie + odoslane_data = rs232_odoslat_spravu(cislo_rozhrania, buf, sz); + if(odoslane_data < 1) + { + fprintf(stderr, "Nastala chyba pri posielani dat\n"); + return -1; + } + + return odoslane_data; } int main(int argc, char const *argv[]) { + //nastavenie rezimu rezhrania + //8 -> pocet bitov, N -> no parity, 1 -> jeden stopbit + char rezim[]={'8','N','1', 0}; + + //nastavenie rychlosti rozhrania v baudoch + int rychlost = 9600; + WOLFSSL *ssl; WOLFSSL_CTX *ctx = NULL; - int rychlost = 9600; - char rezim[]={'8','N','1', 0}; int zadane_rozhranie = 0; int generovanie_certifikatu = 0; int nacitanie_zo_suboru = 0; nastavenia_aplikacie nastavenia; - RS232_flushRXTX(cislo_rozhrania); - rs232_prijat = open(KOMUNIKACNY_SUBOR, O_RDWR | O_NOCTTY | O_NDELAY); + k_subor = open(KOMUNIKACNY_SUBOR, O_RDWR | O_NOCTTY | O_NDELAY); int uspech; if((ctx = nastavit_ctx_server()) == NULL) @@ -223,9 +127,8 @@ int main(int argc, char const *argv[]) else { cislo_rozhrania = atoi(argv[i+1]); - if(RS232_OpenComport(cislo_rozhrania, rychlost, rezim, 1)) + if(rs232_otvorit_rozhranie(cislo_rozhrania, rychlost, rezim, 1)) { - fprintf(stderr, "Nebolo mozne otvorit seriove rozhranie\n"); return -1; } } @@ -325,8 +228,8 @@ int main(int argc, char const *argv[]) } //priradenie file descriptora suboru ako I/O pre TLS spojenie - wolfSSL_set_fd(ssl, rs232_prijat); - wolfSSL_set_using_nonblock(ssl, rs232_prijat); + wolfSSL_set_fd(ssl, k_subor); + wolfSSL_set_using_nonblock(ssl, k_subor); //cakanie na inicializaciu TLS handshaku klientom uspech = wolfSSL_accept(ssl); @@ -337,20 +240,33 @@ int main(int argc, char const *argv[]) wolfSSL_ERR_error_string(chyba, popis_chyby); fprintf(stderr, "Nastala chyba v spojeni.\nCislo chyby: %d\nDovod chyby: %s\n", chyba, popis_chyby); printf("Skontrolujte certifikaty.\n"); + fclose(fopen(KOMUNIKACNY_SUBOR, "wb")); free(popis_chyby); return -1; } zobraz_sifru(ssl); zobraz_certifikat(ssl); - nastav_funkciu(&nastavenia, "crc", ziadna); - prijat_subor(ssl, ctx, &nastavenia); + + //nastavenie funkcie pre vypocet kontrolneho suctu + //nastavime typ "crc" alebo "hash" a nazov funkcie, nazov druhej funkcie nastavime na NULL + nastav_funkciu(&nastavenia, "crc", (hashovacia_funkcia)NULL, funkcia_CRC32); + + //vypocet casu prenosu suboru + clock_t cas; + cas = clock(); + if(prijat_subor(ssl, ctx, &nastavenia) == -1) + { + fclose(fopen(KOMUNIKACNY_SUBOR, "wb")); + return -1; + } + cas = clock() - cas; + printf("Cas prenosu suboru: %f sekund\n", (double)cas/CLOCKS_PER_SEC); //ukoncenie spojenia, vymazanie komunikacneho suboru //a vycistenie serioveho buffera ukoncit_spojenie(ssl, ctx); - RS232_flushRXTX(cislo_rozhrania); - RS232_CloseComport(cislo_rozhrania); - close(rs232_prijat); + rs232_zatvorit_rozhranie(cislo_rozhrania); + close(k_subor); fclose(fopen(KOMUNIKACNY_SUBOR, "wb")); return 0; } diff --git a/rs232_kanal/server/spustit_server.bat b/rs232_kanal/server/spustit_server.bat index 8f2baf0..30ae5a6 100644 --- a/rs232_kanal/server/spustit_server.bat +++ b/rs232_kanal/server/spustit_server.bat @@ -3,7 +3,7 @@ :: Meno studenta: Tomas Lukac :: :: Veduci BP: prof. Ing. Milos Drutarovsky CSc. :: :: Skola: KEMT FEI TUKE :: -:: Datum poslednej upravy: 15.4.2020 :: +:: Datum poslednej upravy: 5.6.2020 :: :::::::::::::::::::::::::::::::::::::::::::::::::: :: Program je mozne spustit s prepinacmi: diff --git a/tcpip_kanal/klient/Makefile b/tcpip_kanal/klient/Makefile index f34f639..fb1dd08 100644 --- a/tcpip_kanal/klient/Makefile +++ b/tcpip_kanal/klient/Makefile @@ -3,14 +3,14 @@ ## Meno studenta: Tomas Lukac ## ## Veduci BP: prof. Ing. Milos Drutarovsky CSc. ## ## Skola: KEMT FEI TUKE ## -## Datum poslednej upravy: 15.4.2020 ## +## Datum poslednej upravy: 5.6.2020 ## ################################################## #prekladac CC = gcc #prepinace pre prekladac -CFLAGS = -Wcpp -Werror -I./../../wolfssl/ +CFLAGS = -Wcpp -Werror -I./../../externe_kniznice/ SOURCES = $(wildcard ../../kniznica/*.c) \ $(wildcard *.c) OBJECTS = $(SOURCES:.c=.o) @@ -21,12 +21,12 @@ ifeq ($(OS), Windows_NT) ifeq ($(PROCESSOR_ARCHITECTURE), AMD64) ARCH += -m64 CFLAGS += $(ARCH) - LDFLAGS += -L./../../wolfssl/64bit_kniznice/ -lwolfssl -lws2_32 + LDFLAGS += -L./../../externe_kniznice/64bit_dll/ -lwolfssl -lws2_32 -lzlib1 -lrs232 endif ifeq ($(PROCESSOR_ARCHITECTURE), x86) ARCH += -m32 CFLAGS += $(ARCH) - LDFLAGS += -L./../../wolfssl/32bit_kniznice/ -lwolfssl -lws2_32 + LDFLAGS += -L./../../externe_kniznice/32bit_dll/ -lwolfssl -lws2_32 -lzlib1 -lrs232 endif else UNAME_S := $(shell uname -s) diff --git a/tcpip_kanal/klient/klient.c b/tcpip_kanal/klient/klient.c index 392ad32..9733d5d 100644 --- a/tcpip_kanal/klient/klient.c +++ b/tcpip_kanal/klient/klient.c @@ -3,7 +3,7 @@ // Meno studenta: Tomas Lukac // // Veduci BP: prof. Ing. Milos Drutarovsky CSc. // // Skola: KEMT FEI TUKE // -// Datum poslednej upravy: 15.4.2020 // +// Datum poslednej upravy: 5.6.2020 // ////////////////////////////////////////////////// #include "../../kniznica/kryptografia.h" @@ -181,7 +181,7 @@ int main(int argc, char** argv) //nastav_sifry(ctx, "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"); //pokus o inicializaciu TCP/IP prenosoveho kanala - cislo_soketu = pripojit_na_server(ip_adresa, cislo_portu, 500); + cislo_soketu = pripojit_na_server(ip_adresa, cislo_portu, 5); if(!cislo_soketu) return -1; @@ -205,10 +205,18 @@ int main(int argc, char** argv) } zobraz_sifru(ssl); zobraz_certifikat(ssl); - nastav_funkciu(&nastavenia, "crc", ziadna); - if(poslat_subor(ssl, ctx, subor, &nastavenia) == -1) return -1; + + //nastavenie funkcie pre vypocet kontrolneho suctu + //nastavime typ "crc" alebo "hash" a nazov funkcie, nazov druhej funkcie nastavime na NULL + nastav_funkciu(&nastavenia, "crc", (hashovacia_funkcia)NULL, funkcia_CRC32); + + if(poslat_subor(ssl, ctx, subor, &nastavenia) == -1) + { + return -1; + } ukoncit_spojenie(ssl, ctx); } + ukoncit_soket(cislo_soketu); #if defined (_WIN32) WSACleanup(); diff --git a/tcpip_kanal/klient/nieco.txt b/tcpip_kanal/klient/nieco.txt deleted file mode 100644 index 1e17e8d..0000000 --- a/tcpip_kanal/klient/nieco.txt +++ /dev/null @@ -1 +0,0 @@ -janooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo \ No newline at end of file diff --git a/tcpip_kanal/klient/obr.jpg b/tcpip_kanal/klient/obr.jpg new file mode 100644 index 0000000000000000000000000000000000000000..127a9a304622bec3d3431526053bf7beea412081 GIT binary patch literal 14242 zcmeHu2T)UA+vg3TgP~)P00Dv&5eY>TYUqUC`(LS2LPQNR_Hc7g11p zm!e3QPy_^|iGXE!-`)9kW@mTj{oe2Wc4uey%sg|?z2~`S?(dZ6Ip_DB`)BIUBEYJr zjnxJ~AQ15P^yf1mr4{0N695bi0g1Cm^Z*qG0KjLtziVJXf4}}WZ2tED#6_Klgcd9t8ZNh%j7ONbE9NT1?{VB_UxMO_{5T$`}mhqO`WY zmWm!)6{GyON+B!Pz{q_b%5y>FqNtd-gq-}wOAyQjCWe{6hW^25iePt%{5D9bCWYhTtkcK7xV4!_MbxbZ@~ULu4#Z73_9yPFdLu>e76%T#54YX`G2+z1hEG3)aJvh*L(`8;Z<#S!=pGs6Q-u`l&qzz zp1_Mr#8@ay*T5 zNYb13v9>1gxJLm_%Y=s06!U*XkV$kZ6DN1g@z^gkz)i2F6s{Mw_h5M~?IUHB>p0xy zt)6MkJ%vke`V(`@M#HS#s;&!&5O*?l5W6D{ehMk$p}$?4H3VmAWs?nv4JWE%@HN?&tA9Sk)6uthVYV-IF8meogUh*_+J`({Y7t1HKxXmmaaZ6OfLA(w+_WV+R7dv zoJEZ*wM^ED#cLm(eiSUyEBD<_@36G&cs1a-sek%NM68N)@$Q;@XJ54Zt8s4|;-SQ~ zQeWk|`PLL;Z+zv|N%Ol$e}F@4mWoc{T)fhiT@W_r;Q-kmD<3pf?;5MG_Mr_EoBld~!Zts)KL|-qxm7iDqKaj5G%d$vm$;=Q=fA*^+ zlEZU0E@^JZpUp4n|I{|T_1s9e(0XsQkwLhCZ=<@agS#V1OtWfx>2{P%z;rwp8rAj(IrU(D}yg9O0HKcuFQ;;LlGyH0;QMDU?X<_!8tLP4l!c$}Q z+f*uqhpu4#hh^)dGNMcqT#4ZSH4(~(|6bMF7v+DIA{sN!b&aaZq4$#2+yxA6$Ox*c z`S%ah$*EQDt9XS33bVGMHV%hP5UIVxG z*qn~qI49@@OE$hIM&h{#OyDKugg-we@cT9WaCg`jX_)_;Ipv;3|4aAlgjWnZ&&|9* zcLgXIl%CTIVT$8w-!J6(@-9)J_xHt|_fzNk#R{v`v^Y&b|2c92AZkH;jj8H(?nD2w z)Fk6A_PhS_ln%-}G+X?JLDAJHj?zYUCQ-wj*f_TwZniw$tbF8M6y9vLu*GPhZKQi+ zJ!gD!+iqqc$=nZz?_A>=yk)M#_w_x)1#1IZDco^5BgXvAOP2)EOptG6C34vlVngyH z!PY_Eh%rb1F3VUy|du#ILyJjv)%4Br^$k2ywW?c{Y zb?aHvBPlr1X4p&%QZ}_GQFy|xuf=JJKkEwMUn_zIw5=3*D_hy|pI%sc1mTyTrAR7) zji?+xN-fjEGos|mG5uoO&6_O~g_;ewoJoQn-flr7f@;joK1>-{K`Cx@PnMh7F4FK_ zHxp%Q>){bDaT(&J;ziSzwX}F*CABH(anl8eKssTb<-_mgF7SsQ!UDNM%=tI;5a|Qs_r4*M}k9VcSDtm?kE`+Fh{AkPx&35Qg8Ff)AFyfRGJ5k=@)Ggarp1Px$=_{kH zWQSMd3ya7^mT=3*&gZd^lu_Js)xp z{HkW3I0?cmZuK{fl@Ynw>853@X_B^d>9pcHdU=+rvcIvYD_VHOyR4v9i4w!-U2r{P zc>4ZAj`up|<6K^|mnh5?ZGC6sPB)VxhN62GF$qR)(;&d0=d>k8XDl)DMSK(f{(iJPxkn6Du&ar~j83s1eke zxf3tV7&q1!!$U_tzLCG~DIHHjuMa8cpitnLo;G)V!7o$L9=Z>B;pPn20A3<`jmv%& zB`IyOpF_G`e)rB2x?{`Y*&S})Z0F;|oKSDy^9y5m39n#Yj_}@!HXyy}*@qTBpCzUg zwUqLk_rxrnkz|XL!^M`|EP1yi=+@lA!fsW;wZ-&t!eMc@q=&-c_cDJ0L0`J41_gT= z^%pX^iTF8LT_MEUs`5824CFq|Q5fO&VWpo?Omitr4wP!!yinP6FWp)zBZIeWHW z(S#W^kVz@Kn299&jaN$uJH|jwH;nBB2`WcEH&C#HV(Q(rxBK}{RxbCWtntQ5M^A5$ z50Z7r?AKtB$pGM9NIQ5}4#Y5%)_xLZ*@}B3f$CkGuP9_D;YLK08}6j4fr+vA3D1-A z=+_zyutYkzYmc0P?C&3?KYOUjl(DQE$8>W|Cbf6lDMgG1e?eXapNx%LzxgP)G4-!< z@>Gt_IbQ^LhCw5CL7ogTvJ#==))WkL2st>wJn6%B*FZ!&n z?Jqlx=e_(k{wDkhEcNZv{^K=9mN)1>z~*FfE%rl$UILqZ&8;y_QN>I6;%t9aMv+iTt%OU&A(fJlvZs6ViL~Q8*Zx*^@3dL#CpY z#l~F!zOwD(8k`;~T7x{X0E-e984=WMBuMB|y3*S5#B(VIrMDHwf!&w`;S-A;K|Wcs zBgoQO)PIriUEWj3F(H_FIpWhgHig4JrG^2V)?4X!Q6C1_EavM~(7N{il=uoKG6ilX zQ!SIw^Z=9(w3(x;)~(yI6Jz!!gJVTNdIOi^?N$t@p)4dr9dcNyJMe2h4CS?=pR%c# zih5ymcI zH}Nm&Y@KQmK~w=)ZhT0tS0-%P+%;A7S^4(@>hw2CE;-eg;xfOY*V>eNUC#~6NME|T zzN{mFVvD;gN;aYHHi*5(Z*)sR=Tmc@t&wbAyq(v^_6s#bg0YDrw#-)e)St>arEl_^**gJ78#R6)L<6hm$hEpJf*CFKU9KO zx@ENK=o-bB>+tWO=3}Y%Z_8qZBj&>V#u7V25QlKwreTBn%`4*`?IU5i6f-(AQ14P| zcVWbeO(c5Lio}t+@Q&d82&UG4r@stwPkWX>+=Q8gK=+tHJdafOnBTbk0hDy1M{+v- z5J-4(!27!O?Ksu8EU|9IpYKjwM>_+t^SOrC{{VJ@-v42zSn!@a?hi2v;RN_;r1K8m zz7sh@LO+LF+|=%I4$lGn{AH9wEBqDLRIkeR_SoevUuRGv{*twH%V708(%HQLnEbpN z7IRc?J(_>=*mJdar7tk|H7#(9TPq{-YuCbL#1l3Yg zMCFca8mXe3lRA2PRSwm$by-%Qu?UDK@HRT=4O+4cfgE!A3&d~SZ<80-;K5_*vpnGepos(>^-9kA7nebSZ0W<<`91J z;X&pEc?&j)piT{iqN<<1zs?o(<=u92s_dZ9t&E33zg{gu&KWQy0iTPPxA_m9b-yLz zTh^1yt~wp7|C~!g7gKdHVbQY;?v7lBH%QX)HMHA_Dpkj)$^ z{?ZJ1(OPKVMq9;bCK1^&BA-dUtdlakJ zD57T~p==V=T!0s!V7z4dAEH~VLRPOO!Luddjy(@vMK#>4=8RjuU_3qKw$7&WK7?d%O( zYocIy(-!XJ_s!~>_NlH_>-sRo5yZYm-hynLjD2uFCr;zbV1)YvY&@-Ma7|5cAE?Tn zh8T^H=9j?bS27+lmf>Z*#2qN(6K9rXF_zY1O&Mo_c!`j`s_za!#AD<>UN=F*!vm{Y zPZRg1t_<3I109quEHslVGzam(*IDuJ{D;_Wo={$w-VT>O)kRN`T)OsEyv=imm>t^@ z_y9Ko21}sGvo*WIrQ5-XIP!&9{o-LvhogoR4#SfA6hqH*+PPNNU>Qz$ZKM)E?i#F$ zRwBM@v%-JFHyIp|VuEYHFrK@d+U@Z2b1s*Dz>uqhL2z3A+C)y1 zau10o`rhtla)IkS*2h0&Nbek;RZ*bC2*DqR>ar5Stfl8oEQ@}mj;e33;}KG;2j|;O zoSM)lEBJ~m+3d!3-pfj}FMGdoIwJ&RIc7E;%90ye&djwn;u1pLwQ%SNnq&? zRpXM|$Nd0xCg5fh%>_qZIha{r&T*(hU(~^bS>|$c)y1#*W|=m(@X>hc?uNpdVGyQ0 zpyJwjar)UZ0Q9j9xUp{qy{L%@jc2zxII)T#`L*?)&R~Wm7_KZy+0GU7^qO}$Z(NI+ zQ?H#ZzI(kO`tVEhh4W2mJOl#_ygCZIGY#BiMW&+Ivkd)Ne$`{g~d(h^FBvGhjAlbX*pR>ht<}*uJ@%dxsw+`CexXF z0~CTI;AKtVXMr=5N85*ABZiHY4tu=H1~L~<)2(-c;=#&B09E-~4Kgp@olA@s(6-3~ zb;y;Rj-PEI$%jWzSYd2G2muu!bv{ZeM3&@dZ|Bd(_;R`I+wupGB=S@6sxTpWq47Rz zAr7w?z!^X_`I?^YwbztChR+B+q@Hac6+)*p@uWks7v{@pror{@aVQ%tqFHE8TES=Y zm^o+tvlda_^0dGyDlWOB;r{T4%k8SWn;g3Dp1Utbp=e*SN=rOx=EO*L>F2&%s zBzM0qykia+mZ%zQY*%rcAts`PDz*IIveTl!hKjCREZ)F3TPtRzr%vcoNBWu!NT*Y5Z~~_aw@6wL7_^gjA?|usg(X#5Seq*%e(7V z13OYCK+D^4ei3zje*3b9^Hd;Sfg1*p!<(p|Z?Xw46H8C9ND_2+TzNwicZCk*M+|@O zt2KoW>4WW$Jr*-rlvs`#vc@*@RrYv~B^d?tziR_-O)tZbD$B@=gtQ@d8(jpAnoHbB zg9jcEeC{ue)S$M072nnboh?hZoyP*M0gDaZTh_wpx2H=PGm=TM3VGedH!rrUfvLX_ zT_3M{v@0lZ*`E77If5LAr}4-jid_{1V*2>j@0D>?JnG<68;-oBF9bb;-G-%xPXu`k zLl!|Quf}V%T>u!nUvG(DGRajgaXTjGG1j>L)dOUw1QSxpk#U6NEG(uoxFFV}*XCn) z%k*a4TB{-$@}B7M+ab~r7<$7}r2P0V)sulzS;q%2+c+boWq*9=l7W6eOQ4|QX9MbQUS+HlafhUg*!tOcqMU}O=_O9wkhV%`KiDBr7(Rvx(*j2Kx zjzPfF<8xRohFQAOvH07H573+DUG)13MC*AkSvRSV@jM}H zjM+Z~@H?n92Xst8FvfCtHx$=OaDkQ^II4;9XtPFf*^~Up`?HhPE1!h{Kg)LI$mRkt z;Qpq0$B2$$ooFaVz33OCyBxqN&BBc6o4}MlZLneZ%uXEX4wOpongR31OqMl3C3ymf)SMlXmM7@^@An zx^@PIT$bC5T^JSeyXuau7^kt4{i#$hhG$%yeu7)0s9GO;WI=^fXxTU=;|0f(X7xpJ z++LAsxPp~=YZJpYzs+AYDFnZ;}6m8slEh3MScNdzw;E~WN#?PGF7*uIxo z#21+Q7&Vbq2NQLuv1A|J;IV33gGfdw+B@}n2T;c4@G3L61@6``Uz12XzR`N)3Su$Z zj-vVc`Xk9fiveE@a~X}_Z$qq9{pb`^2)O8_cj_Aye{9{**sqw|AGpkTaaeMlz!#u+ zinV`BI15207O$p0m|F`9ZRecVv5S(yvve{VTY$wo9}GY4rHm29nS-NrIT!52J7kIT zzw6Ipq-n#-8(S|!9n;%KE?bhg5s=5tOVx;5LOT5RtBTqRIa1W0DW}L(u|5>f??5xG zo#w#uS{YZRgw_Q>t)Ka}ys@|tU7FDc6m?KBZTNP(==P~;Oj=x*zVwvQ7%~rOK#v*L z8N?;C0_*sw`cTI(*Sw4+ojc#kg!n;ce%k~b#IdknG|;0uT*}rosIVM(P(C)x%5b)< z0`ATWIrt2-XylAFXmI0tkCeUWF%Zc3IQ+tEVQ<d1qQN>hasWL@w-d_%Cr% zk%OG8Kx)%S{t}l(Xw!MHgkH=ry33=B+hsQVz+owsnYEsz*Q??SSW(s3e+pHxOXL|g zQZRRZxLvRv3QlghK&_OjV@mYHKuFRu*kNO@s^FFQ8QCLbr4g z`1wKEhjQD$k&pjQD{9&&2)j6ji%TEF^ZSOBf{2TNSMK4URa$oLBZDHZEv4mgh}HZ& z50=-jIej4do5{)et zdeaGQZG#d+Y%($hvo8E^?p1^}C67(JH@$dnk)=63j@@@xi8~nsD_WnrE!pY^*}{?E ztnq8gw^Tk)31{njd-U22xP#y94RP3R1dZFj3l%>92nTaJ;^H~jGHqLW7c3ZqWR&W5 z8aAfPzW0^g78vyZ(M`!~dHM}EQ)(=yg6j60Sj}KQgfm+_zhGpD$^$`pDBy;R!@i)h zP)A7EsTp+GLta56_SLp%0q0KLLx0^bp&bQmcBPF8C4Mm-DABQO=i5KJt|u_UE#chI zi}($FeA=;|MS7pJf<-wGYqv$L_3CvrXHP(~bOi{3%gMPECq{psF>bsXG~rT&6&U<% z6e>#cDqxmL6k$=xbVYG+Nl4Ez>{uz)>-M%w>hNq~WUmZZqF*b|ngcr&VpkFEi*CWsk74l>k>cjShh z(VvrTS%%ZH=#+!Ced%}~G)ZulP8@;b=+RnzU zE7vE#28!O*x3{ucG)w61@EUsgn%&;MyTj(v&OQ|-*eBEZFTKfwbT+~n1+6uM2kjgd zE?TlBNjVEGW;x1qrqxGAR_M=RqdIdUUpz~Vue&@c z(;CP2Q@F&io3${a+i=DrfX`5j@atQm*WPTv)4Tpi@@lC_qnI=8d%Uvh$pNtKGU7B& zOTIU(vFPX*t1#ipsU@k_H^SxGIq%o|mLiDLTjaOb*6_8-RT-E zb-c+50;cAn@vNM`JV0ZeMI!gWN--uWHM%@7*VWvM>nx(aUzNq*ch32SoViz<2wi^& zO1{$Fr%du4EVu&80dtMX%M21{_6S?{+sx6Z4PnI-K}rP6P_`QY^J|_0vQif_^v*S7Nw z0hhVV)=XmOSavvHW9aRv(?>19W`6(;4w(etbByvi;D)C6S$Iyqedz;ZvSf zXT9DKAdJOJzgjCue9tyVqd`rHASy-H$4EnzA!xAMo-VrnYz1?#jFG zS;&z%+AGc_jX>;d*|ao4f@fLVnNiK7U#xoKG=B|=)oGUFTP-nl~sjKeTe zCBA~MS`u=3CL#~Lf77koEO=->_fUEOdMv;h?-IMbCx!>U0!LK!%ER zTN4@3UAlCSyhv9xI-HS4N!0N~R<==`al|fERct*C8)M6^gClZ6SgLLBq8Y#~O3D7( zGBVh+2xGU`E#Q|zwxD8$g=V5=!+M9M~cu>F~JS`xJx?XTpwl$CKKL1=!6Y!;{g#u&o<4L@|UDs_!EoQH@g11j$jI~-^1+mFu1yui_Fg7VG=qM( zOZ_oN(Na@Y%cM{9JO=vk#tfv{X)wpf{R#!k!H-QZIKrtR{rbx7!?+pcI@>1AF1a)Y zZcGaPi~qTc?Vl!U3W)A*l6Os4B?PH2MklV@UVEr7q+OeJrD@fvJGv8Oaes}!s6>U+ z)=gr#Jnbl7^w`WhNGdXh7aLywtdL#1T?e?`6|)gpspMXE!|P3`8@<1`o2MfNrEZ)yNO$^_X9LVHZ*J?&)iC%7Yd|>zL`zBJ+ z<_Z)%c0a}rMKNfk{T&nOImXQv(?nhrU$mU@$eLD@pmD#{w8p~)VDkc)>N9V5rspWc z0C!#CFC3c;CcZ$$k3(V1!R0&DFIvRw&u2FV2wkh}azsCuit8=EHNd?(%YJ zv1-%4;Wtye5Y1DMv9NUWnHdy-7QM5}p|uUZy=7y-lRV$bTdHYMt&Q#mde*)8iKNQc9!4tT{QW_5@8*PlYdk!M?B?S54 zLuqOw)wj09Hk~?QK;U6bNY_Q0=*#)kX&s9JT_{af@}6>qBS9Gwy86%)HR5pegc)DP z1BAJZl_s-?u0elpxF&^;7`RghmXkybxKRh3Uj+-8X&9+u){S)c)XhZY;SF&JHSW=z5Dz`~f}|+1qjC zixv%R&*M)5E3*_d+}vBEuTq{mOV^$Xeg6Z5S9?p)tXmXC+T2@Aa7r?@#F*lNcJOGp z#e}KVKXb~Bj`!IQn4#*7T)q_A-*zebd$#lLsH#m;ZaMcKIP5ki3qTA1y(9=GvI2f zONP^f@y2M0Xw+PrR>rFWbw+n`>NmmJfSH{TVZ@e%4iNB(B7>q(N%xh zcP0Z4CN-~{-%}Hrc*LSk-_BV>quaBMk<{L{SVNaPg%pX^Nz~G1DM^1nF(337ju+H( zABUFR4;Vl)+LMYQ_18Z?PpgX0?JXMTLfEFgeFkc|Y$X2JV`1p{-dW(IJ~gxZ0M*0O zb&)r5J7O2II$I_@UrK})vWLRAeX5M@91|mAO&Cy%M2R~WO^I}{SX39Fmq<->;}wQ8 z1>qv5FGu*KGW9gIakPc`^9$&1as=l5O}Nhv5vSE&pDy7Kf}&2$$5x2ipdQir0x@iIYh*Lcl?C@G!a#Fr+C3_i-(qG3myn7t+% z&zQcbA77NqX_AymjGEh*msisVO%~&t1A3}u)cr9(4JDBr!ziklq~TD}iHUc9Uz+*O z8d`@D^l;??9OBt@9;wyf>YVc6C9Tb`^VJvN98h?$^2;R>)=X5**Z%U6i`MMc0acZ~ z&Gk9f4wWu8Sl!RD{DLoU9<10~DL8Orj`aruaRW`06&dzigW-lUtH;+I&etV1OZVWH zqwD9A4g_+2?4~r_8N1Fr2Qj%Q=4{L#RjR2Ua5i`%;9Z=i2LGrB`Jd`l{xxNP^>0y<;`~=%VJX&#wn)bL#YB1zCL%Q$J9@V^Cxoz*|4do}4YdBuju6#ULj*?%W zF!PjFdepA;u3^Hr({*v&SDN9AB8BIf@yjvEJNk0pYwMnO_)0HiufA~oM!+~vZ+m<^ zeF1|1^0MO_7U*XulwM75J{?Vyrek_b-b3cwt@}h=iey1nT@zIeWk`7=+_Pyrww|uZ zlIt1D3-NbBuyo>JD?U!s^;D`-9TF(>ji^ZT&d|H;Io7CbV?*dl#&9pp~rcCbyi}O+Yas9Ff zbA~alytzz8hhU97r}I5t<6zy&c{Gs0#7QWAE$z}aJo0>-ht_A4)2PW{VNjngp1^Uq zX*85Dm~_R3I`pxVaub2$fNx{2{u&N`>lPa7E?D|&I)5a8>?PA}q5jFAy|;^Oktv`3 z7amnc+3k|aVdP2wV5V%O$HVieYrzu9kcig6OZm<{`73r=FaN5}GhnUqUI`xh?tZ7~XLm?5PsBrg;1~X(b%vh;DVfP z6GWKj9w$nt*Rb&Vz+4WWjwD=8`U5JhAw{s4FWO&=dD4pf3EsnPK_!>AwKlogy{> literal 0 HcmV?d00001 diff --git a/tcpip_kanal/klient/spustit_klient.bat b/tcpip_kanal/klient/spustit_klient.bat index d1382ff..aae8197 100644 --- a/tcpip_kanal/klient/spustit_klient.bat +++ b/tcpip_kanal/klient/spustit_klient.bat @@ -3,7 +3,7 @@ :: Meno studenta: Tomas Lukac :: :: Veduci BP: prof. Ing. Milos Drutarovsky CSc. :: :: Skola: KEMT FEI TUKE :: -:: Datum poslednej upravy: 15.4.2020 :: +:: Datum poslednej upravy: 5.6.2020 :: :::::::::::::::::::::::::::::::::::::::::::::::::: :: Program je mozne spustit s prepinacmi: @@ -12,4 +12,4 @@ :: -s cesta-ku-suboru sluzi na nacitanie cesty k suboru, ktory chceme odoslat ::Priklady spustenia: -klient -ip 127.0.0.1 -port 8080 -g rsa -s nieco.txt +klient -ip 127.0.0.1 -port 8080 -n rsa -s obr.jpg diff --git a/tcpip_kanal/server/Makefile b/tcpip_kanal/server/Makefile index 9a08ea6..86d2d2d 100644 --- a/tcpip_kanal/server/Makefile +++ b/tcpip_kanal/server/Makefile @@ -3,14 +3,14 @@ ## Meno studenta: Tomas Lukac ## ## Veduci BP: prof. Ing. Milos Drutarovsky CSc. ## ## Skola: KEMT FEI TUKE ## -## Datum poslednej upravy: 15.4.2020 ## +## Datum poslednej upravy: 5.6.2020 ## ################################################## #prekladac CC = gcc #prepinace pre prekladac -CFLAGS = -Wcpp -Werror -I./../../wolfssl/ +CFLAGS = -Wcpp -Werror -I./../../externe_kniznice/ SOURCES = $(wildcard ../../kniznica/*.c) \ $(wildcard *.c) OBJECTS = $(SOURCES:.c=.o) @@ -21,12 +21,12 @@ ifeq ($(OS), Windows_NT) ifeq ($(PROCESSOR_ARCHITECTURE), AMD64) ARCH += -m64 CFLAGS += $(ARCH) - LDFLAGS += -L./../../wolfssl/64bit_kniznice/ -lwolfssl -lws2_32 + LDFLAGS += -L./../../externe_kniznice/64bit_dll/ -lwolfssl -lws2_32 -lzlib1 -lrs232 endif ifeq ($(PROCESSOR_ARCHITECTURE), x86) ARCH += -m32 CFLAGS += $(ARCH) - LDFLAGS += -L./../../wolfssl/32bit_kniznice/ -lwolfssl -lws2_32 + LDFLAGS += -L./../../externe_kniznice/32bit_dll/ -lwolfssl -lws2_32 -lzlib1 -lrs232 endif else UNAME_S := $(shell uname -s) diff --git a/tcpip_kanal/server/nieco.txt b/tcpip_kanal/server/nieco.txt deleted file mode 100644 index 1e17e8d..0000000 --- a/tcpip_kanal/server/nieco.txt +++ /dev/null @@ -1 +0,0 @@ -janooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo \ No newline at end of file diff --git a/tcpip_kanal/server/obr.jpg b/tcpip_kanal/server/obr.jpg new file mode 100644 index 0000000000000000000000000000000000000000..127a9a304622bec3d3431526053bf7beea412081 GIT binary patch literal 14242 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 literal 0 HcmV?d00001 diff --git a/tcpip_kanal/server/server.c b/tcpip_kanal/server/server.c index 07fab89..3e44a60 100644 --- a/tcpip_kanal/server/server.c +++ b/tcpip_kanal/server/server.c @@ -3,7 +3,7 @@ // Meno studenta: Tomas Lukac // // Veduci BP: prof. Ing. Milos Drutarovsky CSc. // // Skola: KEMT FEI TUKE // -// Datum poslednej upravy: 15.4.2020 // +// Datum poslednej upravy: 5.6.2020 // ////////////////////////////////////////////////// #include "../../kniznica/kryptografia.h" @@ -179,11 +179,29 @@ int main(int argc, char **argv) } zobraz_sifru(ssl); zobraz_certifikat(ssl); - nastav_funkciu(&nastavenia, "crc", ziadna); - if(prijat_subor(ssl, ctx, &nastavenia) == -1) return -1; + + //nastavenie funkcie pre vypocet kontrolneho suctu + //nastavime typ "crc" alebo "hash" a nazov funkcie, nazov druhej funkcie nastavime na NULL + nastav_funkciu(&nastavenia, "crc", (hashovacia_funkcia)NULL, funkcia_CRC32); + + //vypocet casu prenosu suboru + clock_t cas; + cas = clock(); + if(prijat_subor(ssl, ctx, &nastavenia) == -1) + { + return -1; + } + cas = clock() - cas; + printf("Cas prenosu suboru: %f sekund\n", (double)cas/CLOCKS_PER_SEC); + ukoncit_spojenie(ssl, ctx); } ukoncit_soket(cislo_soketu); + + #if defined (_WIN32) + WSACleanup(); + #endif + return 0; } \ No newline at end of file diff --git a/tcpip_kanal/server/spustit_server.bat b/tcpip_kanal/server/spustit_server.bat index b1cb40f..4957937 100644 --- a/tcpip_kanal/server/spustit_server.bat +++ b/tcpip_kanal/server/spustit_server.bat @@ -3,7 +3,7 @@ :: Meno studenta: Tomas Lukac :: :: Veduci BP: prof. Ing. Milos Drutarovsky CSc. :: :: Skola: KEMT FEI TUKE :: -:: Datum poslednej upravy: 15.4.2020 :: +:: Datum poslednej upravy: 5.6.2020 :: :::::::::::::::::::::::::::::::::::::::::::::::::: :: Program server je mozne spustit s prepinacmi: @@ -11,5 +11,5 @@ :: -n rsa|ecc sluzi na nacitanie uz vygenerovanych certifikatov z adresara /certifikaty ::Priklady spustenia: -server -port 8080 -g rsa +server -port 8080 -n rsa ::server -port 8080 -g ecc \ No newline at end of file diff --git a/wolfssl/64bit_kniznice/wolfssl.dll b/wolfssl/64bit_kniznice/wolfssl.dll deleted file mode 100644 index ce2da3327dac19f55095fa90f964d27a79dc5c8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 829440 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 A0yi(hB-^7u}5H)`Xef0VX*<)1@lu>2$*Z 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
    06AVA;c9+qdumEHBJX493+_`U~i&a+k(oKuky2> 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

    +0Eqs|^3 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%0ABSmSEu|53Z~=&?Ga z{iWsDMAdmZHc?SLn~QG2^%gc!vqx)}nk^G|tPx7I7*S7o*e)?Xnd7CAL;!!J8^ZS5 zfd}3%Ji*oe>JzF6*hMogY2MH7;(tc5#;%g2RFVpJe4iIKh8RNGzR@~#P3$#vZ#b3O zkUAUi$dxWJ=DH&Zqbq>P@WeS)_VXBVy1grPoRi}7$g7Cgx#Y?kpxH0_f?TM1CN;>3 zA0;;hG@-(2LadF1>JW3T$myV@Bu(1m=ad1A0jW3gvLC&D%6T(8Nc&*ih$gVUZJ!#J ze+&GNzK1&=qivDrzo#X}JVxcPA+>&reZgJWkD7{=%;2IDcHiEJf31zu2znpdLL%!% zlj003IWRi*+8KDZUZS=I{I|E4Fu|P!oX>4Oga0NJMwUy5WE*WlMz%X&0%GE!&rS%r zUd!czYo-!qs>4*lhD+tSM8?|p)?I-YY=-#z7li8ixxj7x{MHcrzGOvdf)-GFP|I5s3{AwGLqj~MyyO#f3 zlxJ^T^zY&npvrgC^TwX?Rdr+Ir;9Gvi!L_=;)hF6Tx(XSOB{)wV^7L1LogQwtqM_XlU)@7e^=1%lKeJXDJs&X+IAu(?N@3eB}K`@-yig^Np{h?F6vEsHQH@N zSF+FPBGW(gQ?`qUM_vuIDkH5XmkN)c?F|g+#86kP*ofBuKgNTu+mGR>*iH?=X> zHBb#2sQT2d?Iu)faenwxeC+T7h?dYuwM4C?B?_!? zT1nH(E&EIu@SZ9w){Uxe<)XJ+-MT)v$5BMZ?yF5^y`w1pW_<-_xmW^qw?L zKRJG|+0@A4yWzIg0nQ+b5pT*J0cJy=YMP<*8BSf@0gbpV|BLFbmT%(4wES6K7;cTV zwqM0#t+r3M5-ZgYGP*c3+y4CchvSPnhz%!xXdd>{V8Mz1A7Vk+cHkEwLYoj_rVx7{ z*bun%Qs;cp=^}kTrOnuI8s1_K1mmTsvs(PkqKo2ND@-?bE7edP8^(?HEXEg=*1YdK zef&1*z-BEwIv~4BN^-FE0?g_j92F$OrLnF|>)-Q`oMeUN$Is(lO`sn0oG3$&4#vaP zrb-wNG~PqXB52XeO6AaO2t(6^wYxAs&g{atPJOmzNF;t1-*~P&i*J;4B5{lFs$krz zqN)YuQ4ZTuTr7ks_PlzP2VxlLERMe6c)o9vtFo4A%9HyNdS*&taY{WT3ixQeDg^kw zi)VkDw_mA&I4Je@9!;UMN2mVcyws;Q@#0Kpb1DqxTCttwbLHJ2w%Y3U9S1k#yKoy; z+mAz4|9#7M{8r!Cp48W(#y#WEkEVG`QnTETH~H|5-J$rX3A(8KFD3{W@B1#=@xJep z(>4(Rl<~d3vA{EB6b@Lx=zTBTS;982Wi(HA0Ig#ZH`O8>|JAGfY4sVzSh#B`lSUrH zS?>!5)m;zJ9mpS*+BE5{=~i=qdsW}5N6R`Yqvtr4k+b6Vt0*aW<;F1)yB|ZdP1Ee) zt@x`*kCAQfLHMia4s1xZ?g(t_Mv0pBdE5>-#OVOvB1HV`dfRfnkgg0Y z+_9A0zC{lag{J@ShRV3}MG$Pqu$YAtIa=VFr~T`>QgSzTo{vsUi^-F78@c7qmnB8s zd#`UQlBHPj8#eOW%5O8jettXnrHn6(7i5|K_2cBLSSq#OVWY0_M3f$UA@wU+Z#EG# ziLgWcRHH9;!^YBF!G?nssWD#3csvu<)yW6;@#xvQB z9f3)wFBq+LBw&|B6HVTD8HT%KUEV4qIGL*u79(ZtNh{Y6DQ zgsRT8s(5HC!Wi5xgi?Q?0O~@ar!LGE`fsL3L;bi_PpLCfpW{x5G4MT~EdBV3Fri<+ z(G9%cosC3MR zAAw{JODxZu0`6o=+Z)rBt2mR*P+dw9sfbcS!n=q{VmH0zAdXmrAQin&hm^)TGp!$F zQ`RyJbB9zQed#M0hF>wI@$W8-h~Mx>@B_3E+_9t%eIoVsq*hX^H>CS6CBi2=iiPzx zEvLn9NR`;V3r1lNG(LGS;y|yWGM$Z~)ckjp;!r@oKNvg!JVuG_?t!z^mQlw5l#kQ+ zAjf9^CM5>-CSBUU;2`@s_`CR+EWFKv*YCi?(N6i#U3l({*c4IyE(N(S?T=rYtJ`E# zx9$Z8!`TU6^6(1lhuzBZ^NZoxf`|QMg*w=)iuVrO25XoZ^-W^=Xy?N$b^|x@Cc3vb zzZAQ!9>nD?>{hvbvy&}!5{yOx=P_`wn3d*1TBZ!QBsPgv6qh+0(sW!?&6OMQ3>WP9 z2wV~otIX3J`O9&<GTB{QCYXXnC98?*GTot-f(mo-Khqms@FEG+TBvu@7*c66+m4A z4b1ARNxvT_W6lbI*Ln$bnY593EBnYjJT~&%fnOsY3f;`FKlLWgMd&!x?L(Ubi3PU> z?P&i%2Nl!O3D+MHrDKw(?#9&%34KcV#H|dpQl|eEDrhF6Z?}=EZ&s)V;t8D7XVO!o z49aM|kRB6Yr~=$Bawj|kMzW$gj}EajV4g1dHey`~)yJze?an6(NDFGic29x4Ha=0* z)T+`EM&RTA}4XtK54=zZhmlyNwRg7nXe~6LeF{Np>iO^OfNkr$^r}xfylY zb*b8^2Ei`|3ZE80-I;V7P{bwAf;KQzbA+q2r7by+)qVP2JA?v!cl4NIZ?PhC(?j@< z1eyu$Yi|MXU}k*nSMoyjeeHOd;)SS-6om@!oDyGqly{j{m=_fjeFk5eJ;H$LusZLv z!&TNQ<)C`g2aeKPbE%m)aIv72nKS?5tk`nXP&jR>4SoE7XYPCj<;;I-?gWl<=8hVA zxS2ag=>7=f^Fqk3#OFeUy;^N*t=YTMKe_8m=Kil-q{LR&JEtqT>E+tHW`{S==%QWd zOfB4L{)JIAN}+!;L-;%9y&1v>^b()LRyB&n<2f}U`|pwXSNr*`;K!W%DpT;QM18fB z-!gt%`E5=$muhPH+Rtau0YQTOfIO!NI|61>g*MFA(x0xx8eK(AD)h^k+a;`?<&FYnP>Sn$o1s!{c{q zYew_Q^k4hIq+E5IlD|k#uKI!Ap5_f6qA|3hWf)EMEqa82fmbMnuhwtTDU(9WaE?r9 z$-v|MaYAkwYEDPDIvB(a^izKQO1Ti_I7`#}+e81&pJ|p&wjgfI{qMi*7 zzvdl0sr1@|uRbP#1KQYtH`o|jHh&;}nH^d-Db%;1(v+6|g7bNUdu=qR5yFEKdP#eg zw2_h+x&=&y8J$isuv#i&`PJQ=Tv9^gjK2BlfW2BxZ2u!QqO)2D2Pb{)|FHHh@KIIQ z9)Dtpgy#e$8WklUZ$c*44N~;JKQLIui&Iqj}K$9rb<5cWRZLPJv z-YdP=Ua_q;RjWZB2|gg;1JqVxwe`gDf!YE->ioaIz0a9P6x;j%|M`5voU_kr5CIU2IOE-7b%nS}sj{!BBn3R;^^CUhCJ5A3PR9`1QZext_n*sQ#{O)zP+oLoTSlQ%g3;A}-po zbV1HHCz~DXS5(2PY8ja&?0}7&z+EwiW~-i=BAzyvQf`z~9DX zPtOLDGr50VivKoluJ(jj!+*$Sm(BD!w&w&f!Fxk1PA*9f&2}}in*`T2?~ax23{U7u zEWn=#zs1O;VTrF{(U_dUbq#I(rHP|pF&dr6;}h0%Un2gz6_ZLS{U}#Og@W6f-#`V+ zZ*nwW4#yaG^x-G>CJs+Wv%zf%d3_D4o;qnz^%9f~+Vv_>QSyJM*k|=I>TGB_`&@J5 zpU)J%L7;+|%=zsFOXo|T)aHAZ9#Tt1xgpc@&^#=HG%sRa7wzMZv_*aV^}3yg?k?Ep zw7@kahJ@0|oBHRA_`ymX147QChF;yac_SG`Hf7NNupus!$rggLH>T%$l>G&}le5Tr zqrshtOPt8l1!S|=o$wF4#B>c&NH>w-1MW2Sh3hA@9s>VAkX{ZGz3gon9j#CHiC%uz z7wmeWmu0C)uQL^T$(Za)5Lx^wHHTR!p|+1o69G=?mk$lqpHv&T?mK*_Pxc1dTX|5A z8DOA&0WW@U7di(I?C-UIxBWFf*8jit_dyy(dZ+tO3ApZk&4$7sl)gIM-zVrAf-TY< z4kmXd4h{$34YW)9`Y<yOeEOSyL@WPU{h!2V{f>rOftg7y#Nlr2ge=SDwy!zzhK<>XeRm0U9{GHVXwC2mfcPZ1UAs2dyTv$ z&FST{?n8W5`a4VpMlMK4_}a#`MfJEV;Bd&h7Vy9o&B5$@!Rr1ULa<0DqJE%54nbla zW`%zg05_#6s$i5b`^`BP)aph}ptGxU&< zFf&rm8e!-mQ8UrIlVLm{b$LC@@bIe7fsKkDDGg`+UvhK z0H?RQzxa~D=|8oItc0JM1_pA{)`c{sjX-~&CByvW;8n&GDnsZGa%PsucnQm zo@{is@zX0r=eIND5Z;0KL+L@@jx zOji%J0v}IJ;C}c;gQQ=`8C)9jz@QmJ)p4zoI~t(WB+%w@NJCn?NH$xSSG^-(!jFq{dd6)c~~ZX z4f{X;&@z8dC3*>|i{5iy3_Bl%oxd5k>~jovbGdxH>{)ZXt4awQdSL+r+Mv zCl3*!rh(GL;W;oht-}5N+otWo5323Vq?o|061|_fJQ2!wxVCg==?ORVilv3TY;{lKMM^*BT@39)DVd~S@)Q*K+**p!KLP$G zM}3Tc>};Z5iC2iiv^Vfu!tW%eN4J62`JoUM8fZKjSJ?C#_hspr+cwPh2~mE3o~>g^ zsw%2xU~&0FeL`{Z-%*b0n$9+wla;TlJ=7yiB}-!-OM&pM3wNSUL08gC6cqO89y}9M z3noQVkvj|$>e6k)dFs;bmG9e=vh;UKu>SZ}7Ts{5V;LVJX^z)22ZkOQO$*Qls6tpb zSUKgXcgwNf{ID!C;nl|ZY)OSjEq~N5LqjopR#cH*+SWf&wGl8Cr6v=R3HZl8N01&` zF|upo<|!*K{&Mys>=Noy@!!SLS68RvPo!pWdb%ffc6p!>#wb_JVJ63$2Q~_YQt?jy z)}&w=QV0pDcvlMQo0`FwVW}A$Y3@l3ji%1vb!6%c^qzYX!y0*QOpOfj4w=3Kat(HE zaKDHjvhe>ABUrS;@}L8)f$}jz_ebEj`B<*SaSiehs?;x*Ju0ZB1boX;>aspM7~8j=6>clgzS} zT6RXVlsC>U}KexYZqevQcZe?Ip zgrrgN&de9h89=7|5kt)AEA;FrafOF*a8Tzi-o?UY$`+d6E$%$?8)vZ*+(ZgI07PSfPz(7eT;Wl8fx3Xd7Y}(QB?O^MSEn4*@fesc!!w~%hWSVXJl(y z$Js-z0{u(=e5+IEWoz>1WzEHv{?Cb`40BkmbJnEhfU2xkDxTif(#4V7C!Ck{s=h8; z-_dmP7_Yv7xfFEeh7}BPE`k#Ge^NCJRX(YZezQNLZ9b>AlAv}u=V#1o#O|sJoo{-w zpo0Y!Y8Q?X#B&DPZ)5Sm0tDKBU>*?dziS>)9&=`^qX4i}XZA4 zF^a6ig$_bL@79kS05r}Q%B!+kzp{p+%0^guxv;*kS9A8iw;}MOP5HzB-Hr1H)p|9J z^=l%sXW_|2@qwPREAXTBIi3&3?2Y7Sbs*C5GoTZ#w^9599dcNRq=uR36QR^sI7sVX zNfJ2|OMDJRoAx(CP8s>oQ(f&v44b1}e<9qtds?5}<~t3a8VNarsVTUr84^n{JtSxM zNRuP^B4_5b5M1B<5WBuM^Fe%YdQ3s4CbG}z&K)7B*3=ZR*7Hj5PK;+gZG&@zj~@N+Pqc(@pLk(O~AJhE90i% zPvEj9cBLY(D<7;B>e5shOp3=!O@ozUsZOI8k=^|DVd_$-|AMo^N<$p@JLLz!XzT-5 zAgLYiF+lsx{R3d)gHrDx)hR<=R0oD{XuGzeH1V*cUu=G+R zjQ8ohEWTU%-=V(#w-5bq{$vj(q|b6`I!L^94jdf=O6suR2>L9LuM;WC*~jKCRXQg^ zU*=o-JeJ(!?#<_W`HyK#$2rd45=THn-@W`*+u!8SP?fTnZE!y>me%9=w(1)ek5rrO6 zZ;xb2D*~mj#(CWR+q1R=-$DPK&XJG$F75D%2qu*sE4c+rKKt@ z<*l+SnPo(($r7o)Os7NG(?lkG7@xn_J8bgwbKe-BTgXSTkToZ&Lj2w=CT6xbF>pc= z8Bnm7ZgHWgf~_9Z97;{boe~-ude4(29#s&3-g- zb1MG&C&^uiRjloJUn=hISF}>&QV(+u?7pN0P4nd4Lu1 zDqP>v*Gd4bZg0LP!?QQYplf&b(O{E@uO|Scqcsl3bV#b|8c%sxwXg0 zt-bzfulw*QI|YIEJ3Yi%=Czivtr@-HH0I2lG;_7VhHxs^z)m4dk0o%j*xUUVi!k1d zAO9JlNB&$nN4U~dQ!~_Jp&A1OBUF#e3)S8k z#;Cw|)=?@iSHJ4X)j-+E)oXp|cC1nD*^LqHnI}UK5vT+0DK?k_p}J4Y+5PYwe@4E+ zXJOcDm}8pxH@`-c8)y&k(VvyE%u4S3ANXOlYSweX^aR=={M1q&f5}Wyp#35Bytn^B zep1&;YNykW_fMm5YV#Ve&2Q%0Ow6=X*3(LRd3yue^Y@FL+V2X`;ibMJbU1w6e$XLS zUVsi`dD&0>{(jW|0la3m>akFb??A7%kC2$zXpGdd5X_3ZFRrH>9hCsCB|sZ3Zz}Z zEJfBsM!OC^u3 z<=z*I;PG0`C&DAq;K4$tBTvKcea@K*!52A>OTo}Yqsh~RLaY7ya>;~ z_oSV~>&)*~x7GaG$^1X#``dpm>i=gyx&MLoH-K(#J|E%bU(M%FJ(TNv!uEEj`Q7UF znqS-7Gkr)Ot=jVXv;z1HT%V!h{(gJxC&N4R@4%Y_!t%HOWXEsVz)k(@v473HN3aIP=p^t_tX7<8^2e2^;x_1bBNlJt-9|> z2^Ia*dGVR<0)`c?d*Jz*G!d9nH!7lp73o)K-;qeq*^*VqebYR^g3ENq{q7a)P&*N} zF0SXAh9s9u>(cc!XEPkI;6Nc*>8L6>*xhvjyX;VVVs-X~Ua`+ntj<5Gs^Q3~8kLiK zl3(jca|nf{!Z9W#I)CsdsS~Cb=>i6-6SkpFP`Ey0gB>pGjn1E5?W+@V{yx*k7wYH= z&u6W_Pu}+4tELCX{AU;*lEX`7r2!9Yp|u#L4z_3?ck;n*j$y zbZhNHoqGfi*s>iHO0O*P4tnnnYEH_*=B3O=J9mhNlZp-J=dPE%i4Mlbt0Vl@2;lCq z9HJqcVAa-t#DMcOYhUl5mm1A%kzN)v;9@PTjJZ*FG&;pf*@C%=r@w&)RRKQ=)iYu4%ChR7qFRczJw>&A9lfse z0eaZ(ypCsIP7nK3=9vBHVT<*{%>&BCa;OrFRNXeyfUwSJvDVyW`WE+&ewD- zmD&}0>#1FvPm{iNw)CxAF*gMoCmU_*slo1MTzt^QJn8=4emEKphLo&W*BB-1&q?Mk zie;?a0_`e7Z-GU3Ue9WDjz-_8^KaBb#5X?A#1^${7{f)QOn=UZ%YSE{%rs^+VLGue z?9HF`Ha|2kH*MZ}XmqA7{`B<_PhU%L$xocU!2?m?)0XGQfR4NAo@6wV8ftXisj-=m zP7%KnatU9{7H_6 zUPRVaL}Znohut9aUr=Y=yc2049BZXav{FsgaiS?t*_gVzw=s2XPds%w#sUjD4r!|4Tu$oD?HO3ZNTvKpa9rG<%a8L|ky%LF zd!t(in{(mJskwTNY?MjPzpChctrDLSa;GR{dXl-Z%42c42M_#=rJ7cmTS!Ah6-qVT zq36Z=55?sVDuDHF0?tdZYsJ-&S_7=Kh3)@@hwYSinZQC1a z+j|zdGt@a+>na_;MRxhKz1r^QOCvo*!?*!vdxb_a%RL-T0fN0}dvuFRJ54IP)}2{v zWQ>j_Br>~LOzmN_M6vfGd+aPy7P5H4xJE-W{bTQ=3y!_35REbAV-hT2-a3x`_uv7E z&*PPe`WL1QX?d+g(wXb=K;W=9IoiP0x+Si4k2Z!<=pp8GNf+Hf*49y+&*oi>{y5U8 z0QYTY={SWhMxU=DGXKOq_$qbrw-#Te&P*8zI#KSpRq|e2O9fK;^+xoImq@>NEzel7 z%nGz$#S@NFpVvxpDhVl`7>D8Y@}b1kPaZ~`@`ULpmfpBeYW|m^mdzYwa66ZF(#v*6 zKSNyrV1*sj3OB}-8t5BbIh?OfWR)gqUVW%SfR3ziMj0r}xZp7#%434Pf!L$gxS&!k z)quq--0vL=fJf%vTR#hm;lUPh{?@T49GLksM)J{PM=ZAB%>mGQ9US}d)T&tlN~zPpX{AXb`O)?o1g5vjqqylyU)GS z7#ajRZYB|o)jJSJ%T+CB)@9pk0;R-naS!?o183F?(>@ws zFz!Bo+^)urgwn*!MQ*{3m{TfLEg`l@)4X(Tb9V1%*v}0!!yer`aM-6G@UQ5dJY2a&s9NL3KLS;og2`K!pR#OTdK&uJXN%NL5DQst?=hyM<8XDTi&*y%&fbaZSPI2{jGN*Y{L z!QZ}cYLS`C?8)kw1Vm`qs5_Jz@=v(ue1gi)5gE88wM6!*d|Gw+@u>P%{_ArQ=H%!)?09D=>r z#O=lqY)i=blUrF(RB$+kvUr^z{-7*zaO+L!XZVATVMdMltnQhfE$%2C84vSYsdL6n zdd2;`+c^KnV6f1(TrR4WHwitoV87qw#qz*i9n&>0|3vt$^-nN^z!US5iCGu+-A z7?UYm^*UQiVfxUCS@Ruteq+4AO9OwC)Vw&MS^4I3_6L5OaK4)pkhb!fUYk-N3^Uba ztJ<`OQPVvB&QaP@9%l15OQmG@yf9z&L8}Lj2VuZER=xYU9gnA+IKgasuq(eXSn-Y)x($qn9a|m5@%~GfN^P_0O{P8>En$@Z^E@ z&&yVQ)9iH*)y@-Xz<~9(+QmHOWVCpLVw|pf_ka?Npd>$VCU~LsIYYjPr)Jc|Q&X!s z)kHjNOke&Bqzq9O4l^5_brUz6Sf%gl!VyT#VzHc3w_M7D5!fy?DNv&(rKILphSQD}ql%E~^U9UWKJp7!$8}%}t2e2{z2!CVw z3-C9X^csHmLQ4X11Qz%9jp}85Y}i?#3~y;~coFu5xK*RW>4wo{-0OaeOdVZLWN)Bj z6W=hfs)=v|SG$-S5z$}r8&9`Z!wRcn_c<));o2>uV-xqf8~nrsxv84436L~8?H+Eb z4|H6@hfv#cv5BYX(Fur4{34I7$2a19J8_TY4UZCUSnjcf5yWk^y4RhLDmQZwJZL(f zHugEw!;a?-Q*tQz?s8wKW*cnUk!reBgT2pkCUwq7PGlF`;3UaUmgCOxg2x0Oa~{o^ znu;sAi|v?J)%#^*Jg%f5Z6Qh;b~R^{le|l;Sa&LNk9I)A#$pPu4&UYe20`8IeJ%GR zspBODw~cp>&uwpYXO@{Y|J`n_`9gDyE-1U%?)I{cha5YuGRCD5y{xT0a%hC!l{)cD zCuW0@U1m^u%h_?^;7f!J48%5A7E|1$*L|k%zmH%A{gmTzGd&WM9-4^S|s>-D?-pZ zb2*vs+4X%Y4W%Q+*2br&hY#iuv-KKWyWWaT*cLDI>__km9ED%t=;p)xbJ1t;FPsT4 z+=}{RU1qxP-gRmS&bYWzD9>BwwDlFSzdLNTPU)23piww@_4pM&y(}}a%Sp0cHJ0RA z$d&k$YmN=?aoqI!!D4Cr^X~&SUvXKlBt8d)Y&|G0c24m*Ty8+K z-<!T}BH zJbqqr&9_oBlFIekGwT=(@`1VTmQ8{J=d`ulXqwuUeQD@gW@_8JKlFYG6i=9L)YPh|xp+B0{cF_^ss0-z;0mF@+5I zJ6zu3cbi+_*`!x)&>kDQaIU;LvsM2?P5b+5)$2tCe1oJ*avYwGKBwMaV(c}!r=tOT z%{8TRj%=)O&$?G0LsJ{p9H4|5m2SvSs4xlDZk?Y{X%cGOv3^2L0<@Yj-W^H8rl}1? zNbzkr_ut-M)(&WIo1fsf*X1Yp?cL)i`0d?JLUDT`r(v>uu!vF{Y?#!1VCT8eNo?qb zqZe#|)(-D!L#tl8J z9yJWzxN2%c!=8<$iFnwVIyoGiI;k0gvL|yYriyhqnl|7h+7nHkU4ai?X=>_Zn&gV% z=6`06jHbR#Pft#LyP`3DUiFF@4cGwAsBj-W6B50fDi27^Dy(u-28Di6m6b(RPWfl% zsKP35{uyXTt=N@;1XoaNnQE>0SG87udaZY{_NldkTC3ed{8}sjRjurX1;hVXUr%5T zsI`(>Yuv6`USDgBsytuy)l&yRV0=NX2Xg)LKQl)cf#6bHGsP&P47%^uk`udF0><{&UGOz#@Y*0)V6Vcndgg%wJjHK>uOkbZaM zUq--5)aVU<0K{l|;k^h9tH3IA`d~vWjji@p(IGq-F<}G`F=x>d6HKXumk3&u#$Ydw zyM3X z)C1)6eX`dr!#2vVQVqC2d>syiQ)EIV9-{j2Romj;g9(a~VAD~YpNj|!*}zbsr2gbU z`v!jTScl*8a{X4h#5|u-?Iukc!PnAFyG+8xUM7XEK%K-U{6bsNXj;1aTWn za|fhIjGeSBPoc%^OqxvVmpx~FBYY3C(bLgXEJ%J=WrkYaDCL-2 zpG&{ZrW1VwKG;1vm)=f#$T_1fo}N~R=(d~#tQ``TUWA5lGu0_sep?P%`Q8e;(ZT_H z)2>FR$9-uyd@Ift_HF&B(h@|fovGxjnt~IlQugBMIC-COJ5Vs%zE!Ia2okv1I>}vd zmam3`msL2WQXQhn+EAdjJ~EhBTO-P>W0O&R?rf~rWM7#}n2uAJ>U4JEl}9ZzH{fxq z;7$L_u?oK0%f&UjrMW)bOfvBufx{VfSb3`HaQ$T!1DYQb+!ToIUip!ZBXX~gA0$qFmzwU_W15bhL)FltS$%&%Rd4N$}0#RLBU!=u@q;vq1%mTl4x||7)A$~{qjSA^jtl_iJT*Qs zt9f=xtpJ-7&h|6YyM^HSnSQC#%ryFK#=pntqLIYSWG87u9?u5bpLTEl(1-DHd~hPK zhS1X1PsjCi7vi;*4vUV5jw(1F5*%1FTMZl*sSAQbF6DgNi;s2Tol!+y7@h0FoqRyC zdu7DAup%6s^J-!=XK;4aZgKzlS2I^?=-QOwOq;N*N2CK zsGwwS*Z&1FL{b;xr;ho+6PerM^GDb6H5m&Bw@d!*?pKF>`L~VdIEn!x;caBk6GU%{ z5Lf5&nDat>!gB_o!Rn3njiP73#&SSCJkEqGWx<;JQRD{fZ+X?nS-;4f>OJD^0IIJAKDn% zJfpA;ZAsw2!0YbGf%VvcfhBMhIE90u;0MWLEk^4QVwd|Zb-*G))2@yzAhkPY=69js zA2Geg0*?WE_`9OjU(FqRUuOj-`qdt(h+nV@z(rrsfWHAj#`K0E7) z77egy$_K-PWxg5;o>VJ$a3RH~v;ua4ytb7~R(tIXZzi^x37$tgg){#lRom_1gb_R? zcj2>fX~dZ;(vwXbFV~H96GR<*;g^INdovfA72U-0=c;jk>VF%bAK+s+xYg35=>x$k zdNkP3BctB=7(G%GH0EBB>(4K-zX=g7QS>OqkPGQiw;>i=-8cIH%mUM)_+CSgb{Kjz z-O!_ep-0@sDRR~bzbY11E7Id(kIK;_t8*IJ{Po-a97&3mZTB>Ak2Y`4RS7hFl5`#2(y+YkUo>Q|d&w^50d*qeKODHB zRay4i)Ht8|(UkDh;KRt~SYcxpL-z{O?$`Q!2tP7Z7?>4c1z=&RPnUwq7_puAh{p`h;{W`jqw7QKn1uN#B#RST2DZ?*v*c!@DC_8nX0b-ps5|e8GflH}h_G z^dq%`Bym}YRW~19*tgW2D>HLK!S`B+P!lbdWM;PLQI%%!UEEHvE_R{_!figd)?k8b zapIn%7_qX)OzlIKJkY$}tDR6?%U%nonyzeXxsn~JgQ_*cqUpc%&$LJDlWXN#11qS| zU<0F73>Fd0w!%&1$P@niUVD{+?>tM*9*x?u%q_%#+03bhweB19z>J8nBTl^8wv$T| zpEn%J7WcFq6Scr(6c=y!mfyeQ*AU}_$;}Gf;*QJ}IH|aR;-%RpkKh9wAu8ffa5~Jw zU>IZ1v22TPE%c=V!RL7GUKSg7xfkL@k~xleG>{84oH=aluVq>aGk)p7VyR@4$Ef~{ zBSDyC?YkW7G8#AYw%@Z>zHv&HlLhc`UI7eSMi}z4)qNZ3B{R%>d79AsjKSF%Ar_Iu znFdPRDn;CXl&f_->5<@-j1-o6Fubof*scCxj|%P!#JcUtk%t9#>0L#%Q(p$KDRavi zRm)xgi7Ch?Inr4fV8elG8!->sp)nnrYyB?1i0BjiThdh={#$+Uj^uIzz)=OKGu}?A z7I(RCApH6Kw@rCrkOx_b0QA8Z0h(#aY4ISd{lvX#w-4E)O)q9v=Rlj2r3FoycmD`+ zB{STATf#I8t`=inF4yS%Eh?C+l~Z^K#oP)fnI-HCfv@s=>#;cZldSFato%+oX<0JP z!6!CDg`E8{-cD-$cRgyb-~Dt9AqH%>X41UBpSEii7x4FfXKzOnlbHvcG&B3zPbV(B z$lps%#*gv#Q-Y&MA#el-^7dwbzd<84Tj?W%=udD-1>sbU*l1B^jCycUB$eAF9}5Lf zTiy`3p@l9(RR$VR#XYjZUOv-fdOVUcyg8mDC$K!GdPBO0GvV=C4PwbtiE;FK!4$g8@7AjyV zy|zpT7Xkwdqg&8!nhplft4NG3gwx+;19@3~UwI<4!FDDf7SZ2<_uC&>(Yb)@xp>)5 z!yyi1!eT|;$;0b8hHtyWxihpdD~{|oA6k+SkF!0q(E6HscC`mB!zB9Px;F$#a>p_N7JAI*_U#CR8UR&2(hk#goy`prdL}sR%AzeLIDY>G5zPTz)bhA*c38H z6@vD*qVFka%qLN`H?`3hP_@wOKHRpMFL9QA{ME#f@$__}j?AoKQ`lu19M9IL3X{7C zn{9rB9|`4G{tJ|sq+-K9c~Z*o<}>psU)Y42bVo5Ub{?^37AdIFM2gMKk%Hru5mYoZ z?xtse!@}G|a_Lfhm*uW&GXEQ&KeO5w_l0ecgz;jpKba($n4KelS=GD9BfYQX(5m@1hNd0*=$+3l9&h}#cgT(C%@NdnFy z>ltPH**xI86=*+QDXH0*2Q9^_cOIeb6yXldMRPSi-B@+!t^w%exsShIcQxXQoi-QQ zM{0O9Ebg~+soQO8U1Peb&Yho2evssl6R*qdu7`SzOMn&8sR$kJm-jHMBXX~Ye!$A2 z7q+osly``$l8$#824;u5!}UAzmOL}kkvge*RMF>heB3j9QFc<<4BR_&MIQ2t&`VQB zfktghzu=SE}OsVb+b4t%5>3d%5?7*vwXyKp6zun=FF*!IGo)E-$`m)>ufZ!?>gNh z)w8)C;OOtx%pXI+AadKaX73-+nI0=r(3csNR^gG?cX;~FAaSa_%GHiLJlB^ELxhHN zD;|az0<$@qn^baAIQT;12&OR5@ki48zbMk3BC?=RlQ?$|z@8~+-xnLG4wxa30GB=$K$U6pDqnoP>fFej_J5|^G^4Xtw6WQW2kPXv!4RgB8G}S4_Pw2`O^IE;#Fy2+S%))-(n+08BlT& zMI`v=kn{IX5Ft(~5Fy4>MK93hj~;&RAN258gPBbhGcEJbmHAOozVi2&mih&~+|NrO z3<(xHb-3`Z5o#i$4MKMJ;aB{gJ;xWWN>G2*SSrGd5|{ngTl@_7ks;*3!?$#yTHu`?YibNr&>9!3Y0i+=cyOmMFcb0B zG?R_~bi>E>#=e3guQuM;{6tPnH)>-u@!$5;Gr4*1evU6b#g*U5G%J`G|+h9}g@+r%{y}uD3$I9t5 zE1SzkRsbb`{p2+>rfWX_s8#p)T;B+OVI(dnqE@%`7Drmm3>_-zpJvuJ-cGD-VS`jN zfdb9U?PQW>W|EXB{i}KVgvCuTCy!RIAcNn((alE|uJ5xw&CDb-(~Z*1m`XFJ{-0Lh z!_D3K6{wiAZ7q|~$*iPZUni5B^QRsM=ID%1lSXbGIX^Y`)3l<)ww4p_g+=OX=NmMqgL3os6Y2%lJ8f5QG7_2OV?$u(S@$-^Yh!x2SOe|1XiW#~x0qbq zM3Fq2z3Nq~7Tnt0BI*I!SyL3H)s4t+e0&rpuC$WCT6IV`)y; z`2#+r2c2dO434!I(zOsFa5^(Y(*X%9lDXSL!dM4=gn#S84-a^W#4{SL$xk zBc`o9wm#MEL+5+us}9Nk4jSb}%bbR6Y;Y^lw)}H)xloG22$E+Akpl$@rwD25kM*}P zouq0X!)3E@0`~sdZyTclD4IDK-kI=fHdy)!-OHTL87wkpFJ~}U+cV)JK163QeT8Q* zXXKGbXTqw8zPWA=K>s0}^v;CEFGQU4;MpEcPRPUMas!wCZ<(B8C|Lm*(&WyCkrWS% z1P3p#Th?HYgsnU#yDH9u#mAs?HZ*5s^HHHJ7Z*q->s$6(zKPkUKbgZwiKNc0FzbD* zJH@7!LD&((dL&AnfPVR)yeKvDX(MIzVD1yS1wkxtcG~*9`O>FCINS6VoA^Halo8%W zsf?qmL~`b;(2;bS(-@a|bLIsN>KB^VX^6z;Iw=gzDSboVL-QJSG zMYsO7dUr!Yj8yg?JUHBji!&*aHZH1@oPGgmA?$()*?6$R^Nf@i6fql10@sC9j+=_3 zDH}~*c9shfh2@ZY1%6F<;QBUAUU6HaUQ$!kHY2${E3kCnl`A|-W?fFZ4E#3VZ4V$s#8o!lAORs4>D+O|- z2JdMt($Cv|Xwat5Fa5#q$1wE+{x=;j4Jm^8N0v@>7ep^VIuv};^umu|4sxqSQHk;D zgGVJy!lCpaRR3jwCk3`oB>ofZgG$#Kpl@-v=d^~}eXt;zvL=+erUD&_?lbc{aHiLRWHmSGf`0DW`vs89 z5W0{Vq`6?f=~Ao*b0bi0or;pr?=?&A_8)4=6$ZS2`dPD5cX|;mHYZM!rT9orF+I!r z<88@{O-aS-v5R#?w(3@ja&dvefhuk{A-3h%B{i>i1EvOXlYtH(K+uaiS%b5O# znOQZjZ~xxB?y#e=>)g-Y|1=-{RqoYb7P*NxVb(W}V1K}_bDwFieA&f}%!HfRiD9!GH^T(#`LqsJP<ONmVSRpm zy=(U~bunocWlMBMH7opj zx8DD92w&j8^aaa%zKk_r6nN$f@*iP;_xwjR;D#p+Ft5F7-~~hXvR$#JUgKfRYH1Z6=F5K4iN?}aPF1}mVTxz$8r zHstK%wuMI`WnE0_cpacPk-GqWI2HLhP+j-d5pA!QYQk&W>$YdJ@%apfnGeO%<(FKD zfjP$LyGt9#arQO3i{m;T#&K9YysJ?!Tl6tnw#_7rd(u2T>E7NUxW=4UaXTY2WntXE{%`tjxq3A8u-mDD>{N*RaFVCMBBPhphmi9I)ffXWmqlc`Z!Q)^!Dhu-p2H_ z>e#rh8P1@`qT|*zmi0!v7ln*^alpKXM9L)qCM>d(F z%KT%Snc=QstFr~lN7({qNl;*))V>txQ-KA3?M<3Fg`jcbcOfCYWu|93+H5m7Utw+@ zgVUMejP7eR{d-pZo8b)K2WX<>(6v*37N5Er$8A)_!*e~s1JCQpi0i2W5WlDHQ}!i5 z9W&*CcXS-vP~+VAK&9y3-)2E(&2~&tyb?~d9eascV+6zBGqo<* zrQ+78yRhau+9ii-)s(2#i@aKsOTw6mH$dg?2@k`XCGzty6U~*Vtcoy9QbYd^bLDT# zR*+foe#iR-Pt6gbDnDsLjtCv#Cso%cmvEz?04={!r|B;DI^x6W>IEFJFox4yEPWh;`$o5u$N1dLnn!c4C^|U<6k6iyT^ZK74S5o$w8wQg6 zVU&Ha&B%kx{;@-?Lu0qPA71OV{;qwfb6?YgQ~m=}L#}nMmfEb{M29vX4O;eqv%de2 zTvl$plls@|Np3^^>v+mD+dSc$B$P3J_H_(f?#ttqve;6Fm?A^AZHW2-{^iR=>*cim zho}Klj`eS}iN6N^2v5;a8B2++*Np;G zcs?MUno=RbgZB{ckV9NnRHZsTadZE-7)Wjm$`~^KX!xSJTfQx5;UKipKGeAn>A@*q z;N;+~x@yjkX8W>LH*3q#n?E|>QB+^6UtiL%?+ROA)hE_B{S)d_ygBbagy(HY!Niv} z+7sQYRv7;2bJ6tKb_<$k6ULChe#g~QSRg>exGSMQ!Y9j4<$eG? zSU;a~LH2B$wtlRX(&gPJlo3FcE*N!6dPS@ZWfe|5@32EH8ybA9ElEPZ)FfEZ z5S_o(11PZkB6}n~2nE70_w+*Cq+)oqZJ@8Y)nnHGcnxK!Ka}z7-DSM8^KLz5@yqa(mS5<3%JUPX@r?R(j<%niew z8FXc+HD}){9}u`y|OP)nyXGO+kAW(b0*@j>BY2uOFeE-<|yRxV>%S9Fn^U zJus(Fd_y0l6mvs&QLnGYYGJohQ96>^v@^XpOVo7spB^rS4Rkz6GKz&{Q#iPu%RYa~ zYm0xtg*#y3J>4N#pY)(n(%~dx6MAN*$DEk+Pj)zN9A1V)_z}9v!R0it$C}6Q^bb11 zEjsBsH9d7el{3ljurTw&Q_(XKcH)Zh+* z6(rz%r46v%v@^R-_iJ;(!}i2ysdaaUi0)%ikhV&$$xM%wsrKSK&11Hzie^6HgO7~L zI&IFm3mp zCI=BaUKfkh_E2pP2_=E{KkF3@Q3DqoIwKw>V87yP3g;%3;RA^eI`NI7>8dq+AskPb zRfhi{Fmm<=*9AK2Rh;FV9&tSxqL=N|s%2GIhyFlMN}^?tbN`|H0lbW`?p>0?j(5{v zdc-*@vU1(el$wqnU@|}BZt*g2@-pASFZCa1Gao~Pxy;YHzwk2O>SbPQGrxbVsagKC zxy(Dq22**+h;qGekH?PqFsv1N9i%~owgS1AlT#njMcYv@`rdAw>!k9e&%hiRrLaX={A zWwx9jdquI|q;bD!XvO3MOOksi`@goV25!ne4@4-7l%1{mnpal1>XpS_14m_w53Z2&1|B*Qq6^iHK`LKP15FwMgrdB@7xy9=)AbPfZtfT?#m2T zEXSeszir?#i9e=pJ$1)F>~kLLHC{N6U`di2g2bNM6*$RTfo4FkA19V1%BMKt6VZ*( zo{cYQR}jv_ei(=Y@_pBqqG;#`&Z!^+9mGbF3`c~{B9RspipT4 z5f4r&DmXUhCCkH3;~=J@in?K49S+R$gE;;k!`#BPiey=fJV-gSS^W^(b4 zi?93p#Q5Kw5E zbF8u(JFsuFH~t^1Lv^Y{Mn(1QUH5+3-sdMgTehRI>=}2~Vlczal>c#=h$dmSQQ_HvJO+*aGC23Ky-074fQ+-L~D zZVu;GzAmn*(c#L<-5{$UEdP4psMcvK4`!Wmy(IvK8VBkUTp^;c|GTLUi9`2tw4U6y z?|?x2-$;45fq8HH=!b!h7kJC!uM8AyX0d(h14Gm}#3D$p;Jj79Xa8-t5J>;f`(;MD zr&rKo33I8>tIgwPok7k6`ubgHXOjPKs9nKl4fHmC!~EXKZ+E+4Mm3l2D+s+3HBsog_D3UIZc^O`G%Ks;R=sYj{28-mG(^(`Fi3$$JI(Pu? zGvQRZFd>|dRJb?(7#T`B-%9%PU`xGMfzP0DnmB=JJ4vdzhwG6yeN--JD1*>cA|GxFMQuuf4-0TPD?@ zLZWsy>)K5HytuQE2l^Cq{vy1*fy^vyo_?reIXSt1yV_>r8_e%R=AHyqaBOqOLBc02eM^#p{Wwt9T_yx32n*rs`6Q zD;gcndfwy&BwBFQ_8N7W8=jd|_xp>OQM#3!OUn2t=Pd4WKPjfbC7c_&zy67r>11{+ zsnWSZI9|!dW;Qs38<7fsQ?r}d11}RYM~c$6eIEtF-R5F2_nAvHa(eWHeW-KS>%l3% zVu`4Fp=A3@b{HT{K(NQ%+f8mZgCE(4I`;-s%uWnIPlClyx=Ze3nYEo-rVU^cFis9< zu9Aa8-HH=z4(jX-Mx7fB4hbWFdxybDA(;_CF0flg%z1R;_Wo-iz;=b1MJ}2OLJ|o< zUA}6%x5nCQ@uVo>R@iXuLW_-JxYAefpSV7QeHYYD^0CjL=L$MxP>@4_eX1M-%eVPS z2zc`hMgFxWNfcQ$DU{-RSEPAoo%=S(BrN*AzJszFX*9iLAtFz5YV9Oh(O0vyAC6)d0ZYjgbI!BHsdR6LvYAi+ zA$2i36vW|ch>Rxf#_quaZ{|jCQ@X)`L$E#X=h9l-R%=%9$_;{>q2GYi@{i(&f#lqz zCjY%Ztk8(^Tly{ctGF1e#I#T+Ogcl^0k7y{{>wI!IFX_!nWE-QRuOr-EVBy>I~T3R zTq-C^ii#9za!dxFcIsD)=rUhF4Y93pKYOvjI%AT1w0)T6R@;Y#?k*l4Fr9VQd-~Q* z%1nG=MPH*^KTBvtrdtJi?5)3NKr{{A<8qk(H972h0)AvWUGPahD8t>t3%NL$%Z4$D znZ>ojlekv6CNL_*B~|9Pj^76UX7M+VKdw9Z|8_fYEOlmeF22*m?cwy4kNOt?bOWY> z&J8(pcrIHGgz!^mvoy5ZPJ97YY7N}g8aN)VeLa6I!!dMsmR$l!TA{U^=EJI|r>^3c znj;U?d1h3c>rEfFxnodq z5#G8hw2cdJoSlu%X7`)-f}0Ahr~a5-#`1ec!#~eTEsQA8E;}@{*oJ5kNlejFR;#zD zRb_dLhnQm-36qt>ZLo@Nb6Lhz*LHtu55Hm*`xsImzg_$)t@3$+cdMRsOiJLV z6x&;eTJAqegw!a7Ap%hKFS1Y8ea!q|pB#J(|9|HmbDtw6)_;n; zz0h5MkIZt=8;BMLI(}kGC2vyN_i6?Gh$%mq~wcDTDQ6V#I{ z@Qa?1lxz4(pEAQBrBI8Mo#!~l*gCc1j0XCP0Q}?al zmB$AD>Zpn1zvOKGIL}RTRFYiG-#nfdN}lB-Cl?CFSqD73+p-OT8&4Xfu1q6x5CSe{ zk?bE&vVUA?&TZTFU7x^=`HI@{g4Dre6}rpQ&S_Z%YBUs_uVlL<5x4E5&cDK7**YVY zuqdm;2=~4-RxVnm32=*AS4iaVD*g)V0<$ zI-82(g;rSgc)UT^gVyEag>L&M=*?t$i*6_?DZtP`ywEzJh17s-;KW&jn-k}?wM0R@ zXIsZnd67PYc&C2-vsHgIU;kCb_5U~4iPS%v`lDX`h>vk(T~q(Oe_8)x)juy^|ES{n zPq+0irv7McvpNYZF&i-C{;l!6te1T#O^&KmC^={X|_|dm~ z{LBEGLvvY0RLnN)YkaA@b{*UZ=8(|CeBw_xQZq+z&ORIac|G_w3+_;6lS^f8r2e>n zg@TDw^=Rs;1AL9Mg(pZ=J(mJbcG<{2ZoTB6S6}U@m%UQT*del zAI!d%woscPK3!CzwFHN~5EqYX*rho3i>ncxZ3ZcU%m=FB3r08Y)wz$~@jhyknkT^V zAFZ9`Wk@cFJJ>}V;`Fq81E&?LGda`N2kcFSPq@eU`M;zAQ${9~XFuQ!h`jO#Y6uovkFYd28Pltzsmr>;c@}L(4^uT?Q(KtOnwarq~lTd z3i~k6oo^qOx}QB?pXk0jizHd1MSmsIZK=8#LrdyWuE+!<>ZHwX1{=Hjht!UM&aByB zh={H^LDl1c8gjfNYpB*Rko{j(gD{YN_FI+!OIzNgLHux~#D!|fvNgyV zZLiOZmli3fz&%h|S zkH9GKoxUE@)?c0&)z)8{_#C*FSonyPF_~|4Ppx3nu?&mhR#FG*rnn!y_fb}hb!nqI z%yK)YHmZ=*>T}H5NGWzv1LiuHUCBN<``kazw$D-bDV{pAONWqkFc~Ih+p<4Q9-W<9 zVNbpn$I=&Q`#YbV<8ny!)u?n|4qdpO?Bs?`$vkJKC$l5RdYXrZrnB?c1Hz%ySq`Na zm_ed8)q^oohjgq}r<{&D(kH$UbN)EVWOxsTWG#5p$L|^;62EMpfR7X9^ENZo2IhiT zqkV)nQ3i8>D7h~E91g3pWf#AlWLDY`8nCepWMtZww-0kDr7O)TWoc=zG)@Gm3(S6y0NA; zNOuwrdo;e(oF4uhmGXfEHs6;y+UItr7H~Vm8B$nh5#o2aiPC3yD#CC)Ay^(8 zzpzuZXvcg@B?286QFTG)gAL0Q@ANsIkLHX4QX{s+-=Xx>OJ1FJ2aWI_28WA5pVH; zmU!RJQ>cCpQ2QZIpH8|FYy`WG%Pr~lUZ*Yb2mBr)bPV>)N(d|~(e_UFncw&sb{1rq z2R{J1lF9vDE(5YIy*#4^qVGNot+O-y3!BPHJ+IomE0_FTk~zw4kol6^%ieEuUrjPG z6IgfnzvnW~F{$UG_L(`!ou5mdW|Og#oH@&l<&wXkWHui-v6y$VQ8!WC+<2I{3hj$E z;rfefqg;;x)FjcHo!8msvvY5ftO^XVRuyt7pcuxA&km@_ZOWArbtW_Vt`NKDq|l!3 z(&SLHyY&BzPneRofKxC}Td^efjK<4$U>F{_=P`3p5oY7qV_+}tnT^x4NZ_7*p|-aU z&@aOYt$Y=#5|C}nU>f9@Axhl$$!Drt`WvgaTE;Gbj z9;F_bRdyPgaY<@mC4YuFloIzuuFfhFrp3i{+-~@fuCJ?7R7N?OV9%ZU5MQMYwT|H} zr6{p5M4okPLfn>HMLC-*SMZOfAQusHJrrf9JKfyj8f`tq*^!!zdiktD(wq}+gbNa) z_JRam{d1Zs%D28$m4H}KI12Lz<0*YR6@Har&12VW9S8mup4Svqzt~hiFJFD%MMc#g z=2efxfNByX(j8BT3|rj6cW5)Qn~XV?@)#$x$x8p{7{*DPuy5QkmrD+`VK;zVQkq0Tk%KOX8usT?8_Y-qIydoy~t~&V+C&PiXR5)C^ zXjM33r5ePRL>trBz*7N~#&m04D0Sg*dF~8nbD!817BbDn$NEAZAiHaeTxKnWE3T^(~Qj;P&e!cmEd zvvJ->C|R{f5XWw#Y6&;pgjqe#qpL%ChNO=3_~7P1daG*E{)lX-HIqEnD9}WR^Jbo0 ztCAiRA*m!)X70(wU5lN3wcZB@hbeWOsB2x?OfJ12~qmOg2b%7yDEUj3zTYNEMr zST|!xo2+wmWsEvEbjfT0VxO=Ep%QwfX}bUM^2tzMMoX7P(l)I&cZ>-@nG zq@u&{PrLp%e;BTfw}un(y*u$Ya<+!bFyQZXoimv&SBi}_bXqramP%tZi3V}vFlF5D z-G+<^h0k@#ooG5@ZuwSEYU~Zr=-;{6GJh;T1pUgRM!m`1d!mor0qq~9V`rP|&L*!f z*;%$PvVWi-a?L4w(sp4OT>zL8d(<_Zm|Ljy{{q3>o=V=uQ-j!P&_w_PT{=EL09`OP z{7cN)42=o2pT&+3v&)ILWRI}k*n~x(4sp<1nb{AeO3d{4AHe6%DS&9;hkmuB3d+dQ zR$qpx>rj?Zzk*KLlV>*z__FxSOMm8{H|O+sPmoXiv7DjB1kiq<{eD#nQVD0AI-!?F z9ZsL5<8C~b>#iOVN!1zD>KEcP&JWcHPge0P^c0S18YM5p)8DEw7_-ASpMXn|68e*_ zLyo5}o5XG3Z!t|9^S6DwjsA_{J2JKYZQsQ=hL7<0<=lMRxh}Bh2)-G(ekZ*TeiXRA zmtSsL+%%|mkcZ?#F85D(??{sfW=w$UY!!mOc7}%(U$w~TeUCXGxqEIMh?hU5f(cli zQGvYF@f+%Of8|%;V^w!!nRjx09~FRA7Ml$0z$ybf@Jz7NF5$0R%|PM0J+Z^ATVWdO z7Sbg%kj#Bn%zM@o^AwJt{ZbB0Iz?C4`|+Wg&JHzs4#>`#komNDsI@Jd8_D}v#2jKk3e^wdI|?O6W(Nrjij`rAhHAOjDi;_ zvID_4p0QV7X?=R}fkre>8Q`0*7Sx)1I%1?9@Xuh(!#1!)SF*-*#Ta{cy3fK$DmvhT zF3kc(do%0Rr!b)=rYyVW)B6+4MVj#AvnrfpVX#7YqFi?#WYD%dBMZA@qB?o`-0AAh zHwX-2yW?y%!3s@p!poL^YHw-_dlRN98~t|w{h5&KPb*AL4m?Hux&ONT_a|_JlzpGt zC*&7D7Kb0dctrCRh4WPapPw>z3!gWk&zdBQxt;F4*ZN=ZhV}hV2tOp&KxQ?5@O3Xh z7MfNB+YdYF`hr4G-l~a>1V<9G>w-`1Hes^7@ay>yl%Fl=wbw6$WPb%hrq}J4YcH8d z2mLnTr!p_F-*m{TcXh;RMMO*X5dVje`U#>#eAs^{ohK3nkI5Nf;!qSKKyie9;!kH{#1&Jp^$nS@A1NuQxIrlE=I0{p6RdwE z5%yt@^O5FFfa&hyNJ$gBu+Is!t5fQ>7bVMr_||qnOtd7$vOoXdZ((Hf=L=&o6+-i7 zCe7l2G>%Mh|3+8^I?m!$IHWBm`dU|JyTH1IEQ*g73SL{mjVJ=u{DTEcT~`peQHC}x zL!dv|eh2|zoMFM3zo?+ufbluIA9}#NsJY7PoV~6N$l>H5pXw7F= z+K~MP^$lGzs(EAKV6kh%VL3Ty;tQFBtY&(c$e)K8I_8@vyF-j$>{cL?yj$qKq=e5i zU$~89%e_THA6(|StJ&C`@|(_qcgoA4cmQ_)SRbqc7en*J$u@LH{(>K=imGktvnj0& z7%Dv?+Y6uHhNu4=b5-05swqhDc1ruB^Z2Hm2~`(;ocIC;ie2Ek-04@v(^s#GV?2Z$ z#OrF5oHAmZdW(#x8jL;T8jPg)v;jtsqj@&mejR7S@FlB!lQmUqjb0%k*0>Il08QWqK)TGbR@lS?O|o zfqXlj-h#F=cQamL?z<0r8ji1k|@L zDTdNxg?*@Vm)P<(rhHE60m7YY%G=Rh6!esRFe`*Uxl#Y9mqtD zal<_%hw2YZ9wL`|AQEVo@)93Tt79%ODjepEvu@}{feUqq)2JhxQ1i`J`;`^+*|#EP3t;b|NXf_bQRS#dso zXv4u`Us&i~gQ>I`)gkqRg(WD34VGXE`=G^=t?qYD)f}*lzGWZk+{Jou$`2z_c=0lt zc@rjuFC-6bJM{npm^m_i1sF}0?w0q}j#ik~zo@$%g&l!R3&*4xfS~FgWNNoUvr&54 zj(AfGdD7HMzA?Ck7VONW;O5E=LcY8iI;2@11(P7MG3O;CM&CgOb5wLQ4=A#dBke(C z+lEOj)eBfi;I~dZK<&o#;z?SlDBqW2m~jQCujz%xDx)TzUQAS**%jJYMjAB!e^`4P z_^7Hg@joFG5+E=MFA540HLcO8jm5Ua!8R9WbVg?cs!_C}*jS}i3qnS4%?oizVZ4mR z)~>j_t=Me~u5Qt~tDvpq1xWxUfmA`Mf-fyM1O;@L7e(gxea<;|W)g6>`}zO#`J9|P z=iYnnd3nxrp7>jBaa6pFlbs9Q8Jq(oo;n=DMKDG0@9A`qL272-_lJzO*7|2GL) zD7k?dxn0oD42&B^U}kr2`v_;2!GN{ZE~;`xa~J`dItF1)$dtJPG(u);wB zIr5mo2MExL1$?U}$=qypA}a560_3vUUQRAMd$9=87-k8yQ>tCo6ee-!K<|9+uZ$g6 z?DrYRmid@ip#;*!}j8mMf_BN1j(Ld=NOlpI#B6s z(bM|b!!Ei>+(x^=7k9~go`-u}&CM}iPR$KGRcxL@q03@)vQy7~M@*m3mpBp_8#dRJ z$qQc<6}Nc-`KHr-qg!*4Ww-VgXg1z;SYT)~@N;ZKxokq>b|Y&68%QNm+Fo<7RDUELl6jx2^7LDWk6i7mEyt2&S`f-UPK23*kd>A!h>Z zquV3d7bd2pq+BU0d@0j2DDzjSe8};gPzTL2SNKcpa>sVNxIz zm4f?63H($Vqu863a2B6#-Jfy)dw*`FKi^}7WuongHGhzaNq2;p8rz*aXQ;khCiCz! znU+~H8O*QyoH&I|)(`2{2yly(n1*QNB2COFRG02pWO|@8Kf$1ZEoz@A!>KU0INL3h zE0&AdEQ_5JSa$H0R5S`>@0(r^X(FRsJ~>P2^@=TMOo?vpVC258<$d*>U^;yp`;WfDbh*VhpTXS zSal!5;|77cLhZMM#T58_&&BcIRTqFyNN(8#wL&i~o8Cf^a%k`Pod~85x&kWlqa?>^ z#kfQ5iQmy;3CDTXExCvzSGyLx_TriovKE=&z`APzNrNEkB1cDC|8l z##dYR4pdg-@Dn%o%(#o^8+*7tVo%nUwkK;5yLaZq*u#Am7ke))MHBHBb+XTIs<|Fv zlYFoKbkM?b>NEPR$Wb|u+tKxj3AeJNr@ryp_k5v7!E=Q{S|kG<+b~U8jVDL_R6fPT zeCZ?ZJMPA*Uz8Ocv^NMlBrAGaz{VR&`t4mTjB*!JzQPwv0Y2u!-a&nh zm!IsaFnF>B<6R+hws15tQ@SYMNotnUX=m&qNl6E3t&=;2$rAUW>(uF2$Y#aP;lN~5 z`i-FdsQQAa{gHgJu!Pvy{b%M)-Wo+`i!1OQsPSN`HslpGaULm@Ra36P71TWe{4+7D zUIojUsFjXV&l`C%ir43>sJk6SE-RvTi)K7OOH2BosaILuX$OJ6ZzLT=d^#)kVnpLwPu>h3O^=Vwl z=r{8xW0zB#x8hyH0x!->lL_`>`@l*bpYaGrbP3qcMzj{H#(<}X(P z?f_M6!$N5&iXn)zmDHPq^{MYr6qD4g;e_!Rvb%-Ko9JBlu2iz{<&*DCa|-pnCxil* ztyt6wYb9q;u&Kr3%Fh%{3@~LLdq?kB>#iMREy5Nf-?41Z!?As1f%bvPR_xVr$b*_g zs{`VhhNK_m#xGjLL$X!5Tv`MLXJdSh%N zAm8Z!38`J_i!yWwg33E+a>YcqdMN!z)o@Gw)8Z4Im%b@q5b6L+yrcwiGen>-`R061kCS3v}N z3Nz-;UE1zk8ZZm91C72xffqD2JN9M*(YW4@=L-19?tO;3fU7FvLbiyx&}07i^n9gh zJ`Px^W3+Fl$iqR}3;rsoZ91`ww_BJ<*sVO~o}zsQr)XD<99=g&^Av3BK~9=B;gU%)L-DD{@}Zy}`ts*|L9>l4ZBk|KDUM)CgA@MMAz37bQIX=#6K)0bZU|G&Mm?E{)%vDb*z6t|Uo*U8U zx&OZ0JV(qa>e}jDce^S0mM|JoYhoa)W{&yN8``l5)I~j8Ah^=s`*%~1Q1zWoLpk$H zWedoq(mCq)>&~6z0*q;@9)opRaSC(F_O2#GGa0>axO9&y?2En>ed=!ifJqkMhQBuY zD5=EIukL+dOWzlLmAQ|9rjf?M1c3iE2jE&ge4!Q!0Qz5CC`{NZC75(Bl3cW+Vp617 zKQ!||#_V9?@}2Jsc;3xgOI-A4t~2dBLOKcr!cL^X{Do9Jh8&5lP!0C(HgN#Z3nxd- zhzS`f0gKwhkV(mnxOPTy0^=*xJdc{yJ0ej@9aMjQR`hgXlIE@zs|Px%D0#Ml@3j$6 z;CzoV2JRGMNk)scF9Rmr#I=xy>cu|qxI>?=rT_RtQ0L%wB${O#H_-{riIIa6R}E@B z_8|3pf7u*s&d+Hz#5?aI|3u&;o44BM^J#?=p2(*Exr|5rdvFKhrZgXQ=C%0~4kO*n z=NC>(;*&K0S@>in|CuJTQE?X4PD}G~RGPn^hjChZ;HX_e7Z*wwotNs2tl~1^!B)yQ z>}lE$1O)wV@0oY)?Bfg4E50BDlWk%b8L~T^m%#EuzdXyE36DTTmTzbM(8QEH(H|!! z4QNT`G=7kmm9?lYFS#YQxB+xo!~uyn&9y$omCxF6UR{XEHoU#l4YM zWDqhQg#L1`GR7Dd$8T?9kd4#vgiV6~_8?$xu{pCK>xznHXZQh*nlS{`K>4mCY7jx< zjI8JfS|=N<-X^5_@SqMKHrZZ0TB1{+`H#@kk)}A97<&B&KvYgkC_W(dsDHF4J$KTq z#ujlKZ#;$uHOsr?goj>YC6XBRUmqP!+RGlyCxR@8J|^FTX}+I$jWEl(kC^-^led`s zEt4NJc@g0(<@qrtpKkJdP2OnoM@;^t$y-eRp2?4ye9W!7KFj1cn*4r~$4&mE$)7X% zTP8nd^7CiudZwHFhbC_{`I9DJXYy?(KV2Q?2W}#N;=c{9cnkZt`^|f6wHHOrCwaX^+V- zF?q=3KQwvV~uA zLMFe>ldm)RHk0?5yy%Czo(hvsH~GCLf5hZZntYwf-!l0zlMniluIGG{hfIE($>Szp zXYy?(KW6f?@6zvECcoF@ag(nz`8JdHnEaT@FS%R4Ki%X%GSz}(&W#Xyv5|3O#YV1drY1^N7pyT%_Yqy%_7YpO(O+Km86LzdAFQY zN-8FeCKZzMNm-<$!)YVQA?+dUBz2K8+t$JF=6+>s`TZ9Gt7?PtpP>^h#G8GO# z!yhWPKOf#KY`+x{Etsf<@q)|uKDbh@B#dLC0D8dF8usm6FevET?2TdSf$$u;%UF)3 ze(&hZ&`X8{PCf(?yD1??m(FeY!$Q%1_Un=ky?Hz=43|? z(AoS9l1I2fF~&!aFt`PeufeUW@mqaII@{vps4;jPf=G|S&&(Kv6JymF1brO~a>Ks2 z=hp@}fhG2V?z^x9>HgDg&nCD3n^iX_)6Gp5;Y;bcrzPEeid*RY$%UrxC*KJ8w#@sb z7-7eRfeDpu$9`o~psa=IF!IEp?HL@rBs-W0(f=OlKf5jPis}C zu~j|lUz(UwXvNx2^@5*1Jx-tI<2l_zmqIzMZjb!Xq%RZ z?t08hM2NQ6I1p*V_Sn&3-YYlT5<54!>7~&yPO)PJ3$BE+4JUHX_~0lpf|f11a9ke2 z-8z!*y@a%raJX$R&7i}QKM4RxE`CRnKVfoF9LjG|VURB`rG|4!pN`GT`ka)*^$^ks z(wU}Qp2NcdZnMF&q+Cy47VuC#Kxq^B=Uv zN?h?p?C4{<`yXW{1NN8d3$rnOO>coGN%y z7tBl*Ok>;NiEyf5Jpe#~FIDide&T{u!A0sTNU*Uiy|Pe$`6>P7+?UmS!O0s5HX`pD zQ9{)!%~UZ87x>Le8a|!$ebRi=V$v^2zaw?^OEQLtl}k|`T546n@@EE0PE6K=Qw_W_ zIM3}igY(C;&ESYqHg3&|#6@KpKpbebTjA_;19y^7i$DGP0rKlk{N<$;4C{CS`L zcoKQRW&b_(x8#Kl-yJrceB`p(x&KT)`sue~1*LyIAZii@`v(N)79=*he zqR;DO=_^@QF<`9vd^#5{Y#-4J|Bb(xepi;5ev6WjPEUGQI^Cfc9dwq2y;L`19nz6g z+_>z6FS&7O&&fBoI6jX6Mh8ni>MhLSlis2{Z{gKME1Fv9Eu2#9ExNMU`N!evp+2qH z;$)>>z3fY0r7B$3v8@~7^#8iGP7n&4bf0QLE~$CAwQYIDxp`UNCEZ0@O!_5hC+SSa z>Fj<<#@||N#@iK$8Q>x)|ERgU%pgDO4l-~G?bc?gFUr;OUvcYH>9>?W-7m@afbYir zD`gVx+|i$VT;D8_;Z0~p#(1}&qY&VamDwT+(L+)?SCA8$NG@vxKLyd^fTg``B} zN-A|a5gs!!Lq+Z@PdFFpno%FK709?S1` z_v=J9>q7=tS|U-{c3U_m7WLUQ`4hw)|+Yn>LY(|``;X@3~sJZwf{=p*mwU+ zHTK)m{!4XHnQnjC|I~h(?!>6_6wMynui3=6FoB3AC}!fBlF@97EC2`En<@C~Vbg`C zE;T1jyiPos53xa!v!+U9638doznCR2uma1i1bQ$|v8wq>Y+nvxKt9W^$xqz!=S2O7 zz2jbnp3AaN^p1R4$o|9wXY>w!S;+hKh5WwYqL!J^m`awnUrdc%Bc~Vi6;`wwX5BcpT43_k>V&7Ko zJTg?MO}T%by77y-(nYDu`P(q}Rspw&pCge4ioHKM!4snRn+RXk`o_`Z9m^+dpZJR( zQW`y7zj<>3Z;Jg}9gjT0Biiko)35@!}9lp+oKfMKA0# z_J_>4L~#Y#NNe8fKAMyvDE2;h8jC{1B_=9~gaC>gpAnpv2xZ5bB|c-KNrrNx3@RZT zH>x7RDF{qld6Btk#oCk6PsI=+p%xbC{K2q7D6;UB1wAGuI2+GwyJLC71@I`Or%h@h zm$b4hFY5);YbL!RE1AZntngX#V-`QQ9gv^1W%Xl9fRVZVNn_F@1G3~!ff*Ep60CGe;=)OdUn~MJ zyi2B1-gsh_M6Ql+dJ+!5Q84Z&H~CF>xEXPrhKkhf;Zf}9($H#l=l3A$}cLOHL2SDc$Dl*TTU z4q_lRR~;=T_B!$v^Dq0T%>SX({L8dp5Vc4;i1nK2n3r?ymzds<)#4vCZ8=ARN z$Pi5PE*4)v8AM7FmsT{MSj6x925Z0Pm$(i?Ju}s^XNyr5<3G#UBhxBZaP^!K62zAD zb&B}LQmPT-1bIAm%u|~iJC+~KT}PidilJnMYQgJ#xH4jI5TnUym>0@iFjH7i0+EDr z*^0qSsh*(XW0)g;%e={BK`y1G(srpry~(7M^Csb-h&F{=GF3Y5*b>O#?vZ9QxO;*~lMG zs$(x56898qt`@IUC+xQ8<;R&=ZuLKqo@5kVLU zgb_d(`GYHdIAz5(71CNQkeCAV*zdbFXQXd`_*QnG+lm0rd>;A44(4m*CGhE_=SYK@ zo%2bV`1zFbIeq>$F-$D`SOn>ZSS@2;(gsd}L5~g+r}d`)$9 zJ{(BQE=JV1;+qC~tyd~}!y-JuPbA6)2p3y%F^}qC|JNTFC+~|X^;YLxR4ckLpTfk# z!k!*p%BbU-K6Tvw2OT=z+w_*SPS^3BwQk`C3KI)Q_WZVQ9fSFa5eRsQ`{@Rqj*MJ? zds(`&R`?NJxIk4lRt09rXwaYNovKXYPNXZ_4DYDl`%b#D09%wUynsT>{-S4yYS|(^ zLig3EiU#$msE7g3??@mNWen`d1%q|{r}|d(Y;WN}3dA7KTX+pZ4#LG1UI8N#D0ZI9 z21)J|C&m|eE%88k&tvknSIjpToF(Qk!$7KPT3&Y+Lhs6K#UA9b-XE(LE#S>`*Bbb~ zZjm-5=P0A=O^Y@N87U^-=YM&NXd!$P(GhpNsUD_fV|jgjCEvpk-tP35f#6?fC;v^A z(1HO8v-=r0t=I{aGR<<8xB{h&r!XXCg<6n`hH+tJ^&PntFL6 zm7}_ORca8;&Pcf}>buSQwtTPD^1bPO@LrJ)`QDsgW^bmK{<2R9(7K$+Jwgv&dh=4N zVbQ(GZwBFnqWkdY8fL`PDW2?Rkxln^3nRr=818sJX+|y2a&EM zh2EwUG{O7APcnxGb5TKU1sz7l=1eqbO&zbOA|+*Y$l@>}OLPYlrMb5f7(&Z5A0MFa#I5_k%{UnCzC(>2awtQ(7Z{x7`C)HsiaZJB2U+{4ISLuq{5P8tplz1}z zu$~yL1xa;c0Np*8j5{mvvAZ#~p%khR@B1|#4n&?=TlS&P=G%_KV1S;R&n?DBP# zrh!jc7^~gm9CZy%ph*wN9LoD#2@X8jafH9UjK4;D-mYoNP^d~ASokn;gxrK2c z@k1&LDK{@VcbHqR%3E5#+}56z)q|tD)Z$j|WfPGa2#eOga?dmR7AC1u`N)jQd!E*} zW~VFP_*`~YPlc-Gc~iN#^)wI*Nb3J~M*T8OGC4 zI1iZn$obu_lu~Wa7WtjX{Mvh)bWLnEsou!f5C){ac9E%#-Z5i*O?0??t=N2RsJXvP z?(2bjh-!Og%5U>Ec}-Y1Y2EAl^*3+kw<|LrsKxE6SF*(v3UQ&)bHg#sL0D|C5^unWwbNv+qYd*GYs zJr%}6lD1YjPv^pGU|ixa3uO=Ks!)P@AWea`X7wRQUsHQThLWA}Dd=l)kbYO;>+05E zvLlH9!naV9vX$qDj=YuOPic8yAiz~6Vz8p6YG<^TPRqVJ;mHnRXC3r))xMkYF)HkT z0)!4yobo~7;2Md*MWd9vvA1YIkVB&(iqn1zm|#~@vMF7X9g>%9m^{en)SJ30xX5x^ zuO8-13~v!s{ft7cgqXsM;U>Hk&IrVB!izzjP<<0#3}^WHE#Kt+4DOE(D7Waor)0>d z@OrqB=g0WtH}XEuOWoo4Xg|-Jj`A3qAP{R(?5CxjibqQgic~W<6$4t151`;C<)Tf< zvK65*baf&2li-@+!Bde6O|!*>rg=HUJlMI1hcY{C-}E4LEQo1&a@5(==I4Gz`CLmLSkdzLKr=UChVwy8ce6tX8;N6CUu4Nyv z>?HGA7q$<>Pvod7t)&B1J(0wH*~wR(Z%FM&Y3bC|tWF+Cky|Yj!x0O9*u<-t&lZ2h zq!{zLt!a~GMh5F`6Q{I7g zg(=S|NKJVG@r2slo+d|K!X}jdEeD3`4da_(@sISBs|~~D@6!9lFzNAq+1Apa*)Iw% z!5*>p-BY(>vTjA)kjz%FWXyPTzH0;)H1#_La{c&?V0AWbxN2@0++4rCrMJX?SBG}6 z!QhC)R;*Z$c-WYDio`F)(dL-Fg^0*`pcK$aDlDS}@|>I~kOim3CiYgC;l~JY z9jwM=gz$+_8M14qi1(gQ%Lw^}VhA7;9=}Z(D$^Yt0Yr$sW7N*IMi0132MracZfZ>s!J&ky zF&bVhTef#kd;q>Xu~v`ITlxa zxq{#Z74-HX5_BT4G;MDnl604|Sk$WGZ}+ay%xq+`d#kOg;sKBM;SNgG_v5nNv3vWj z_0)da0~=x%Vzgn@=If=m_=|Qa6jXiQ;d2-Z)XcG8wp=u{oDytt`!8avN^?HEQZ|~s~ zgk(KjbEzDpL7-u`=B>^jr>L5bn}T6Lz#+ld=m|`>|yk394FZp z+S}|_tD<(%@n`|K&WaCHSgsec%45Zey~ikg4U+v6#l#feTvE&x+Fv=VqFB1-EjsfP zIkQ47!g4OJ*DYQe;hq^CClIPg*>&WK*gF|<_o(+T2i)! z?){TQB{lkA%N|1iJRrK}fSoNUP(9^qsr{?vYpyHu$A`;&at}(-*IawRU)C0gL#{}@ z27kErcsmJ`y}co%&_p3)8nP>8#KE_LcrZT@&$lXq;0ihEB4vN?kBhOmYHyJC_Cc+8 zWwUQ}`;OLn<#QVU^?c3-;T-0l2r{0bD!!oBBI}UA8f6k6*q=jRx8We*vF>Uf>pSZG zMXQz5+a zD!ngscJE1cSZ8ax>?}=}-2r?DD#9mIW*&cB9XpfihYPoQzJW=Y7=p|xdQr{*pYV|~ zZk9cRL%s*p-NJ@3BPTa2QB|lpnG_TBU_k8@-o;3!*q5*NSW4k2djuc#5R$y^YdQ#w6I}oe_j&$*^!SElTNcov?Q5NyS>F3 zpK~;4N5!?CI^Nmh%sr~#d5L#oC&tze*8(Mk$@Ib7^snT1wT~@3SaX-118GNREbKDC z*4^)~7d&AlHH- zmh(#Nwu+fu-iL)y09rHn)A(37+|M2f_tRDTanIB8P$J;akfS6gKJ#E0oVECMRbJ&t zB!^r%C=l9+$nC016Q0QK<}>vmA6x?#bAxe=kIff?R$9|9KGE4pj3$6Tv+dtxfj83q zcf%9;r0Gum7@947YP!89JkiHO0h|Ul+K%&iMs-7|4&x%*3^We=GSE;E>4_rtf%FZ? zOH?@$&dDKQ4D4=Xk3>M+R1?C159;7OSbn+ zU{r?YDka{OE#5PJ`uLK`^eD>J{51IdB9Zq7xMxh!iz zn8D$^>HS@KbuEgu=8Jmo4)1-h-Qhj)>K)!)yuEu1Wjjf{-b;Ak6R*m{;YEePSTm2y zqv|o7+~#!g$hIK6{2HF?*6+;U$x|n|BNfcw=}|u{Z+%y=dUMFPxsG|6T4*&+iqlyy zv`n_;4Kx$w1$u_t&Nm6sRntJ@T)!1W7aDQA>%G-9}M`m)=$C% zLg8ci&g7<%D{8Jy6b#1>t`SNh=}labZP{JkD>izs*k&Ijl0|mNdqrE=-Wl*6s(o!O zxPY0_AE!5h3I<6x80g`opPkx}| z1|E1H`HAKgGnd3`5xXTUlHHzetf|15u731wVP^+9Ll4Q86_r!rXrmSYps>`qUj7Sq z!^EP-=eGy5a})8ZBCF z376zoT`T8xKPLvY^7&1~53+~HBMpquX%a|KMrdfl`T{#{c>r@iL9u(d1f%Vh@TWWF zTFxE#O^IMbSV{?g+`*;a?vWX9R+pTG`$rWQ$xle#c;o=;(s+bJXCmuKt4J71MSe3I6yXiTmE-K|k@a z-;QE-9C^a7LoWBGKYq`P@w)ZS?WO_Vrt|qWv1->q*gzz)OfYj0GB4ug@o?D|EFm)X zF9LP-`Mw=^f)5WDHkDz?PJh-8j4h+%GDW#Y^Aj^p z^!yGxMyx60fyaXJLdB8Ar{#z3J?&XSg0&-CCyPgyV9o1&ShiSVsJB~(bF#fn0(opH zFUsILL%!mU`L7XK5TVQa@KW`3V7CRd*3|p$svUmcj+)b$B{>>G=A_eE{8e77JJ4I@ z_touf_;&3BCNP;xIZxPhRl+ks0)Cw%^Mb)$>x7)Tfgx?&=D3M|BfdsXQ89ligN@)u^NP#-=l z5((9NEUu;2CwTY?XK1R{?@}uhS#KTolw{W|pw~Zjd%eW8Z;A7;3>Lk<#uwe&FtK(a z)-1B&7@3ml^Ep%kf#G)9vQ>Wz=7n{CeOr+)=|NmVcb7P}45WhjP0Sd#_*!I%Qv+e9 zi~m3|agZOgqe}qICweY$d(70Pd;HVh=VLjt>t_89QOvqb_a;7W_`gF7AP?q z%;6Y;|E~tiI<83+j9G4T;z2>ScZt%@KKMAbSxKa@jwj&TSo^-+s*V}>F*VXe?_#Ng z76FNBK3;S#lKH4xr8?TIn(}e|Ahj*hg0^&H)?&4DQe%KP8uL;8<1{8rV}u^F?1Joy z`~~CY6{XtoYVE$B`LsZFtVhmsP#@^IjjMp~~`B^W3TEb2GcWKT?4FqMp_#6dr?K-QO_9HDOlyWM6H{z%r?cs=}Qv)}9f4x4vrs$K21``pjTr=2ls*6TVse})w# z*j7Yr%An0%NgR_FSz=bw7Qlf8&aos{^cxd*^3OJtFXKJgF34xRhs_J7zQ0j@U$D&+ zeE$jO@f2vwn$!!eYDY~OH)W;Ca$n+YiZG` zmLG%{+nT~SjE7l&Q~Rtx^%41?GlbTt3D{{C8013)5EQ(*I8FoYKm&(}2O2KVf^}(_ z&+_kC4eg(cCtzR8Ds3fnIRhYGt1{rv7sILDX!#~I_`SFSdtc3|v)v6(0eYT6s zE~S|?O2`Q{Jkq+wKV;pd_G{g~A(rn@L#20_L`nXVc5qCPIf;YQTP&Yvu(Ux~!*m-2 zv;w|s^J~t@?C9q4baW&`~6mOgR-d2~sSgvLh~$mdwwe9?eQCo6e@w{YeX#I#k9c?+}1gGg#eBdMK69#}#w zQm!M9nc?brPVs+rYxH@ftN4{1)%tY>JYL}lzh(y@e=|Yrj0??OJ9j$H0vXiAL;AgT zdG8`Yo5Kk$YXI`YGW8Y$s@yaCzI7dMiOYx(q;dkq*97|)LG!puflgaj7U>%l1p81)BJk6E-iF2H;Vl z8z4fBuj&Te#(VtCc=a*$swS+($j?yTDOwzoK4@E<^Cpeqjh| zP&K93!V9u-uwf~VU&c>`_P{d8O6t33 zX-0K-W>)t{I9;lfSk(x%0WH#6?5P2;cwlvV;2Ei4xndYZ+ITpRjYjmBV!i+f$+WB) zt-;URB%xkpDrXC#$(30=Q=jbh@L9YPw(GhqsbI0FL74x#W+?)H@9|euEsu@>e=k)~ znTRZP2A#n(*ZF<->}O+lTeNm3-qTtkv{3QJ%VJ~>EFVmV-~=I|_*LQuUvNzLL9R_ZDiUnJ8=jPq!ab+J;<<8_#wj8d9wJ??0# zoo@pmy;Z)b%;W<0-jgSiPYDBQ<}ri5b?Hk#e1(}wYSfzXZ!t-F{O*ET=kw3%xh!FH zSGz;K+G%FsdhhWgyeXB!Vl|t85*N^ELIka4I#WDP1{LIyWz9K!pbb;%w=WEKmq_}DbIBt1qw7;^>bJAiYs^_;5(vu#a+GEx$N1l-jEu%T~Lo=z@BEI z&X%FOAjK~DsY$I&?~>nBm-oS6NfR>p#Wuw+-XRSaeotIlU94_JFb>Vfl*PjbISg9Mzc&6I=?NnP^6+Vzv(=4rV z&R0zp45wMXG6cOj{D<@}>eoD%v3Ju<({Eqz~J|H3M2$ZO~jV#qoEA4%Wxdqi!H47*v z)L>55!W$Q>0wgQd@vnM%yVCsSWX)d=oj1e9tJ{^lP<>Te;9N!HG7zJz2ig5L>M33; zxGs%ngzpG|`b(2hdvzqv4dsoS5%eX7}NbjmWtNXysKdE0;YZY); z32@8Dd;Y-`2jf*Md+yUeR;cfZo?v!QwJAzLWX3(L8ab^VZwEXsG@p-Op7_tfwP+GhA0sBAE4;n9(7li$`VxMzsC0Bm?hWvo9J32;9pdSjLRNO%nP;G*D>AlJK zt%gapKkU!%3TIHxOaLqpu2T)8uMU|Vw4h*KMVjZu*}arDWT`r-TSLm9;3PC)e~p_m z9Pkx01bwG>S&q9U*oRj*?vQucJJbIsM zx_fE{ddlddUYI~X7Ntrg#1Qpv29_$l8HQ+SHecDK!QV6FisP616fE>kQJI$eV8o+xI=6yr%^M9P*K3v`j z7e=U`P(gV5@9H`d)X|rxZ#!FeWwuBajw)dKjX584lPLB+svnV-YZRzj1P9u=lchOn zR_Xy&PoztP8=^un{crBqf84wn9jqC02lRd4XWCJ&hx@P$w~ulo%9b^5bBm1~>#hp9tc8#jn>LY?CJ5?((*V5&qbPg6g&y7IMf z^&r1*Ff#71htcDOB%J7`P{OlFG@w`?eYY@D)@2u3zL5hKoHlQmtE1Ue+baP%f$?OU zqI*&r)v(=)>77leL*KOgnnHDRojm93^7>oaP(VbdV8i0~6*bh?PKjVI!U@OVT)Qij zC=eo`{_coH!IxIPrgG=~Rr<=XO7Kx* zZ|3@^PB^U0l4Xw1k>}(0=EpCww^m&3sUNP|A7{%I^E_q$6??#wT{o9W+xizzmf_>Y zIVWXPa`-G+G@Q?rVYSSHHlAay>2muN58EygGIHw9bvaAd-Xp_4twx(KD|$g|s1GY+q_!1B81}_Sq>TgVA6gD=yZ1gOnJL4)itPEWi;LZb6`#MX+4ekwt$s(h zLjac4?2G=LBMG&GgqTm+SU*Cz5H8Aj@Iq}S_5dTPj-?WVy}3fxX*05Ulq*Z1n{Wid>DXLlaeK?H-)l>bdTE?CsL3o<$Wc5lWQVM0 z4AuGPLT<4+*31o8=ZOJoIW$j0d2J}jG3Kxa`ULJqF-Sd=^Jl|lo0Wih5K7Cha++eS z2c_jsh!DFo5Wgiqn7}fdI8^k?SwC2|263sTA9B=HR=8iwBE1gOzYhePx^yeswY@TQMkg7=ZCJ1Eii;sGTl@3;K+ZYp+1lL|Qod zR7MLT)wKs;IT*oz!EOaIy)GJ&Ti_Y+hgd8$^NT21zK(`(c$fW_A7V1gDTzr2B2n;= z!X^=W8uSA}zD5qNC}QyHgt3#sYmvdred#R^1`=ZOAdI$sLM$GhxSqmQXUDVOLNW5$*x}PK_hoY zfUyFE_0He6vRilc4!}j1qEbxPu`lEl>-dC<`JVdG8T$J^>sgR=Gv7xu*to$A2>vc? zDq))q6Kk_5j5wmpJA?6ZM8irgAH>K(3*ti61KI;0$Wo3+cQdvq{5dP7_bbNXMA==Z z9Zm|geTDWn5lfPpb3)blG;s*bw%+k~b%~EkNX#N_|I*`}1tzAF`OA}H&l^4FFWZbk z$$CF_AOyb#S0$>}i|ye@uPafd()~r(3!U6cd!%k2Ulp%wCk#5)YKf{IN&k z-LqV73$Fv13&X9wI@nW2iilwzJmQNm5!f7InVw?eV)Sdy;s)d zsY-jl4F})1LZIeF;vS0xPi&Y}jYizlHgB`3(eHzWCoZ_sW}Qdl1IAopy$mEHvfilz zF6eo$bf%%QwoaOE^;fSc!IH4I()7OiHL;h#LPb{3n~MKY)iUJkovRRW=}8imAZq5l z{)(B&sE7)V@O@Opkt5C<3rbG*}LL_y>@`ZF1_&zrIf3hgEoZGy3?-A_f5`+XkUPDn0Q)U=q<$eqVT(* z{J;?|B6+wmgXXU)6jf5u%p=seh2K?q@vC?*(je5uwJ9%-!oYfYsZ+Ug;K_l(8ZWJv zX2?sOc$CP{B5YmXJI)`UiCCbDiI42=X+#j{PI?X_iA?>)FCni#^{VaU;y?E%uWx6c zkptfPp71D!oXz@`&%5Q7Of}yn>XrVRmRJKP^eY|emCQ}+#3=bZ_G|R~5<76DFZFx9 zdX2kwZh}_@r4JP9x7V8-wShOe%2foEYm+E6yzC!x0Jm%@!dnPz2(Kaghl|J4Slm#@ zn%>i11-PGLhi4b1%;9g_q|M=9ml~>17fJ@wq8wB9G9hgcyw5LW^ZNz2v*IKCiJKVw zsfD3f%kgmH`r~LJ!a3Np?^@^+KGuadG+z-+$*q<>XNuLh-LlQWBp&xI3pxvT7yP4e znR&||!JZ@aSA*9J9#%x1?~S^VW&7}S;do{IsGYA3V<>peo(dGvFgz$&t7DX@ym%3v z!b(0T<(*dvB_-Z&LhoYAh*yqsBCziTxVGCr;{RK||BjBfMB%Ay>G^_s=a!!P>8~OS zu(KE5qP&*)3DXsM9s(FOHE?Fg{)fU~*=Kkgj`TtdT%0Bb_DiK07P8|A2V361{vQf9 ziqGbeZnm)AU8%W}3qzl~{vdrl^NPir>X3bz?fBXuYLp56d){jfguT~%;=Sf*BARVg z%=Od_*O59J+x7hJpg(^5OgS_Jx4ljA2@xb|SmEDL2rBxfOkM_kVA%thKaZ88)Sfx5 z$rigyxieUCPIPGTwCo#;h1*-cFKQ;@5E`z2BjRhVyC{usLb$Xcb6CW=dO58py~@M2 z?^y97nO4i!T{p&G_BK=&?nP}zQ-2xZM&$1QWu}?Bpg_3s!G5ALG`Z%~AjiRZiG$m$C21eG#mK zBla~S(3ucMcWS?z@~6rQVbpAuiPMCq%pC%4ve~k4d`RLcz3unyuDc{$)?$@?PC&)J z>&KISs<&{v_)x~B{~{SYM30xOkjlS*(9C$5p~`SUlkv)2DzZ-I<=2dG7m8UURqPS0 z5u5N8tW1H@iHdlh@DZ6_FN%78_5ZqFq&8*|82-|t3Kq>b-i zX2(oMa1Q+}9qTr)&S3HpjQTzr>BFg$Ny(XXChsmpFS)G}9dAR|KWs-s$VE$HKhhj^$IDJP%=Pp73Ph>(qEufBNcd^_=CsVhagu z{}z)kCiYPIn|yEAZdSKtO2rqE|0Z~d;JfNtL8SO3)q^-6DK2 z9?08k1|_%KZ9QRHk{tEBp+X(>e1{*xQwr0dXDBfT^85AfJ@~2aj0bkB!tOosK(}va z-Pe(;?{(o8JWm#tb2TnKNth`BL@8{!jiZh>g zO-EVFI+Ts(Ldi^q*2G2Yhy^-UfCk7*9mjIGv+)o4rk6u%4paeFq?OA|N1jI9>~wKpq9!-?VXB8?6A>Y?*CwE}$FlDd*7;a4w3 zoPzz|n@-0c-DiHK*yg%9e*06i9_?WOorbtkjmH-8r8)%1g!S0!Ji_Sp4lzG!#=!*K zk}tF5ZMuPK{5YP3gl^iJtlFWAD=Eh13j6BX)v&O;EzXbd)pdIlf1+A?v^P|JB$(Vv z%fLOC9@6q4)+dHFy%kp=5-BLL2NKZeRX@9jKc~ZD39xeNihV8KNXzB292(Gu-3P|} zvywz^b>0!%DeQhT%Ql@wGb+xqkK%aeo%(A0iei+cP5;VR!#vV;Y4;nUYSu@A8L5Jf zR3B=2jCO}?gn=}Dnb<@0dgMho;5+S4VN2VsbuuGJCbsy+z3=n*%uXAx{x-tGAYi~n zsaJxlEan;McGaCkT**dqbs&0fFm?=mEeB&zKDp3ZCtIxC@!KPp29pR6BRC~(59Dlb z*>`5_eO{`<=Q=u*UEoC;W#OJv*7=GclkWE!&m;aJFi}-^`s0Dlfba7tX0>%Y>`(2; z8h1{;34tm-uik`MO$eN`=GHjRW0KJ$Z4}J$YeJIzD&xJn(+w5R;pzF=rDD>OA(Nds9# z;^g>kUv!Ii*;!0TusYCbvxm9!H?o7a+mrJv0x#MFD!sqh*bjit@tcUci*P%*P1%8?Ey zJyZ%xT3~;Uarhd9KUM29jKi@Dr>rP~R0u0^U}e1!4pYS!cuoB|IKTGU&*Nherls-Y z8t4a}7TRGl2rz@Jdq6ge_)G-oGuJStLN45q+V^iZCFu*H%GV!#@Y{G!09HsY6p-G(&iW#6^E#wF|~( zY1HQN`yAQo@cV1_WUXVRWzNlx0kSLZlwFZ?+)u#f1^MjE@3jd5Bg|x_AHOTy@S}qz zWKXi^c`6OZZ!eh$kriQ=$rAcX5n5>ZtekC%(AosU2K8sitQK^96Po?rHLbGe6AU95 z7wHhT>;dnZ_pI3d0pxqEMr^^8UNqV+J>cV0_CWL#!q_G|0uw%xz-FaL$HLV|HRjj& zJY2FcS{#b;_Ts-t_h`C{(7A;j*V<6BlPDwzLN9gPO4)tMl2iu|<*nSpE1A%we2@73EYHus29YiOTVYD!4njF?PaJ zy9Q@^98M{Bo-<@XbUJ1FS!XDw-sgPYEsX=3k<-3z(X1gGGRau89VVFpungdwj9)*q%+Sel} z;=B;LO~|ayiedHR1);g?9SI8Jwon{Z19GE$-!KA=jYxQ^cr^6vwBt1URQf>=SN%A{|AfM6ch$;692y!E?<^>zf_5WY zVw&dreM4&h7P9j!dfnoT4P{@6ruSA3q;2QJe&6=mr(|xYg{pa{HIndbhe`Z5&z6g<+x)dT&$oQAK}UMtfVN(7DASH)ixZ?VlrXEt=+ zB}BbZYOJHRyV z#s&li8b4Pg@EMBwg&Cx(X(AR=h`Q(7V8@CZJ@8E3&d;9HU>Xvr19?@l>Hv=5gk=0I z3CYO#cprY2D(&5wNi6#r4LH@+{A6M#wtp!R7YV8D;`=QYvfmb&}~TSX<}Wq4!#cuUXN_%s3$ zwIFQ8X5+NvtHD^C$G6YBO#D~vv*?8qZSJZ+T_%HQ9<>ijB%!O5%;sCDvp!OhghZoy znhgERf{v;O27CjVzo{q9p9pQ4zmx^UMSbT_p~bDv#vVO?YU`ydghZC1J zQ71?Ogu+40_MfLF3I-yrpB%Q|3EMj|=8yHPR4yTzjV-~P4)iMgV<+6E)=&_EJz>^F zCapxzomQOsI_(isVz>HzpVf`a#7BX6v4oEie1ougbL|0Uf4nrpoj>AR-G0jWR@JO0 z*?*iLzAe#Gk~O2*W=zq2j_UQ|i<#115U*MmvPD!X#FAPdx3WI^kMD+SWiYW6oXrP_ zBQa~V8nU^?tP}jva4?&NgW0SOe|#2^N@M|nfO9Q-fA5)hIbu{Gtd<16jC~|=F9#-H zCEz8ohdPz{qil_x&S7>et#dwKtsbJ_nf@vb{^GT=Y}hCg*Jf8-S5i_pT3eouPrde$ zc|i8eazX?Gi2?hyrd{=yM(iC#;e<_K3Hhm|h-fL^HQR%%fL1j_5=>2@-BeJAUGZ!y zFTv)z7jJUTGBrD<2gLAe1RP};N$ zh3W?EVnB&d?AM7UW~cM3zv_NQD;1!3I)B=!=Zei6o|ozCbT%W3lCg+lK9@O0+yC8+ z(PBr~H#$07P@LNKnZ_D%!MGg@CRXb#kpWiF3@n$$moX(9>U3_x{ujLaix-3}P%@k$ z%J2`0Kv_L)5OgkKX5}ZKpyk!sxtp)FVfvb(G4@RAbCC zGUMm!6E$A?LcV)L#J?pv zm$A?^rGWfW+WjvlqR!5;#+10a1&r-oQzpyMsEe)GgOt8 z`rr`DX43>NBT9wg979AU^k|#zt?iXDnl)h;A~YNE?%jl0?S=J6iWWqQw#k*Eos}U) zgY{=|D#OLC&g1yi3G1IOS%SQorCp3(AnBb7!A6~Yqm*t8j|e)UF<=X)^G#5~K?TgR zc$7^Ah{ScB-s0T-v06B*{*YQYhRS+}gF)rJSwb?o7LM?q8Jb8vEU9=%c2UAJTnj44 zHGZ~;zSoU{+H%C+%P>L$b{ytH;YQ@~eF{@!+#jAM=QD5?ViP-?pmcs$d=$(Mq~(vJ z34CdJBh6X@3G>_T`~V4dFGd9I&iBy8RE+mdeOJw>s43`Hd1?j7_uTVI-d6S($<~ww z#_m-bZWHvzZ|7+Zy&pRbfS}x-;E(5svp~h^^_QgRFUuaR^z+F!_{1TtW|xP*H2QhJ zZ+z`8KS2dKVt|9wg@jDz@LO^U@6w2bwyU$L0Kjn6*#}j5frQ&=|OqQg5p%r ziG6I98$TTEfi(${%{5x9=2HTdSCP{fF-%o(sfI%$pQ<3?aug|>QgOJt%d)pNH7~qF zg$)m_fBN6_pVAMtyhqrtk;{Wawgv6YK?LOUE(-r}Q&m+}ZU}NQbXUt4&^X9abLJrm zZVw)LFSu=A@UB)V#X_z(Ct`2CB3|%wA$acpy$S>_VwVB&VPbpweKCY3{Hd1DhN_$W z6*V!K0}Ezf;>D}>afNkLR>13jSB#a2IV(YTmEVanbXBenXiOyj?o8qw=m5M-yqGY- zu*&Ahil~rp4U;h@&q`#ydf%)_;2*8`cL@v z#xI0@s`suv&bC4|*TTK1;DjA%Tq ziEE(s3lyy%tlk*Oc^$S({R-v0>i4zyQG1kqlH9oM1Z&pvh7V$HQp%#up#NoSs61|1 z0J!>X;hgOui469)sfn@I9&XEy7C}y7gk^`Dvbc}Y7M9R=%h8iO2i54@VLs z0hJCp4DC&COsv%HSHFU4&Vb9oWHY7{qvn4&Agj#5fGCu>qL{+zOR2ge6 z5Y3L*6+x~6D-WIhcYewd4&zCP!`gNWczI%PiLZ2*gi?11jY( zMP<13zQj!>l5*V$0>uedS@EO>_-0VApwr@jU6&QenN(u=up130t;VEU1)~HN7Q0KK zRE1BK{WAB+znQg=u?!~Ao}k3#Y$jZRyqCCA1huKR0Ctwac3C~Mz#XXel-gs7bQknQ zkcwS0(jhwlzxieWb%bT#gKDjVz*zxrWTREqRkn|*0sfaNp}X3hJWDO87GIAy(u1ed zI7|V*9Kc1smE356c;DE`anBQ>WLwzxZtX*YI;OGfL39e$D&soKANSG1`tbtHovHb^ zJ&$2!qQy)>Y>~mA(lJDDMS(J6&NJ_7i~RLp*&>H9>0eRQ-ZmFrQCIap{B$cn=vs8r%ZU%_y_ z5wHseT6SJUA&d@ehh*b5izH8px_KZ}y+QDH!t-Fzcc2dYptt1xYq0+t`ACQW%=u8* z;{G_D2;kuyERZ@xB&3B(0lOoP#-iC1_U)+MjDJN9B0%Af1)s71V496oU!)iMc|xwo zgU3-*LTAxdE4E>Ph$lm_jh8L zX&vhqW*78D`@U(p@^9{CMlA7>RCcKv! zD{tDxBu~YrJrBVNFF3@W&{pfB;C`J(qM zWlwO|QRwFD79Ecr5J}fy!N19Nk#=c*|3J=;md_CSNnG?U4v8u|irOi=ev*X|P^|TX zoE_4Wamo$whxzgI?bpQ(a45lYSdqp9P_~<=4hXiX8Qb#)m9jM@O!#*$MOHffC0(sQPU z2f^sr0`3xYF{FKf`cOaSCIFOxxpxYdZ&R4t*)5ZxB$J)5YH8Q-v}E!x-O`}w&}6$b zc-d4yiP=yr9FTO9IHT`*3f4sd5c$C$(|DP}k1QMK3 ziJ}FK5|tXO(P$+GH7}Wgi6nwmgsLblYE`UK%?MTkiIYgimqDyrwa2!!wMWnC>94d$ zElRbS1d<5KRRzTh-s&4i1#evBGQZDvzwb;Yfu8e!{?GsUKM!Hv%YOG>d+oK?UVE*z z*IE^dwk(seXx4x_8~r4aM|7+-S_gL|tnFnbH-J9RkQcSs!_xfi?DiBy(I(6j!6x zD58nB^+;Xi_J*@2#d654I(#)X<1P|>oI^69SZKdAIrX*CPyv&#*6?ofzzwb;J;S>- zvx4xAT1EY;W!>e!>4Az^F>v@>zRf7j-e3YKO>u7d)YC0;+JIzxoan}1M679wQ{HV} z5tCsy`iR=tN#7?rPmj&lwUr+=;4m~}S;+TBO(}3}tDoVyXV+gAsidzP7aWg>=JIp) zxvsk(VD#p55b#iT?x^1}Kw#ffLtM_$EW-jP6^6QmXY^5%Se80)G~AILeh_a2_DXmo zL>gAmPJF>=!ulEkGR4mV(Sjke;Hjhny00LA1RpRTbN}*Nw=L31nL~#?@6fSi(R-`} z?)`doG+Ngxgw2NtQCe?IoRsp&3of3qFQJ;8tHNgT> zNS)^#+@R+;)wN0^dlpP;-XR*hpfr4B7zeO# zo0}X~Do=WL74uUJ6duLc>#gJ~?(?xcPj*_ByXHS0jLpSLSYJ}>k3G#$*38n`%_Ds zV9C}zmro7F;q!c{{ZD}Sd}zbRx_nmp3jnG>n9t(WHR18Qshy2mXx2`t4p19|*F+I@ z6!R5MB8ufA`xW(Ah-cwrLy?2{O2CcT6jT*jCiRY8upEy-tbgb!#o@Z%B>=9DK>^D(6)^vC3P?J5fWu}0HHKr@1~ z^EXzo!~z}0{EZgSU#324IL6Z~4s$IgOtNCf3M58$P|fdXRlL;yYeSq~#g9N`rELXlsV4APg9%ESS({zp_F|5-m&AA}|JMfHau z-Gjp{9KDEI%bTDt8EBc$TxxF8-~`*4>U6+hCAb2mcz?9?ne84Hrmk>N(?s0(1flv2 zYElnxX6Oz&ijj ztof=X2P+tB4)D!)RFZv7?zn&Jv%rPlg1Li1!%1{etglljH5OP^GgF`c&@?nGx?VxMBf0TbB0ePihJMIJJb{ z(zo^}v{ZEkyG>nPL0M&q{Mcr0?eHVDmH%v*KgmchW+mzZUt0IBN*yt{w0slF^pR2u zq)s7p1@iXmdkj8otlg6cTD-q{v`@djYg(S@^2#pOZ5noUJ2lBwI+#G)^B<7C+m*jU zcFahCsscI)_nw!| zwQf5aedibWKgc{u*eSqf?c1(O8<$XNOxaps%|o0MTJg;LciziYj&RzSqvCfrVb1p+ zz-f$BpiKusRNfso*%NTQ+ffm8lmY0PU8& z*HrYfDsuf}w>$M})nG)i6YIYYA(;1ZYC&dTRkw}Hxa3M%mk zm~fprw%|~-|Dsp{L0(>5@a;N)~V@FcO95 z^>hreB)$zEg%cC#X|vAHSLY?7$)Yht&dfZ#@H4f8cowbOX-+qB7B$-NLFJZ)qx5~j z{h4kGx6!5v7hy%e7Y$SOrwa&eIyD=AlVc73-(T!uYY%u5rH!O^%lCEdtWL^9Ome%z z$!v*L`Re@d)XZ9KmA+bA+IBGta_RCpJXz=KL>jhp^3dLK)HtM*l{@QZc`={W@lQ8q zGgMQZK*gnbVdIYC4b?9YUQ(k3nKBY%Qm@0;5w~57Bfdr` z$j0YmZ)RwO9$;^&5eiQe$uL{~`Zss8IkC@vfui2~AEiDx*?Z9Beh_{$F+32xlw%+y zd9pVre&^AV4tqBmB4W0olIa&jMg2XnK?9aM_Mx<{+1uybvPCZ*Gukl53QH4==qg#8 zLU!7}W)8~zO#d2=%NhR~5_R=;v2nL5U*TV~vyXqxXRd!ur{`ZIt;I~Ud}{Z--nrif zLt8b}TB=k2HLwPJbyBOeWe;>s*L{SS;tb)%4TmOQ6(hgAiD!`xfUvTqpLJ_DBtd9v z3z2eH=?sXGV!~Houuc2I{Jh--N4_v-%kh_|GksyqqZc~7GQGYqrYoKIdR=KA2Q8|t z!@I&59~rQqRp=aMJM%J~$8^1O@p>~{(Ff8yufD!8D_%wCoZ$;22Hw|xUG@K|Kg@== z=!-}g{RkT#)2q$SbHdXeS0%#MdpweNalcLES|_s3bmfJgt1HIa_g{F(eDI12;;h0* zNYgG_%ryFIKU?f7Jz1i(FwP9v!1JE$^IJK@NyH1ww+THbY`Ecg!v15KZ+E>TF-E^a zeKT2Rue!45cj8utM!NA!6xp@#q-GXTYC=(0A#B;Fu}K07oAg6BlS_9>w(nJ`Jgc;; zKq2mEkHe=+9)n^-vmP`q^B7psnNM-`$2F29SPp+;k9(vpmh%f^%D{vlD196KRn08& zZ4Src{#L_zHXN*jqqN3j&*(of$B{xA{b$_Mf4cfEsoK*ndx`AuI?h+1Z%KA|8qc@p z->Z#4Z>lwbk$@d?5sHIs&EZMV}6KFUmdA4n% z^rYvSDj7;{H@&Q~1Y+Dy>$t}qmIxNSWQgF|rD-A{sGHGkx|=b#S{2h}?lr!)zr4pC-F8OT^_E>Q zT+q%*8M;y*+qr%qOWS$bwVCh0 zr2lrmia{;Nwmqlf_pGrgLnqGEMSR}oiqFwrCHB9_XKH`Fl=b*I^d;h2&QcaAxF2!T zCKbvXZe+4E{!z~0Y&$<0kLE`X=FKMoz2f!a?u8bxQT@UGSMfijHU%urO7zGncvFTQ zBaNr|d8U3JfqZcJr*J#dE9v>^T`_-SdJo(bVf<114FzUBb3S~VWe`OqliPU_pMRAW zE3ZFVEgRRyE4?{;9{!k#Q|PzH;a_v|gh3UPxpy0CLRhf3SoOND{I=Un?l%{wC$}eC ze9Nq29!I|!j!u7PrrEmjf9f?|9NvF#%iZo2*0H+C!o2M8Eo6RKh(8jZdu6x%5Lms< zmMchvC}!*qL?l2^icZTjmf2D6!2E9(S+QF>%aEi!6|qE^`o#L-`nMN)zGJ|`X@-k) z!bC}!hURNX4Mr)S)K#ugQrWr(p|=`Y*}mX3cRfh?XZgCxDBN3aupA4#vK!{VL3Z?p ze9|amBpswT@+3_7qeoU89cGeFg4`?4^53IhZ+uLP92fU-iiVLX?S!;llTp+Jt6^x4ukbG*JWZOv zx#w-H(l(Q~vVY-9|NOTtB5i>2jk5jA^TQaCe!to?|DWs**<1=fRIO9g_dDH2g4hz6I&Y`kR*lPqIDo&B*y5Mh^P?Eq4GQXQs`b@*TX{h298N1nq(NuLo_;McOlV z21v(ZoDgSipg`-dsU-A5%I8o^U`l_i6Noj&|FB?bO}^rn7(c^nYFz)r5VBba|HE2e zca8iHFA8DiPWvD7l;C=ab9C4gVUz=b>|qI=5f~k3ve)60(X5lqXln4H)rM`s0#qnS z`7A%{$9o=&{;2HPsv;*CEhyou`ss2bh=T@**iM(MgHG_ZD2-o zppbkzW1umaXSx2_hvL7ca_wz!0_~f2e~AkT$6RVlUnJILmjKAY?Zj4ISL+-XcH5tvpIs=*7FcL55p6B&*QoiPw83X7@(zI zvIlT7h66l^44Qs~?|c9^WjE7PR99|P;PIp|&i3CkmnSIwVs(tlV(h0vllcg-Q@k7T&xS!>+Hq%v#yG9LcU0`Fq9|w@UW6>{nFZ z>f2t@aaQUJ;PUx#d7G&JW|jdrdsK40Re6BGzG6<5UwL7@11u+j&Yr)j3+mog>F)i8 zN2Ytf(7XSsdv~O}m)Z{~cVGVhKmC)_F*6>M8WeCme||{dXxF%Yv}ei0a54{kS0_DCc;yLfAn+Ly7V#eUNLdbN}BB&wHsc z&GWqdzyRzWX6o(*yuS2D7Ha742+`kQ=+EE$7DYsGR+59KL88U%@GrR%QPR+z1U)k_ z~{Mnj#bo^O>W-SDs( zwRz;m_O_SYs)x6FslHLc6Ig|RvammTf6rQDYGv|k;%nB^*dPUR5MuP@ zIc~_&z5})$rc90BKBUG=yc$E1hAmn3m%?c^agVLBUy}Zaps*=_nrrc=nc78iFQ&Hy zOg8JeFX6=?MG7Izu_B~&)IG1m`c*7h^d(-&nQ#8Vn^X+$jMXD0@Ot{qe&-v$>0&C2 zui*JQYOh7~h}d_(2*Sgca?lGM-&od2Ii=i!@tW1)7}UvQ>+^Mx7*)soZHa+hvO-Jq zWOl=7G^(`y%RE@%0btsfPD(a1H(+EHmMnDP!6+N3&)J(Rm3nxv40M5tym}(opZ{Y) zB(In6&HyNrh&_B9OuNi-$-!-RPHOd+-aWE_IQ@mHYT*#6Wymo*;PwsL#e}eT{9VcT z5FOqz{aakp2=HDPZ4A(K@&5!W+@-eucd2f^B6U<5KbiQ>eiiwdO(%4y*9_ZPo7JYzm*k;Ec-{oX1L* zc^#dDP}9h@gqj(06(#pZ{V>(KFyH8Q%|K!D)j(~Tznqlj%S3~9k25|@87G0u0!aR2 zpd$Qu{qNned1wBcHM8UZ|F$$C^J)|vo+EV{qnWkQ@P_D&HhxId8D7EPlhnDKDv)tr zOPri?2P2H#|Kty5=bm*}PS&pWK|%X7h0uzB>wZ& zc>a^mX>tkn9k{wE7NEc76kb)#7~@|e56;Z}5tDi>`9~zA{_tV=yD2TU%tO`=P_V@r zGdESuI$qc_+HgSI09%@F2fL9$>!*;`XJKyS!U1b{AT zYGMUraSK(_$rZ-r*PTvibBSvyt=v5S6Dzq6N1;Gvc#MDXm544dtulA!iEOW=0$8D^ zJdq{p)u#=~7XBGAcBsO|LM-q>uF8)1PbPOvX zjxVsy6`+;ztp7oz;Ypa?x&@=KMY-}0px{pOef($1bxA^tx+e|)Tp|7`KZC`0y8Kg% zCybzOMY1Tql3{`r@N{?*l(0mEmz%v7#b;353+rQ!kw8G0YG7sadcKF}O|qz2AG7aB zKR%wvDSq2XZ7yM_=bSt?i>JyRK(>}KHMXM@0`^|u^Ea151$C07PUHf;TKtpaAGP;ok?#HQrw#b4z3t`{MegB$AqKyz+OuMtiNh=&Pc*I4BNIT0Ymt7VshOHDDZ=kTyG zvM60+j*Y!JH~o=fc6TN=CW{ofl&dZm&Ar8iWN$q~zb3862+jNAslED=DdpSbA{+}k z+8Xn>mAGcn8K_Ut`p&=$Z!bUF`P<<9Rbzlk*WaRek9D*B!OA1#Sg;7})SxIc@pe(_ zy78$oTVGC~i%s@0LS7ERv0zqjfa(NtHBD}S&>d+ZRy+oxOwE6!E<4Oh?hkM@E#vU; zg35JvXF7)3oH|YRsT+jlE7$5{D>@@DaeJS7*E=)4dc)I9ok#Sm^Q1m?9-XdpoinJn z&f@_v!I{GK-fJhZF5RAwY7u?5W69qmgE*1aoj!7^I@j|TGuS0}^fx+Op>+$c)IS%= zTIU(}lh4EHq4wzG6h5hq8C7?UePwZteLEB8uCh9N_ShQxeQoUfhp%|a?AM7(I}HPu z(U8p~!VnfNx!deTLv~sX2`auNGPGZFj-M^Ln?8gG5q~KVy@kyd;ZU$>&bUTVxo~zS z3rOX``gaoy9+`|klMjJNTpRYSVr_5Uy6)07eM-W<^;wx2W8YQEnNo^ zm$9vNSb>zl;^-Q?&Fr@`_vh=hKPNb-yFYJC?az%xDy5Ih*q=wWKZgmMa8_X!lyGj) z{xESNO~B#V!E_?8Qa^f1?f*GD@`aB54y1Z}_&tHy@0#sD;ep&8f6!NAYP2e`uC4Od zc143_%&sMJSu)rZ{$e+#@u8mg{E?;74wt#R{m)_}kILBXA587`w>sau#q9P=ch=_{ zKc=nDwLeis!X4=ugcxtXXt@a*f)%GVhS5)%{0uOB5=?H_m{45f#gUZN==q$3H>AKR zAPTEiq@H7dDAG`tYP-#Oj+W@Q+i;tcxETu25-f}@C?akS_y|;-c29UP-v1_oPJ(sW z#0#N~ZkEoD_FJ64y>Apiv+Z>JizjfU+$C%z zQ&~YEr;B1aC(@vQiNqi!IgS;al^QR5cy>jhf03dv`tR1RLe%Dv$7J37_j`8p)L_Hf z{fQMDIlPxTtjPY}Av&6lqYMIk4(Xc!jBQRebH8_-h!NIIT?j;n8!tKJ;(<-~8mfdz zdny8Pm$Lz?bLaD*K=fAhuLn$+Ud1izCjzZ=HvN}ji$i}Z9;f(M{^miHBTnx?emM5V z`S+)HdLiLK!A3MjULj_Yps%m=idojMl5oIe5K0 z20%qwtzGb!q=D*wP#0BRY#h8f{qq)3Xl|TEEZ(5~c5Nx~b6yiY*j_ySoWX|+i;v6K zTMDLs62c*S_h9K-IfNaqqyp$y?rSJ4eTUP5v)rRWFaMDf4#@>Y#54(1+)NOi!O8W& zgbwgiJkSSjw9^)`JcmBX1{LuitH=boXZ9ytxz24DipUF zg<_i_)C;aNBV-hc?vvBpCrqj$L$xQN==I2;Cn(X)=oJ&OaYy!sXo>6-DQOP1IWNJW z6pLjmvr3xAHs>3rYMPMzOEytShW)FTp8PFO^D4yyKI(abJIjPyObkpGjWcUt9YgKK ziG=x9YkgTn2eQ&{oiuQrYs_dd7BbQ zW$PZHtvAwWv7~Dwin<2<0NLpR(K8XSD<8P{C5K^)b}UocK?sU~TODL4Qc;i~Y}Z zCyP!2Imj05=a!B?FHn)JKV$rPITiJ%=q9`V+xi($&l${kjx-RFy;bwKCJG`QzQmwN z$AH9uWJhFQVZ-;CvdtdIr-}TO_?dCy||CtHdp=4)sTeu}qac;ej zc`bXOQfDHeR+)p&Ai0>(DOYy{#(uBe=SDBv7U!8 zrGSvIvRs`!<45ijbPjyyY+&zZcl2B-z4Z*LdCDZc!KHPD7`RS=T)$Lox%o>jr5W@$ zM|Gv#Qy2?zV_m=0*a~H@#8miO8h34$J?s~ZwXg=RLtEX>Q-7x|BlAwD3Ol@lohO>U ztw@^D8QsPt$^tA_SO83>QOj!(j?a6FM{UPjyp?tgwx22m#DzYCLL4GL`&#pDse z1`|Jq^Q%l@^b!$Vx>&)x%?jRQPOlm{K^d8*ZiQ7ZN3nqUuUi}%(QpR*8jz& zPPJ{TKUeF1f4%Or|85qBuWm{Uzb4{+vgf-%h5heOQs*VTF!cCQ&t92Aq@MzW{T3!c z8sTNwxsZ<0HSbMgjlg-g;Nei|?mGKzh|yi&z@Kc7BWv=Z>b9E7j@!P~$Iyq_4^y8a zF{N>#uxiDr?_GSjCwf80c7u+OJ#=6Y{l=I=g$}t!%N#0v>;xY>Gx4$A!^ieR@bMoQ z4PbB|+?a_E$dieYC`lF#XC3wKkhmdh5%RQagcBaKicChgt@XMZ_9|Lpdb$~#`z^`q zoeSNTer8%SinO1iRE-5mo0L;R%Lz`p+I`}2g3f8&cJv&PBQElk$#unAfTATkTv!*oF5Bu1 zW_`EL#*!OeVK*#?w@2%$QVc@~7KgBBREb}3HxG{D2J-u*;TIF(7hU2P>w5VGGVgD} zMv7l-p*-FNKY*qUzi3_oMC`QuEwUPN4;r-2fM4X?TZhli zbBFSaYCFdlioXxPKoPpt@Qb?8jcdg(QoaQtAJ6ysZevf`9@_nWI=0bP`4)_hO;0N7 zN3cz71C}AgjvnEh4FY@czclMo6ju@l#?g~~=Y0Ya;e`p)2z2;^c9C)p{&9DTe<y$RKL9YG5S401q_?}5 znO;7BZJJHqC>Myt1up;=jE^0t(Y5sd?jrZQmfr6?UCT<=A*nW9rlp7uD})4(dG+Bf z$)Y6`rm>ALy|m){G?(Gf)c?LcE2|Gj!*xQoIXL`tX9K#4@|Tp-)Q?h?k()7#gh@qDz@g!b(cJ&TEkASJ zpBwap+E5iq3F|xoi{Ya&=A*mak5cauPl*T7t52-wtf)CZrszPJ$A*6Kqa37%okVj< z79Gd8Ey+8JL-r`28bN0=fg4F| z1T1Fgugn+k{GKl^)fZ!>kRB9@Ro_q(9VFcw*ONxnD8kyV`aIhf!EzHDdae2J-}%sv zxC1D6R5k&~lJi|Zdt-&Oyh8xJ`cm&u+~;zHjSU@1Jw!uH7EPk6kUeyq?y=&K33h0f zX=A*AQ+GTYU)teLAOW6rLkJIO7i^2@X@k_yJiEz&>a!npp{oJ8L*Mx!mB)rY$xpKA zW5dv>%{5(>F;W>P>fHE*in%uQPE-7k6tA^&ALORi9=e*J$UbIg1ccNeAWE$+EvqsL zD!UWjX%1GAEpBorsJ6-%%{`@aZ{a>vG4x!1($7xSGds6Z zKkUS+2`m>I`r%CO0QkyK@}v`hOm3v?+PbvMkjM87iwvt8X z2-~rtzs`8^1}}Q2km!{H4HQTg{n@a(p&L}1R?gF4vha|ODJ|~-;iGzO|A5}6{qNTq z90SKT#rNSOW(oAKg3;V2_h-EOQ>`B+109;8=G^uVT%-2S(1X~}o#y5&Zj2CO=2Z$} zul&oVNYXH$p~b55U&Gr&*?#aIcUXAmsbDmBqxd_hPZtp#L3cJlt)J zwg!vuU2UMMRPku;e%*oLv7(BrL1I2lr;x+19kwU)0lXx}wOt=)bZ@eG3Ytm$+s-j+YQn*%|ng9vwC2ag=RvHbM_nIpIX`N~i>x;;N``K;3d zF=>-+sbI1v!81+8mE4@UdxvOfZJoB>(g+_|J?A|R_xyn-*-z0 z_BwxP`@VGs)A5d>`D^K_P-3EH_(EfXu}4&+;#SbD*BJ~ScptsCY4vXtuit`tB7bul z_f=zqu_m|uwqWdDU72baCdOfdqM|bNzA2#qG!uJ36);4D$#sb{H#iRFZw`*$5Xi@l z*JhQ+EqB<0zE=Xi&5YYnOS5exbVBL!cF2qS)gikl;A3{Q4GzS9X{yx6?d9#cx`7^; zDeidWGhuMYZMR}e^~$^lU{kD1IE*vY_VoOc8bFvjCFMWGjcb}%cSP)sRaQl zZ)(%SfG-#d`Z|O&7t`P|IMzS~_sFgrUM?*8R$0Dyyv?6YK%ea32x;tGA7E{aIS^>& zSjgH@ek$8;_a&{oOm-^YR)6!qOJHE(7~!ShDaH$_HulqzS|+M29n&@Xz>m>M5JI4j z{p{H)zD37g`eMj_weoX+HS_(&8l7Qjv-dbf56hV>KjhmH@U1W9^mslVNmXGS6V^Is zan#D5loPY6qSZN-aX_m^ds<2GL`*SHdMZfT7iy&EMFr_O_#>fYo@WADD<>4Yle5Bv z8~?%{JU*6_O`UFktMfW@DjLf_^$uC>9ec+~)(Qblc;ZqHMy_{Gd5~4zUfboPiA^XxC4n|bx#d}7@3gR57h~+3mSr%>aeRSej-bE*lbEZ>;zp%Q% zKa9gRIs_Cgjm|~@SX z-cvglO|&l^;nI9`cnMQ(P>`9Yw#mk{N;AN4mUuxQppTqT_M`wFMrg;`BY`mcp$P{9 z_UvL{*!oE0jREZG=0p4TGM01uuCtlQ_FZFvtwhtgO|TUL|50K;y?x+SH~jU5EmuY1 zEJBzhfj*$`#&=4f|3$m%OW|c=jMSC~>;)OHcM5j85s$}*8Q2jpJe=Qu;;^N&;VFSw zbV>D{{|;+8%0)cv4W0{=V*111;5XpI@@+;^07{VD)b_wnA2|^8bp=6tyo~`7_Qn4^ zwlmDWa-0B07NKWrSUAepG{sNId#c8_*7B{5$B(jnFN$0Qb?%Q&I*xct_y1?tGd;d$ zLnGvph{xM=eH&pnj8{Cj>c6Ynd^vDlm!Z=huDk7{F~e+P{{jvX?8wbNK*Bptfqhd7O4g5F+<%h@xZr6@QIqb_ig@2 zB|ToxSVNuA29(QrQ%DgM93d2xw~4lBB?l(_XHrJrS90huMIjEwypjekQNPn z^(&2P?9oq$UlHURh}BzYa?_Ae7#zp$&h2^sKYZP+h(KlN3BZ7ef!p)@9s9wVCW4Ez zBV3#bLMSZu^VbL5`eVjeKz0ld_}*ZU1f*FY+O(3e1dHVZJD7Ul-r7@R8b_v{FsVgY z2o;Z|h{PSx2zg2*1H)iY0GVNQ(KDR0>>BIw72hN+-%Aop;%(rA0R!G&7L5Jy0Iip| zj5=_0eHsg?Y6E4+*?4Sf8<<0^CF4}bL&Kw(hTUSYaD;jQUE*1tVT*tvJ+q?Nn0 zG@3ph9W;Hk%Gdf9yQH*{HF(b7|M5b+oh&_@Q{y8#$~Rzv1qh`B;5rxl+Zf(!_5l;k zNs`vgWa!hQLj#6xplVkvi+AL>ZRUP+%5QN}6pfkMg;oY!wbSE{+?KK(uXtnCuLa&( zv7hITYR!Sh4H?ASk0$*W(#jfNEu;~5+yFo7_sEKG$0tVQAXmogC)j2x)C ztr{1Rcw(TxaG+ZxvKni}utEO9iwpTx;NA(vTudam#l`68I;-@w%(>aEC=?-(MhDp+ z&|0(Ac}<>+BLqS8bez8=*;PrRMM~?_PjhQVqZca~$`US(Snla_6p+_oc?BL z|D3HcG0_PK;)fhu(3vx~(H?AK3Lx%|=_l@vjY{0z;)=Tx#Q%ds4Tq6<3n_;Ph-kaT zo|MN#iaVoXIczxB626InSq%^peS78JnN)<_i!B8}$}t7w?2wXt%etyv3afT0tlA~e zYD1s~Kf(YZIE1P+M!3(U*EFeHX|ny_==BhNdDACydPcu>>L@f-(#JP@=UQH@zex(x z>->e;{=%9<|91k4WMUQjzr${rCuMq4#gi&MnZlDPdNLCO4)92ikHyzzh$=A0sWKj7 zi{0wc>9>W!eA6nm-{E%A?tS_DjF%ZCAiZIgz^Vi+;dFq3ZP-N+B%lo&4~RfE>>?lp zuwml?5V(e2G{t}gMB`_=jk()Cw9hwAk|sVBEtd4QTU)+Xsp`0-t{%Ig5%Rj8D(A=gVF!M#qaaY|B|G+x1*Z#q9%-i3= z|0_g#BcmZ7L@U>Lka#AdM`*xgJtMKsWcF|R7W5oN$#eRayhWhcxyS3NYn03rIbQ=t zl0}#3rS61e1J4@Zxm5hq>{u}gP;0JpiQ$k$3YHGPMSZowf18d$6|JsO&8YV`5n6bY z9H{o$YLZ~YU6fQ=K2%5e0Dq*S2M_sxoP^#7Re9+zyzX4D(!H4djf%2Ib&KVOOkGA3 zY`TTApKkq3h3Hl~l)OQC#`$46C8r&ILZD}7C?|^m^FbSr<~?1(Pu%Li=s&K<7(jK5 z#NS-S3c|>e2*Mj&h19F;@Gm+NlRJhNfAbL8-W$h#Z(tPv&X)aHwn&GE?RqE1PDkqO zW4G?-z>L53UGplqlXz_`PW4B-{z`UxvK`xGnKU~}YqBGDQFb6Yt*~;ff6<@$!fub& zIgR7WmibM{Z7Tjm{*2V^#JB8c4Z&u=5T(m{=jRwAaZLp!A+6-bp_+L4HkE`!IG-x- z1eIRFJ@w^Kt-qy?o6IV2p-MR}Eaa@;dPlLpF$!f?7@8IQgg`>ki8PtJY+`?(^S8y@ zqhwlQS{$n?4&d&$A|k@dti_(;=xhY^6dQh=Gp9usrMZ{^>UP=_M*xq!_O0mge=X|@ zIvOOl{>9EFU=to6)uLWUY@)}FK(7-ARRQ}aI|IHRtMX-k%*Xp)dyJ{D?h{q2T2!SO zcP+w=UT^)ar}9m}zV4GCL5}YGj=5=Yi27?!9%02Ma^yAcUzE*bWeRBi2#Bg1$DPZF zf8uZH=8oETQX!-AiBtNT3uc_>_Eh}2KVi-sleQ1p9m$UI8gSp|CY~Q?{K14ndCNns znk*YMC$5an84)PmR~;)jB^ny;TT6gFUnip%B4)fjNT#*q#Nnan(dzu-p`e<)+#yLc zQ^#7_1Y2;y!p>HH=UVDwcRiw}Vr+eVXzZq9?z3ClB#{MR>DN&7vGC#;VI0;c~NAXCC2` zgu3MZuVv0_uNtH-NkXq+?37>%V~AikWH64a7m5DJEahc($%{>l^tAC2YH5NObC8nB ztTvFWOx<09lC!}~)?dpcSJEO9R-yA_)7+gyOy7Gh=X>kf;gnJteRj5)g2Y31e$per zC@Hk{oTipoc`IMOeUhxQ6UcH|`Rd#Y1GqGtX*KT24WAve22`%TV~D|H&wfZskL!o5 zyj9$W-&m-$~9v# z_aYNXy7J|@aPcz-ge!w)u<$-1W%=Ci5|S#ra`oJk#IkX!&5|R@nH-Idzn7N}$8Jl8 zKSdeRvT2?#I&CDe)QFhWQ4?KQn5bK6*dEKfx5nK)z7H-}Hfx6G-mItYlCASr9f_i3 z(K23fm7gs71y^QfY4L}sP0}jDV=}Xhj@=Cz=f%5q)v-;VY|zp~9`A2avnyXJHm{B@ zkCnff{ho41;Q0KxS?FH^A0hjvqAq+;xglJKzxf$+fos{HxCqz}mXz@+LibcCJj+BQ zykp1;2@E~*b7#m2ZBu`ave`B5&Eknag7bxtl^tmx(Aiv|IY==0w$|o?IF~g#R1hB! z#GPp!;UGe$Mt?+6={lQpOySr~1C)Hnd!xu%WZp@=Y}$)eH*4Wp_1}r~Os^l+)T46_ z9K7F~?QhvfOR*meOq{cl03cb3(^mp{R^pVE5;_vaO?xpSXVo9sv{$aR{+5?{x)St| zYhqZFtVr0zvu}rYHa*H9xM@Xwf4n%+GoME$OkkMCQ_v;U_2(9 z3XjLw7mpB23&l`N^M&&i+I*!0OixdnFPDXZwK2qY?(y)~c3=*da&}kR zi20+9pY-YG_$dzv0qM*eW1ew>9UplW+VUOqV6fdq#tiwdgzUv78gzN`thrHy_E^an z@PPC$>d4sXcQ~)zlqoOc@6q(hQaS?#wHBr+s8LTK_?y30>ja4tub=+cGV#AE=aKd9>hTsYVb4`D z%U9XuU-T5W;!Rupi~fVl#&O3G)?J}7B$G9c8<8Cz+Boi5AF0{ZV13aFVzwCP8)V6P zV-hO6ro%MEDrDA$s=u;mt#!tj_U8RmIRd5|5CZ69=s%wC>zpgh8UA^fau~hp_PWD; z@2nHN^UgHE8iZQ+!#If;SZj_=GlWbyykWmee)DPISaYi`o$6X@5cg*?rcdE>YPdpx z%<0<{opKCh%hJ1@%v;2y3~)YE^8b6Ho{Asj`J1=uN-7nD;5EAQJl74|pzqU-uEa2q zUud2#7#^?}jEHm%4PfqzO&lU}Fg*O$^J%_(Ck&FWvp&b-1pw4ggh}ELY<7M`30MLyqMS^pq~%MZTk*Z-RE$3Wo&X$Je0#=s z=A4_8?6NN&?!GNm#rA~ZzC9uPD0@AoLTAU%va@^(hNnx8a7$*pB}b^_<#}$=RTO2$ zlh0wnh`2MNm9-Mngj2}HnYzg1;;fL}(OO$lZm;cR@CJ;%DyPiE?9l<$JvsAt_@4=s zjF0Ti(LP~T+#l%R^gx{N#^d_k3e9o%_(EmX|2tvs!6sb z+f-!!`vIDrb~m-afIpGReuch^Y_aBGXED$=@s8I zQv*`yb!ar&CK#l6(1h!l-#X`M!o!pOD@3k5HJ}(EKcGsQ7GVrhwooTAGFkK>wd!)1 zASeh{j4Lr3Jbx`mtUnD8F^g-DJZj~8p3koiR@1$)A^T z=Cth2oHGW7e6Kn^=O2(aaqh+ec&o0XtnVGv966w7iQ<8%JXXINe~mww5E*v0!h2jmdd&iOYU*Vt2WM&u<4?q3er<41(-@8>zwX}%`X zP?%NE>Czy_-Bxkx-VPzfP|7)vxAK!16N*%1)sxJwE97HO@Eyy3M`NY4_l4)B$4Vj2 zI(n`^A(Sk#Sai6l8eV#L!Sr3t!^(<2bNH*f1V-*3 z^c3)WC-*kR^Z=AIlfA;FN_M1~Lg(I;6sEPeCgr!>R%^)yr=Z+ZS@urqJEZu}e z(*jHTvF+UAPHfKdo7j8r>CKpsJ%Xjk-^>DrHt2TTGw<3^7oFW*YyZjN3*%pA-wxFq z=3805$yzanmYiqmA&+To*LMY16`(`vZ26oKMs?FtXxb4!;iih4@=aalS9mkk)JFfL zLZRsMV_;a(rziz{G-M$C~@xiaKGXy)^m=TzBmsbb%0&om-w)1E%vt@4S0#k zA!R|9%n{ATa&Bk?1sWRko}P0qHr5orj}EN z=pxs$&x>C7h_nJz%u$r13OvzZsJUQi%i+STar^T13bFSKF3c*_ql>OM=p^Azqo{)1 zsll-&dEwo4(G%*TC(}r)Bp+XG^u&;TjnH2|jl*c5dkR{QP4!hqBs#B_P|3h1iXB6U zyMSHgii2?2i-^3z>R#l^MW&b}qiZ2bX3vlnr8M4iod8j_TF5Td4QuX9(547<)AehQ z)v9|#fF92bRLmUizbBW+ORc7bBbGvkHTJpwmiL($W?3$UhXvV;DISmi?or$|Ua(AJ zD+LgO3wR)63wZn5D(AY@seRawcxTxY2}@sF5-=304g21ZEx2YL6 zRz_v=OCSowtn8rlCr@yr9hSf4S6s0*7|x2;7WpQ}zi6=@;3Q-|A|@@tz3WG~>!0>p zDi?o0FaPyOdopbDS64yxt!pUghEvx(G4Q!yJ(&jn4-{d2t3rQg;0mG2dC|XUB#+U7 z4Pl}0dOkbsDu^#bU)PoF${cQ@ds@HV{yO&L7UtE3@Phn^`?^6BmKh<6VP#2FIDRmf{ewxP~ zP1DmyO*6s9bVnbg717TkeLb}iidH{|EjcxScrL)Sk&N z&PjD*$#M|TpPX_i-%C!rDA5-MyW3Ko`$}H}TkWiCO9EDG+(_Y@9H@)pykKU1_e?Z@ zBMi-_o$GJBy>}aN6UA7)r?p`n9jJv)@s8}=U8pZICgHh!QKQ2WFxO+%BJ*#RH~-$d zg$YVntT|c1==FK^gfR)Snvi@cI;XHli@w5yu*QTR={c6W%(2Fx*JrGUa^JV3N2EI{ zI;oundjPuWKv!eG(^r0a!0>^c2F3>=G*PC4nzNCL4Zpyt1WYjqvhFp*B*apXagA;H z&M)>8@4;}3ABjQJ z%UxG`)<7sSHY;3M8!hwg15rz(BYFlf6;cA|eZAi!fcp0Je8|Wpi`srFxw>a7H<{>r z8+2w)m32aPpH*r73m%;;S*~}?eo2-Pi`Z=B0#>pnk%pZ+&@|i+qZZAkM*Uj87am=V zI-lOGZhbGsRV6SDT4@dfeHW_)2sV3*Dj5xCV>B?>o%bymhK7Var(XP-I$RvE6NPML zZ@(c>iM?I?(O=8vh~=QFa(>BG{>4S;$fb^-Qisi6o1kk?7pgO(nf(%Nm;%s9l7Vl| z}qp4?m# z%7~X>FF-z4gp1?S;_<^MV_fn0GFLoCc?!E5*0Ky<=5DvS*}#p&WBt0~aovX6=<_NQ zivCJ@TcgjfQiIXwyZPyCse{6hj#u%6bo>fGNXH+zcVD?bIZO)P4c8A%EH`zvZ0Co& zHh!G9W*O-i1vVleA)ac;Dq$Bom%m};V}J9H0ag8R>hmQc?+V#>Afs`@aJZzZrMz`_ zj*rqKR|oH&X%#{>9R8MOy^%4a=VvZ0tvM|{2_Rzgd15;DPbQ#y!_n{DKlB!o@wO~k zw2k+PF{V>47vgc0*HFy_G?9L{|5mzg;*_dE98@aXi_S8Ouv2X^PZAOz?>LU#O&9IqZo0`e3 zjTR>^*KYrkOnJbCmor5vcq{wDTkmqJlMaFRN?z33?<1gxSC(&+_FH1J7^o{qr?rqV zZ9cS{`R!$Ny=j#;C$6628n!dya<0F(3EJU?X;i#S&h722wKv&2IB(`}j)?Ab!N!RT zWJQ<_y?v~tO{miF&NRcjxI}Evd^6cRI3_kNS8feQkQ&PVxU?Pp?+QxT%_ST7LEm?) z{EX&F$6C*Yv0}}kH{HAycbr!Xgk#VIv-{Q};C%C@yV6S)3Y(rIrL}70CHkKAV%_t^ z_P8Izbv;bSx6XXo_R9Wbf~bv{8X|iJ)S?@l{;aYi`h(rp3V;<*4nLMZxPcF*aJ!vb zpb8mJeK-;7m$iIXhQ&YtstvPiuZ=A>K%h0R^>sRzzYQbbbH21jVZZIZir{4%JtARo zo-+qUb_LV6{*1`#efD}X+WB7V9I#C4lABLsUeAIZU!IHRC00-h@Xpyx`&dq;H>9<( z$4VM$+znwin-FI2o9H2CM~eQz4W&7|P%497H+FAi30LR6XuisNP9v@%Ww_hb2CxNG zKk5wA{i|aE6sXmzCL1pxGDSlh)p^ai%y;f)cApLxI{zn%vM zxAbx>m?~4RMd8KHr!sqE8@ls&+FMR0Vozw3?XD~FL(c!-fO4%XLFjg9^kM?vZFZJk zYgp>ty`??yR!|l#dFQ|~sU9!ScJBL*bkix~rYq3)biO_;ZI{)Uuza@zunEm)5^r`? zU1~xLai#z%wN8-~-oRz$EQmK;NYX7=Q5#t`*1G!24yz*T_Mxt0r1wPD`6;2;cpT^0 zO{vQ>HPmII7bY?o=p4^jf#E^kxKMah*LZhC#+wo88qa|EmUWIFX$mr!L%PNvry+ZR zbv>(V{E3Vk$9pb1{rax)Cm)sFIerXkGD?`MiiQK(M`f zJsD}gMsR7ITsAuz(nx%dGy*#s*ECwK!@Q#8NI5{E-u@lB?Bg3jLF?U9n4Y6owv(0k|^&PU2q~X~MC*d~HR#_F1K$S-u^dej-#_ z?CespR3GGqcL?Oh9T7sXrEGAHI^{r;xL1a&&cnb`<0Em~TIWsld$HjDfRFS9>(IN! z#-W+s;y5RxjbIxxEe8VCXE>!e&Yx8{d_V`@6v30o$~@E1FHAZT#O1(Ih8J= zoMhwTSkAc;-)G8Tg^Ub^$sJWktqgU#3dDcOuOpw#VVa8V*4VF0DQJIlz7${nmN)pH z6*YXlH`Q_4cUL3y!)=lFTxPSDF0pVf$8x#dy`+72;#*zW$MdKzHfefIw7S*#TVj9G zusMIrF+NzxV$*JReosDkR;0r3zk3Od*2JoYV5eFpelzri8H}FwkE{7V@vRqzQr-1L zmCEj{BA8@sLAKYbSg!iOilOxq)*4_j(MmzENgfJFcsnz1x-@-L0!&2NnA4z|Rf9lO zs>JaFr`C$bSV3XSnsB}c^L1L1+;(DCp|7*T=fC@HF=IRTtrPl4f5#bC)ypttmFov- zh??4H!-x=orJ$Jq5-_LXV=eUX%adrVQH{9_TK0%86VD}C^p{y;nLYA7usdUu^Koy| z5>Tdi@|gR;W{p4aigQ~DmMIb#eu16tdjpf5cBfZxaI$lJ?6mX5aqZ2x=jr{a{8x5Q zY{CHjvbOlV`yBo5j!nqb?@-np{bt7|4ASqQ*o3@D=V0^5UMI`ot5+M=-Bp|h++*Db zm~6fsr3aW}KF(epyeKyAd&mR8J*bRdnTwd80(<3XO##BmPLsf5uVref<|b;6P1x^C z*e~0AE{ct0b=~aTM_Em*OPN^f`G|rfE52MsgW0}L6IA$oIrRBk7Bd7$vLc$;1h@_w zequ-&_MVt$Rb<~j$T0TA%_2ywrUUV)>#WMnaY|_;#Ds9iu+!cen>SDsex2jYFd&gb z*q10hV886^>V@p<6AuU3-}QwcOG{oxa=P;HOOu(A&3Bg}7D=T4ZZzgY>I*^>F2U*-bEf!(t0&L3#6z&MO+j+ zN56<*cd1#PBl`wW?+S_O_F8|S+X!SY?Gs(lfJA_eg&xWbhLAXlof#NM48J&rN}S1?Wp=B3!ue;V zsNvzFk)7L6*$e#QnZbGl{_XW@kB{q^CFQCgqvlbNK?CGK;|KotD6wmICXu z^9)!M(_p0}+Xi?7f+`@F^3Gs;iYReI;(DGPeMtE_$_MN}-AA9S$N~Ji?sl)T>u=_M zK>g+X?;|dUoxAPZLV>Zyd%SL#Y3n5?zR^S0bf98JBJmrMzG;=_Y^G09SMXsi#fj6s zi>}~(+-4%9k~S&1XK7dzvKL@~5 z0WjLIDAJYN2g+ISqLAhxgm(^=F;^tc5Lo|KCfcHCaFHwo#m+Wke)G3}1po|Mt{S?q z*I&5S&R20G5L%@&%J3!TR0z1(`HlDO3ci)`6|;l%3u~>|)%zsHuQgKqi=#vtM1*6D z>IyyUoS&oIvCuc#4G#xmx9w|63P0fhY~cwpH)_Y=QMbqr{-*pzZl>75`}i5_O;9sy z32|m5aLPVgta0gOM^nrzGuw{@ zglvj<06fM-`8AwYh5}z_4L!@lBiQbi_pj^QzG_4t4CbmT*Rj3+DdW42FITtoG=7OX zn}H`DIcsdKqQ5hbav#+9uB_utqczNPpty?{ebMk2_r>>lVS3OtakyqnMn@Kz5*rL6 zZo{JA$LThF4b+MlI)^7c`E zM)`Qtn9sB|#BEEd(YiF$Yos02T6D!ZT8mco>?eMNE0@&JPN6g2d;S5>-Mx$c7uWL6 zJBFehH0jw#!`!c8v^YjrKhR7Cdj+`b(etb>o=1H-f&B4-k z>1{%G!GO@2*chr5vyt;HZ0|B7fEfKMhx@QA42hEmbV&P?gZwRT0XfM{eFg`QYV|cZ z__-c~gWA|gg9C#1&CRW?eB<`{LBb40-go=1W_$Zjw{u=h^?!}&=6JgKB5ree^gJit z+kGC#>HVP(y}lp%B1rDWUy*RjAJKABQ@V+yS}z7m;|xd2f5gri5;~K(!8P=s7~MPM z$(`3>I@YG{$iMjRSZ~MjLO#ZJ!`#92%O9!N3wvwi{Wfc5G1p7Y*bKH})jM@nFf2W8 zXb<95f?d5TC^XOMP#$NA5BD@yO>(A=!+j8-Pmj{4+sWq>r%N@y_Ee7oaEfON29#+y z6|Xis%(h$I>7{r4eZ1Hp)8z0o6RwR=zl5jS zFxQU6e-x3e?{Hza6!Y*|{t)&Rb@dUInauh2iTG9>LG{G}|HOTAf}Hs7LHG;{m%sH| zzO1!d$|xI%O+u(MF4r@i=JyYZoft1K{Nhj6Cb&dP9}kyYrH^8{RUNz88vN6W%{>s* zu0Y~_1cqPSSXPynRYNl6ca8dGYE>wPInOz&1J1maDh{;oP9}cP=iM7m z(igpZSMSd6^X>(L{h4>G_3nf|@6Oupz55Tn%QfarIgc6LHm1z6M#24m;P${c_u7yP z-&HC20(OfK?80|PyWmR%`aHA@V2LyOJUq=nlsLA}!zbPmC>b#9SIvrK+v=id?j6K~ z%LY!MuovIm3J}B(OTJ4j8d(E`G*O@7szpV0{hvScglXWM{?C8C(mWs4|M^k<0h&!K z$bnVq@xJzhgRcKY%M@NoSCLhL4$HsfcOJwy0rBK`3gV|y5ce5^3teyneI5>RVLhYI z!>>`}(6M9tJe>1(AGC!}?E_&u6e$mp@R7+bjLgOU#f0A1K#$-D6HU z$t=r`32QcS?O*~480-v0NE{^hV!KOo6^I{$fOG% zexdG!4B4?pFe-c8unJb(rd8q{Y%WY-0t|A<+Z(CkSsg_42VYODa_#ib8&}puThF+> ztlabSvQF^+&gWNuKj81(3;X^>dG>4m{@eTO=2w4j@z=lX5f|iToy^|_-rwc?>hBi* z`j>6v*{l40?ENMA)!%U1AK&kf_5KDlY)l;-4-x$Nl~yvuvq#*^DlV70m$>}l#K}?_ zkYr;v4wvCt|6s{7-aAbQ9;~i6WN>4}vrh429l3)ehY;xD$THBwk^k^^iX#in_VaRN zWxX+eizckXUhD6ob;EAkc`3)c=lG30U(EmT+duIWu%9mDN3rW$f5nB}B1ajt@G!&4 z-2^(WEh%xiti9epagFm4xl2qQAb;yE6m-wTlzC@jMqo993aWU4hkPiC&QB~DB{F?y z&fl~%H4{&#NGNvB>(9exrG7cie9|JoOyLk*ZH#l#*QxRcspuagfI7qff#?YK`pr%& z+q?3%u_hjNm~%cf<(&DISbTV%{}~i_^f-PXvNw0`jiFiSlb6g7h$X$2e9yIv%Jsb1 z{p^b8nRV5NJRbdfHoT`D^0?q{JT5xqamyQ;>RMoALyPRlizN5>@0+aEH1^O;9=UD3 zo$lL-JPTHS?Y*_^ui0Z*{@Pu&vv#pvaSATVPBX0%|B|gjg0Vl8ZyNg$QZG(CZjIx< z1X~;Ec7y+!7Srvv1Cc$sb8k_+;J?G(9?`1xAieiiEi{`M0L}P2ov$*7l`@{5@;f?t zYX7Ihp5f{6{!i`K>G=lx4GdP7^r`v_hQsi;^NdBoR8J?J=QvMeI9`c=@#$RF$tYv! zF;KcI5H(j;a#fEKg>b4ab@(VIf)|_l&$A7i(S+#LVZdmvU;5ked08v?Tkrk-lVAP) zraCX{Y5vxFfA8|EKO^r)KAG;#U8b`pTT=773WTSu4c=rfqnMUEO=T_{-OFO}TAx)o1E@Hxd^@cZLn@h5IQe*cJ9}n9Hsg=z7-N-{&v%h&R7i76Fe-YUR zx#n}Y1qU4wU|!Qe7dstqxB?8@8a7yul@#-f9^-%umkVtIeS%$I(TQ=C6#u zD*mSMHSMhBb*O&&DJ>GqiTgZTrrbXi$+K{Y#YX!gy>45dKJ> z_md|%PmK#JxkXYJGLNWjH|3Y2*J7gu#Ie~*lJEux}Gj#rR=mExBr$S25ht+BcH)4_Q?H!y4gT(kq+RRt?IheylJYo=mD-r$~a zQ*+LLpC#7Q(5i0|H|T%eRdNJ*p*4RFIcmgi5$(N{^^m}Mpp67f2=Pk!=3C>9UqLo0 ze~-BBd=RKaZ$jM1{Ted>IQN$``x&}98pN4^{p}ZG@V_1;80=+NxzORL1`-oWiWtrz zzwfuL*{_X6HO)@0+s?T!^6^MM9GGn1=!Cx^o3GveXqEq=&d7U%eC_c)KHtte2fZL$ zK;k;K3sWk0E+GE>)H$kirgOrsgY-BEx~KjW4IieH??J+e%7#-*$=F4}SD8-UxPVz< zPkn@qBfXSUR9VOue5A&Q57`DK+I+>W?EkX&HsEnqW&VHCN!ri^CWRJ?6grrwanse{ zbR{)a=SiNS6PnNftwbqMEygM+wN0Q(Qxd0@jt^sT)m2vaC$74(t1GxKP(*1aX)|dG zG--vlfEZ9=LU^elwB@DweZJ>BGntfD-RpP#uIvB*UwfROS=*n}6aPZW+f}TlQX; zb3L!FI~|8rh}073gOlnI3&C4bC?pf(!5=9a7SXz=f$=UDXzY2R#JvH_6HzP{5onOF zDKN&`tSRx?JKTgBUI^9p3mBP>H{>cc_=a;B5LUl)6GgJt6qygld+S)|uOCx+MG<+eCZ-B~8uQYueQP(I!Tg_CI9=&~ZS_3>R!jb0 z%A7^@w@$8pX9N8=!%;&~qYyXyNHI8=$F|4=lo!`9I@j4bpli%lRe$?xT zINkkRHJjaSuW^3zC%SV3FS&IuMH3yN;NSOf(3ad+b%&#g&PsDTqT45&p|fATc#6pzzLfse5cR(7X4EnnXmbh3G|On>IDMv9^{9>i!VjP2cvka zM+p}_(cq+S_=GP42Pq$T$uY$VU7N})ek9w(5&Ee9y*MLqIQ3#M@R}1oOzp(z?9D4~ z!LhKI;sPfN3B_kd3CWr3jO!hs*T6sVfdc{*%aL!0l^PB2=cCz##y5US7H9h208K!9 zJ|Cu6`rb)B%a;V5d{#jxqv0XGoD&V~@SB4}g){gui!l4qC?7$LUIKH%!F)RC&8)=! zN@z#ENRr`S*@L>0r2vAMH!DD@id-d#N;$zo(*t^JhaAA?lxo!~PdLJtT35f-6qLG;6 z7ni$s?;O zw_Q}@HOx7$VV-y6Jnpsl^#bQL)DRBaTU>PB;`!b+^Sw(;&bt)v)wTRJl)2|MAf;|x z=q46lEgcyXOM|P6DoLeKqCx)EsyDGX<|Zy(mAJIYOLjjP?n%B6|5?QY_l z*2FdI5)I2KtVZ3$+VzPBG^+dbsn-xm#6@A*+_W&#G_(Cdx>s?rj)W_6ufciu zlj37Btb`wtfXc}$0osXC9$s9NXt>&Is8qc2#qEiPRbB)9OKOdV+C;;(Uc)>huqGO4 zeYMvxpYZvYE=+t~ok%pSv-7p)!m3Q0&c(+$FU_mMjxn|w<2XeU)yNT{)cN`4fv-o2$ zZFnGjN_erG2zm{zJovNBDJl(6noHzw(DpcR$=IJ%6c&)I^|uuf?60fNKI9@ znD9gl73EQRihmoLq#S6w$K&LV1`%0To}{s*g!P4j%Tcte&?n)tN|$2u)ZAg3B}!}X zOPC9AdBcsTDOp6Qi2hjJVQtm*2je7n|B|G_iBf(tR}mgrxC0#^m@``{5l=G|5sLH z3ru`cH?-!qx`)@+DlQjLt9$0RnrvFSuRc=!toN`l-&pKTeP7AuvT54li|K^(^K$i( zg2tM2!?~z%amAj>1__qd#3>3J&n*%2P(dVkcYkDh z`i?-y=}|n8Sx(67HzWqXYVB&S2}(Xtz`W;9?Co~8=zPG+gD+KYzJnEqU>%z8lQC< zZE^J-Q?=1Pb6wRSOr=UZ>566&}V+V~Jchk>4bsxX6H7|c|A-_!@ zcxB0t_-(oAl2b0`cj+ywioe5e>rW2E=kmM!%m+s<$2@RPqGMa80PCbR`aej&T&>#J zR$#x5x--A~U)h&;@v;k_(xUdWDTCDld1cFN%axIPFpJxcvIQO2U4M?)|tDrz35GF{pqZt{Sv>(E%xZd@|+jj%m50ES3&{gM!Ts*JEAQl_c^y;pn-uERJs1!|v@} z{N$%^c|d!0wCK!_RS&EEuE>@h`VPVHPUFa5Pc16YuJ5KA093|Wt_Mc+>i>9DZ zeBlv`-(&Uz1 z(IO&xIPb?fmTlzC(Wx9RJ8W!ykyq1mo#gV$_nV{BuLZwJdV=SRWq_qZM;6x+ZWQG; zxKVpz{&>XL##wxrcG(c9Ysrqq7H*dMW3kmAi_877xWXTcSNmgel|L4*)mWsmyOeb| zv-Ufhvqwbtv_YXi%33m`Kgzw4Jvsg%1?a50zM}4eB5=Cldg4Jm$8&eVwQv{i@jovF z$Q|r=jujJ1{(U<)Uv$0fPVM}yj*o}dw2GCg;^`6G%ZkKNwZC}3X;HYEF->vaQGn7+ z)WdDJ8u~3T^b3oA?=keNGW2`Ih=hS|sn2hDe-@4*4pJ1VVtyaz@PImGL{<$i4j zb6k2t-nyF!=f_;s$9TjRaUp2FZ zjM*iA zIZAXq6Z2@upCq!AGr!u;khqXAL0tT3o6o}bJdj7|>LcB6M(TqF9n-ZVSTK4|F$LLx zF#B)GkCrsqy@d?#G)V+dO)4|Q{2dR!DqdMiaTjlH?LXYEHncIU@tx(&8gAzMoLTF0 z=0cw{BR*%kK4->!&TO)?#DCd+8yqF5IJ1X;)#3=tGjqUr4;M6jJ{pc>cunRmzl6@+ z>D;I$4*TYvKd|5akT=e~B7*e#5q_iIfu`htRhkJXc+VpoRhlx%pAO1gG=&hU7Zf(G z-0O_*VtRgCTVSA#_|=Uoce$HqzKw?z`p9@2#*Y$SpV@|0hW9=0X0Gw-E1{tM@=QIZ z@YG4K+sJW25jAo&TP`rPdFGjIR7lBQeNPK-W?$ylo%b>4^whmG+m83~>)Dql`1rN# zd-JjFakhOme#F%5f6QwGm>O5N5Btqh2i@ka?z!RJM_z7DUVkvZrfDYve(GQ7Lh&(O zp!lR-6#2cdUC>(}e<%7b8W{3l4M9lJ>RHB|_Bp2_C$#z!hqNiw>pK97!+dSG#_D#h zn@yNkfZ(GUvGJYeGZpIiUGSd%rsQSqj)|;l*SFyAl0u>rI^#RJESqgdc;m`pk~7cd zp~f%I;VBG%W>`0_+_||3u2T6+#?AQl`)No6PV0|mA)_n>^WoD+Z|2aF_dfUW8-M=e z*Z=Itul@OtkJtutRZLJs-9F6Q?DyF|(|wH-x?O(=tOym&$xB`_H3&VVZjq>C&>4X^ z266rs;z%gYrF<-~H&(az_!2RA_o5GJ70PNPwFA%Y5h=ahe=u5aDJM(^%#t@X3QY#E zoo`<9p|;d$3G3tF-SEYt4;oSp@rIT+U-rS^-2*&bXaEQd>YL!*e8hv%67G0c$Is>^ zb>;ykit`%NJuKFla4!2mQ+3+%gYs~*-cpaJsQ7dv!>Iwk=-+w${$~34H0gm>1Y0>~ zR7m9iB>k}`t3Uo%rQ~zWyTu;VM^D;*s+qa04tdo?m^!n5Fy;^RL+Oga8Kk*D8w}2H z(B`CgI5qr5_(RiE;tyxFltAWC>yG98yvVp?Ny!Y!BjVF9OI_^vuuA-S_3p#A6@T&2RiM8Gs&e7Kmqe2vRaAg*Ac!k?#8!No)%#D_9+-w-e#pIiEW;gn` z*5@JPr$SDN@MFm}Z+L`G_@nnazJtqjfIQ+RR}wOBJ(lHdOgU&G>AHi#3;Nq`C8mJa zL!f)6kHABU-dg%cVGlM9x{nh`r#kJ_rJdlSbluT4d$s4l(G%*^YQI&Bd5bP`GhTJ2 zQCK7724Z^OYOqw?e@||D@6r=Ugmcn}QWMKZrjQvP>x7>z=w-AT&GaLb+*)ah|J2Nx z_s!=&sLm3hUTPX`K;&Fk`P z7x%%%F-2g6MM{$E;-lr1H2$PbiJuyk!S!~dBZR2!AZACL39)G8O&eBoOIXS>Y&b-gjwVk~3-gJ}Kuz&cY4azu5Je}}NVGzH;9neU()=|o?9g&xaPsh!7;KR_5B`e$Q)26VB+=hz3gC@`Hc z`_ozemOeUGjJBrryT!Fc!ia5rYX1eZ3&+llj|VzRBbztO{?&VtGh;L2 zLHDqS^Svb)enzw;eJIacr;A%DxwoBSM1@#LS)%fkM=p)L5Wll&m<>t|Jm361@W^0# z*n3Mp5z)a~tJ>#tm{t4oL^R<@NsC$Cwa?}IPnz%ZEKeto&$^B8usj6_CoDdXOtNqh zdfIeM2yM*9Yt7sbL;oTqI6O=)b6s>)uC?Bje4w2-f2V$$cJflGyjMMpn^Y>YCtG_r zr)}?qc09*SocmAjo4i58n3*ldf6w=s_P4$=b&Ouli(GB!;~#OBF4^2e(y zrwR6|VN1klO?JTkT%$_n#5=h7Ahz*>;LZQUW!D#G7ZN&CbRPYCmC<=YhLeV*2I*#g z6}N3&<_$zH$yg6_rZ>3h9TYV~j|Ebk0U~u;&lrIc1Ot2ppxMFbkHjxlaOnApN)1NY z;{3rF(O_J{D?OKu(;tjKtnA`OqHp#1tn+#AnC%od*%2TJKf_c1|6yYNrEw_RL}LJ- zY7HoK;lKl#SH>m=qls^0Agt`L|}!QK9Q> z4bhRz125R&*um-$#BzL9B{F|_Nso<{BC;845*(uury(XRuv86caGh!fmPXiExfzRN zqrVc;HOdsVYMmWe2JH+rp*=Uinjk5otFF|HE)m?h;>td2PaA!OpkgKP`M@#oSj%CW*N;Ub?Zwjpg_PfvlSThS_))X>9v|fdR(X zDsN-u?Z5-ywV>J=|Irxt#*Z(?OEXxcU2rW_YlIk&Z3d=Pk&t#>donY41;Qr#gXiSe zY~QbRNTs~u@80E)JR8AZ;?b<~@23Np<9}(CFMP;|&g=crIG9#yoaxL47N`QG&`AX5 z4sJwt7Igp8nC!Z!xxEDI!RS%0OvemMYtK%T9=+8ezAti0l)3OCbcHkZNnJ2P{V<-O5N-0?NV&M;IPQN4hsig>AQ@ z1eN6YA#yA~#E!!cSfBqY{RpGa6M6o|Hfn}Oz=9GS?~>m&s;M8NigD=2s51O-{88le z+a+9h#p6HA5oZNYa*UDOXeK~{?xM0XaAE}H17d?J@rQJr7YyEtzwzTjeOD9GE$^zD zk|($P3zBScA&)~fJkE?T2u;ALO_wvzYV#oZx9h)ph~uV@F_~C>0epRCOg<9wH&QJ4ZtG19kl#uQ$X9__ z48qhoA&&)b)r#3Uc#B31NZDRbhPUWM@K#+-4Y7F7@!|cT0r#8#6L9|nHn2leiYGS! z{P`am5{Js^A%~Ibxkb=0iLAgXbZ+KUyVzKe9WyqLn0cRh+77d`kN0lSybHRoZ#6gFKJe+I@5m(MlrnC$W#6X)o7+9|iG zU~P_h$K;q#J97>`xu2ffQMZ-%tFLJ}o zXn0pNuq4D^S=76(ChC1E;+U+_OXfJK{^?Qgk!W~tG&~#)Tvo{+4|~bTJ&fm#+*;UJ zNRdZ(Q57a8Z;*G>Q$0b)+k?XtehWi5!lZh5zXVS|q60jXN|h0e2Vae0C-5*|2KJGP zoIJzqMn(gR=0^kaH+0GW%tj)XPO8IQi>}p113XJj!=o#TZm3xn-QYX9N{SLXEd#1bL z1Kxf&@SE^~D86lcnCc@D_W_4gRDr9SoWKFH4?BTJy}c~t!o#V)=}wr-U4cg^2#|Zo z;*8-Auaq!4J&E1v-lC{$`oP|m6wl93?V=^l#?=wgdYI>(vaF;69D^h>sww5wErJ+D? z1=0OsUsITHG?y=Ry8CQ7GIQUiD>`R#aT~1j;dG~h+|j18Km!?=@stx*!IeciS?5#X zUi*HB!GDioga)tmz#QqNRh1z@=sF~?h6c8P#i+woX++kX-IOQOoM?890t1qC#2sN z+(K;ypngEUxx#yyfzQ++3W#L|pcANfaTry3fNTPZEnu3K1uc+TvKhJCQ3GBn3D$45C6tic5Yd#FPTKJ-P|D^FJ`H0kZ~1f!QmGFQ zXzsRs5j>`{RL?1D2@n9u@2X8{-j@fE88OgH#EJNj0WfH@Il<|rWk|JzT!5P`fQELK zBOxda2^>HnWx7bDE-2soDV9majo{Lz67QRCpb6A3^Z^%dKsfw7)vDML-Vi%x!3+7| z8MBT!6uH!MauzrP6$!-gf;R0M`UytiPubz^pvw_%sgDiAkb5W`^tHc|^JeUyHS&-@{TOmRZCO|Y4~RW(6U6=EK-U1p5hL1jevb_*p^e%SA< z0oK52Ws4{W(`6xpr7fkHu6EghXQTrVBLc+(MsOOiL^mI-tSmVR+Sy0GFo84Fqa19` zJYSYD6$w5@e;#lP-vS)Dt4;tM;x#)d3>zX%K*p%eG9_SSL9;}g@8cn#DMc{|0&P`R z+zHX(-Yj&MT80_3gfgfww6maFu*IHcxLx$-rT=OGHKVq#4A%9bHNDsY@l-?-@>&L3 zib+IL2&$I$K}fxmu+=Oa4H==S!4-sc#jb`)qk_b?!(?X$RdK1$qo$FlWW6oGe5V4b zQii5wPYYypA^d2IXzxa4dZ!|FH0*#>(DY{;K~P#?N+y5_M5`oJPFBa&rfJ54b}S&c zw|8$>Q#okL@}Wte02s@Hl5|nc+iC=pyh}W#$d1bi31?))%}$ zUVjm%@aGOa>;_(QQt8rYfb#_Pvz^ix9aKg*g<}c*xYYkK{DN(tb_1iS9mtmFDGypM znG;QZ^=a>)TO98~oU}o7cgozB*3S%MQm2ynpwR1=v@I#+NnkLX>h3jV0`;wMdRh!{ zl2A6}GXUbcyGJF&>y`mdg3Xe*=^2R9@eLuaJ_O?O7{CqeHp-3Ra@S3MOXYQTD`IEP zlT8Q30;Q?sS4$J4s3t(?C2Gaeu6IKW z9#>h2Zt9nGE=@rzlp{3E96ZzV7&@>>BT~gDz?n9Qp950=Y=Im%!>sw-yeMK@%!7k5 zkvBF2iz<(WC)B0hLP zW~k!BAt-^-$|SFcm59{^EKQjwX~&A!d@|Pf0OqMTrdx>GJoUy*^Appgn}g7(0a-Ez zoXRY8R*^H@1AG#}`BQ(OzRCw5uaji=%O6_(S#;vJsB>1k3HLE{q{T_bAPcQRP>RBh z7N==OpXU*Anm<=)y_(bF(3!q&%dxDmTAXenC=i@Li}RHM%{!KoY96V9%wSz;n$7WQ z3A{?dto~Nt3Vdon9Ew_QM2n%Y4`gXpU4g?Rhz^4Tpv)?CQ+;s7v_7a(=q7<`NP3F8 zHwjefbH@i2RrCa)B6#$PC945AyWp^dv`}YP8!7S~NKE8Zb5YYmo1^9_6Vya8)-uX0 z7NyXkif6$Bqxn!x=q;#{NFt4^7Wmc*eIHI!2*Jsi2-J&xZO?rvWCrOpfskU&IgCWo zYdb*I5wvqexEY_)VZ=~<=uWu>BbXSy{ z*2hqlu65f&IVr@7#jF_-8MJH|7{)XW<}t8Q=Cz#9E{nBxR83|E?3r#6V8oQK*&=ni z`&0seWG=Gcnqkgj#5Q1nHtRxPxupk|xW*=6?EwPSt|JAj(S4brkA+q`{jtz85Dm2O zun!UBn(D)AWs<)}&dMWA+sIMh4&z$@I7n(h6=431FO`HbCt@0iiVdKFhNYS#PBNCN zJd{wWtTT}9s-Ekj{}QF4oi-fZRAxw1x@V(et%6Lp_z z{St69ssv63A8id|eG#8#Nnn5q%7$ivLV9V&r$6)!!$(+G(Q5+O@;JaYsH2Uh z_u+xSE?=0x64X)IE5evvfJ>h{a1Mf&xphAr8tU zCi@+VsRpg|Q4C&}VK$lQm03M#@{)>^*P~N%JzBCbz@8Td9LpXYIn}wqHA|!6N3rOc z!FCmP!~KS&eN3b>SK-&A-Yz%1izEb2;58nQjV6_z8aV8R zce{ZLTfMzu6kzEg^h+jGN8n!)!YG41D1a3Z@Y7LDcNnV-+)<8$$|S?-QARz&rhcXa z8bPOEA}L9Ixg({RlY)T@T~=TYST|**&F+%Lt`)7Dax>l1qgsk2H<{%C=F>N2jisZP zV3SN^LhV7G*OxJ0QAOaAIhcGT-xKv*{hAZDPU4c;(L{aOgqN}Jvc+-iB95t+C-|xB zSxbWH{OE%w-}Oh>Lk*dzIL~4g$3Pw2_w}RpaurJM*JAL65g99njOvr!#c_!9=yQwKl&{7lpjVCEle)siy*oON(@< z?(Ad{)5|V}biJ%rQIZ!e%=`_X2g@7EG%Rb$!pD(M+?}*RS)I71L{2O<=?1e;K-^ce zL(pJ%2pa4TL4(;LFy>!_8SDHqft(y_42u5$^Hcw4=clR%iKCOs%so0_@mf8Y8lB6d zES9T>ll7C{52v1;%cJajv-?`jDN1S>-^sT}iR1d}Q1B7R z6{)sE6Jv@H>To}bO}7x_1qxUWY)$s1><7 zTx~Y}i6uPK^@KOVGfs{xa*2FjI8#C>Yy6`Y^H-W!Ol)Od#1b6cN(4EH8%xI3hot+MU({FV!B34ZR_2K(6!c9=O*;WHAVNp2bO z!-XBK3pxij6p#KBAa(kV8(-tvTQ-15Awm$SN){z~!YFIrPlUludp3N&sX9eysv7Ih z=*@8IW}bAz%r$2zT+wJzU36gm*jRHN^-eR+(qj#s(~Qs=`vB3n@Y!3bquQoU4wu#t zyedTSs{N{zV=K2hUeQSl3UAoHX4iPHsc+x<=Lm6ykH`y!+K_*wF?mrIP#&t29vwVY{x{*C1?1ZcE+OR95N=g|lb@sp4!I2|(`YTdnZWa6b!Nep>w+5{ zu2kVK_=Tc0a+H9G6D7~h){(quUFKzCaOQzjY`%rIwvV&bZKL?U*AODUdIpE! z0=HS6^Ia+#WbI45=s>b)6HoE8Xb*D!VDe=wCKA)kB&7 zm(@~np{l~&o1ULcaHT$kPwQ1za(Zuk)_bTj?|~J~=HJMrIOv+={kb!9pWmGGM(d%c zBuvDU)wtHPceF4w{mVzk85psZ2g8r~VfRun7bhW6Q-4`G!Y2|?LW6wN;)mTE&Way( zZ#dogrOUI;cyGybe10s6KkL}SIug1)jo0}I5WE+6e)EpdvRUL#9iO%8h~PWS6Flk{ z#YgLDj7^-YYlY4E1Uri{b976PfDls+d-eFM#}rh6Qh1cr`^&xyJGo4Y-JC zVmz1!D}4W=CZZ_d9jrB6=AJ*PT>^4(oFSE&twcq>*E`2RHgg`923XQ^f+ly;mFyG3FXevFKSIFG+?eAXq0rAmxd*`nvDs8pGk z|2tRIcfx-+1qp{M*H42moR&sFocLeFis7`>qhFksuKz8+`6sf;CTN+4!};y?`X{V^ zD)rB-_>t4weIKEFi>P7r$2c0^Tdb>p(p8DBzOE|;o*Yf+YO1bo;wq09b!p?3EY0!c z9h3u_-)ze9q{fo^tW)ETH!6o&d9sos4uER8QZz3(wTAVS7?9)d9YwfGx8v&^;x$wE zqBv9cN)9c20gGgM^h-!`e5@nEo7Zxs%#kfhT@+%F5l@ct=Wn#JR6ok=hGf}?lg<=Q z*WUagZoN0Fk0ciz<+RJq@8!1osJElKKmOvBWb1g{3u~vFBweHDsv!G>WCVH$7R_Aw zQb7S($iju=yEK@|P;;_w3&wZr!A&nZ)xVXKcuTXF#($HKGV}OC%*OhU=VS!T{9wqs zI_>}@5cH@2WaxN*h*m%2j6cB9Ys(})<=^$H${@S&T{q5zk{&vta0{9y?4W~J-h-m$ z`TD0?|IF1tr-`)Fwp|J*jx98_9ebN0?AU3Bs$*q_q+`W~o*bPuXF~jR+AW#y5lG3L z4Iu?{t9iUtqU=nk3H}@M%Kg8x@XtEV{x+VJyePtT(oZc z+S56JRyf{UQ^6uG0){0^ zWSm50vXDsE-aL&Yas>+uJI+Nw)*W1Pu7X%5mlV3yulz#GxM=c%qnVGhG#P6{xYiw9 z`}VEp(_v%YFza}KPUXlJb56)v&RH!n>#A7tszTL;cUtu;(c}iQC8RUYJ}AcRNHO9H zub<^4myCDS6?72RtPsqgqLD*G@g$kZsvqnxsx82PLEK;lV&+|ND_FbP91hDa9c*(s zDH5@$S>?S3QapQ>kj35d_-lpjC!225#Z`1sSz$FH6XKAGLsDdbJ4p=1((U0|!h_4L z_L4P=AI6>MRhgwGMwqS1(Dj!br z(B(CkmbhYqQbh& z+V}Znu?NHyTGsHBujlBjhng0#R%DSNrW2QGfOxM!sOm!;2{&}Af56b`E<>j?MJE$q z;#gXVR1e0gcPpzRLyZtT5}KJCVV7{v=ymW(mQn`mk!9vQkezUfr*=&e>zuGMDeTlM z$#e_>AiD-v0a^2F;qi{s7TjW_`1QVMRjNKAP{dP?oL?H!Wj@)-ibWDWxVewzPqM6& zas_VPC=s5xM`rZlb5Hn95kzc|r*0fMr~;Cfs2gMzj_|288Zkn%x5FO6yG!3NHC%|T z&IQvt@BkH}-XCHshlt)83p{KD@k0`$$Cax08>#yKzeeV0GLpzy!chu^%WaoDJynMW zCgf@V=w`YwKC6M=b0p(NZggl-#6??U;E6e(;!YFYmww7c^0IL>7!DLCn+s!s9Wk45 zXgC<(!b^`>nET=*A9kyUoO^ZB#Mh4$6wME2Ri(Y&WaGFK?=g91-j)qX^)^C61c_2r zbf%(MvF+t>xQ4t$M7+|IqPJxqhq90L#at(D6WrL>xmVG;-Zcq=4X>p=_JaxIizzzr zut!>o9!#~ID^`G+8sg+MlCy@>t?}X4V ze1zxS+ch+tE3P1g(C^!;q;it$IFdWh=_Z{*FQt?9P7SE_1{x(X(SnMnyroOEbSXKf z6HX{_>VC6!7Jk7^fd`|t3p%Ec_bDnz-EY?XF?%G(s6Em>YmwZ_*hqf28?D;&E(S4r z3W0o>-q3=Zs&_KUQ5EZ>SQ5pWlt$8JgLgNT6bA1uU|*&5NUUz(`lo_-6I1){nbq-^ z3Z1~dfNYJ2_FzlI#`x;~S04@DKM=gXH+gAc1y*LcnGPRf`|82cVN7s=2i6&wc_YBo{tv_|VpyPDjl8D)@ zezZ{?Vsc{=zOv6wC-&Od0ZqN+I|6&N2~@jl8;C7#9K=}z0zHTM%)UKu?4jf1P;Vf3k1@-a2dzL{oK`n{7aM5Z-k*Iex z?M}~5yD`nVw}J;37F#FDt~qrx4>avoaoxo=m!ZtVM^K33+hcv1v!J-SvJ{Vb+m+gN z*`=4olB@3J2vrZC$Z)p0q$#nY942T=tO_-IPrBY`uk(J3743WcZAo-~ixuBdY*aU# z&Apx<;_n&$_VLH}oi7@Fja{=CQEZaUTQcYV$T!2tkT&{{tXMQdn^BEm)u>k1r_I;$ zg6x{4Flc4Tqdc3zEjE;U=M6F-kx_~z*%a>#Vq4!t#rra|{~J-UUz+1QzK!3+pxIc? zw_Z@H+ElI~_G5+pGU%J~1|5g#UMCUzC$wer{Ha=WoV0t0T62=1BLn+t0;!d~jigf!K0>DjN@huRr%^>oRzXkzUx?b~--MZ#& zH+^{h3T8sX4-+O!EJycX21QTYFt^EDhG-pb){b-0bc~iKuX&F(S~_*Z>&NozR$G}T zF{;z!(0yMOe}?IdED|K}jBer-Wb?M*H+slLJjVR~Ei)wnwJ=}+S@x3ocKUsuzC8q- z-lA1LshhWWi&j`t6O)e}=A5l_GO4$KTZ@)6FsvC;Pdq9*3JDiIHA#BLfwi zyF`%pqPt_&sU~8Q%q^(5_TH1%e9pJ`F55ypbiaCowts^xn|kh5XnXQYi2$<2T}A!$ z_s1K~ZS>N4`@?QxA(};m0O-y45MF)RkJmr1;#Dx;*M11|L4Z?9HcHOSWuiO?Xx=vV zt?^mEd|KiHo`c`SYkZH{hO_*(ooyRPfSjhkdG+sB{o8E)Z=?S6{Q7;){*0|L$Fa)o z_8dev!**Kc2PT^l@%Kc_=%EQ(Mqm6ZXgQ6(zi2pPF~i@`a^g`fBblTbcGynK4%^@{ z!**JxE1ey-XPjWz&XHZoE57Up#}3=%AIz|Aj~IqTAnDNYeFZasbX2m}nCN4MTUCKQJ=*Wz#khdKr&b>yzj>c9_Ly?~v9{2W*g{~QzgV{p@mDBN? z-ymCo+ykbK_d4V&I1(PW84CyxfT=%~OlJNQz0;wuU$rXUO)T(lrf$ntduV@ksyAefvTqu0-D0^ltbA`9xRzdN^-DVwX*@{h%or5dKu%(}rg-NTbomYN z(>^o5B^DBDQ}O(pzc=1f7u~Y{1r-y!^?u*7v(Ij?|BilW_Dn~$9v~&NnL%YWKg=yN zY4B!^V`?(T;os{;Ut~0%f=X`1bmqN+#4G-c>NSOO;XuBpy1nLS)bs`M&VB0PY}3Pn ziT*vK{_V5 zE;Ehl<%=o5UN(Xp?>D~)7%oy)dtC|p5ln3gWEk0SR-?DW$fJ2BR^Cyc$tMw+$S3i= z?@eNn{ZE3P$2uCN#q|JPla|wHb&h zf)b(wnQU5JR0&0+-jmH9K9AN*=;bMvoMZeNaz4d{%p^UOMq&jw4)dUCiV< zdwUm!iS$kAnPl`8SC-=j%6VTF8f1>pWG(!yZlW8jj2VakT4%rm8JWIG$Nmo=hI6>foY8-8+pb0JnpPF7wp#jP7z>$g9P)}r2X))ZO&0;b<6s(faM zPLD04Y++tmxl!OEg&pR(Y)7Mf;_ZtP7fIH~YwuMD5ZsM<_Qwy){x}W$W7^su1(Ec7 zCy8vshTsD&mtd(MsHBdo@nCS%wpNh{gF}@*fh{l%t+~&ZYvD%$)?BFP4)hlD8`H6 zrb5<7Uf<{`S|%AT( z!$oi-88T;o9hWy&81Gy+jkp(^O&nHt@!-}v?jGT{m(TZ_f-6DkW5 z|0$$&+}+G_!ePRA@*j`YGUjSVN*Es=>(f&xBVRF5y2dt{8YKVXWVaKe~COL#{iR6##)rQnboUzcq^s4l4a8j4aY@80~#wW8HzWz z!q$u>@fjN&-q%%WlXXXuJX>w%MldsNn?~W-Wi+qhq6uKN%ZIAo@{L(WtF!7#73F%k z7C&Xa`Yd0b?gsC+R$lWh-(>nqzKVxB4Ecn`|LAcrxm2StTPcM|{cZ)7m6CX<(SCwu$A zs|Txa?V!A+2Y&la{?<*S_oe?K zoC@PCATw|OpVm*$H3s?Ez$uswQh7dLpPzt;$H1u`fcFsJ6lA`u94dKG9tXdFhJK3O zqkZnT($77nUY{Ma^vmL}8K>xzvlD-rcF8%YD}ASM%v*^!v!k7oUpaUxq|s5xbbmyccp_HC!41-@v?bpmVbN4 zDsrnzGT}_DD$9b3&zHCU>%Gl;SxfPpl6cUmJO758NQ=m3>+H~>*-s$r>oo&fQ#X3`<=)cGZ#ePM zIaq$DA>@aj?KtAR%CS8!b=#ya*3G@X+%&6B)j)b;zBPJ7nwZYEJ)V-7oA)lu+xnFt z3uWUW+Wv}I+UPcP)JC_VV~@Gum5HdyI;y20xY78kaox)G_w)(ZE4bE)0bQ@++AM0h zUR}_Blb)?BXulyA|7B$tWeVD_jm1;5Gf$&!fq|M4e?#mvh~ zD_b-7+Q;uR6E2Tqdb}!w@j`W+)r5Re-Mm5WEJZm7A(xM`n$)Pk#W){)t!I}h8H@2C zrFiy9$Y2kZ_fj@E^{|r>K8tupoA6D+r zLR;@n%k6FarbU-&rqD zr!Hj-oPJfRI5Wj8UOR~d)v<2D6(imigoWQKSvYnrHDcpr4~lhqT=iY_Eurc5(_s!S6S)nv;&ixiRP7b?ot{_e*(p30F7}$PL&pN83Z>z!HtvbR?QzY z72o^-Pr^NoiOWkG6Kl&G6E~7rZ5l(cos>VR%rfa-hGm`ua-22-#-%wr0#^>nmoE`L zO!6t;TarCKE)P<&;5IHa^A^OP3UZmzrJF38;-n6fEoIh&Xw4aNt@@S!18=chB03(* zO!>KWc>N6AqX%p&W}d*#VOD#qd6>a3LCt5X&h(#N>UCt;Ux>sz4;Hq6Abzy)roY3^ zcsTxHQfS~r+{%^%6)_vMPfxa#WJ37wjumHaEB8M?%M7O{#!lBq{x!a!orkHGTP$27 zptSwMc;^s{#{Lbb<8JIG=KBdXn@42e8k(^8I$xb+UHKwtU^tFs5yF7PCqZ0DZc>8G zW;a82XZjI(aABdopTvddQ-!$jR?uW^D_ueuYbnE*@$D^HyUGMF)cY`)h9DB{id%n2@Q_ zR;xrlh??wr5W&0RAoT1Z1Sp9hx}U+_*x1ivUjKrQyEdHV;qBE05Cs$D?GbtJny{~a z;+9F|{mw&RLzzuTNJ2gmDu=o|+ZW@yj32=UTsWyRl2_k;)i*Fv->H-9TWsqiJ(Tqr zMv${Im%y2v%63=gTWRq?@g7g?V*K%Zfm1>iT4>(^9AFW#bvsw15e9uugs|Q*>zZ%# zMp|x!U*NFj9`PBMHOy#YFkw@AUl-RFoj)@xupf+})cr^|qo(~g7f$lad6MY|dLsMSEw}0F)gH_Y zTew12?MF_ryLPxaam_$;;zp2flv|vAb+v+==0mzzr+;enPe}j7^iQq+S*3qqjb;1! zg8`Ry>A`BJ`!M_vTuZJ-;%hfmuFfoDHx@hBH-X%HDc^s?EWv+a>_l6U6w>#eB5M<4yIO$j^4QYRho2V zQ>jG`6rBh88%cC#M8H#6o-J5j+0t>UxMjf=w+6So4>2(MM~0(l0&zDA*VNU#&Zpgs zA7%+WM5!EsYbO!-0rXmn%AZgOsk};<#;qCRsN&37uViaMFMQ*&mxZp5cFxX`q5D!HD`LnYLUjU)3X$ZL5LW%oBH59pPF?e3wu8+RWD1eac_WW16s( zzbjKP!*->E#LtJJ`upOY1%>VNM0NI9I!i?Lw;xOO+RTxYe5y~?SnDkD$tKO9go-RH z^oSKMjd$Ke>`;H}@u~lVl%f6; za-*L_{h8Eas9yr&4ktRbp)=D^{uD#?IZ*vR&34jW*^SxG_HX+c6Y+EVh2BV^6HkwK zyi6z8)52sm_CJ_z#8PvLAtEyZOB`~)LT-|YN7_%(M&hQ=!fvDVq=5BSRbj^`aCq1- z-6;E`|HjkoSu(|f#q_5sekHB|GksTpCJufCNI%F=>^h-d{uytryoSoPcp(DLrBjLhRR?x$}!z<_|Ihh>e@zE+Z^zJ} zei)J)7mTM2)*9nIocrFn{%L()N3ES9yK-$0I*Hoxl-}#{`cYF{rG#}v{|bIh#?w|% zppKnwrPP_ZUVQRjih5N8ZYwN*=J!WMO>=|m(a)eL{pvhRz2VHtq~3(qkNO>n zNGYJoh0L4cfL7C!(|Ox!hp6`jqs(2Y^3>E?pf2D`u71Qeyv^|no0E+eA30E;RpGk9 z&NInZ#5b{HTCb&bYaA6SR?ve83!4?u@b4RwHxP#4Q)P`f_%tS$aHQ;}8flSb9HR~I z;c$B_@sV+pBF zi8k)Xb^j^u-{qS3J9YnY?$31-ALo6K?pJUhauX{^lXkCN0Iqg z9VB(!)JD_8zt|!5qM2SaC*Bz~z4-I3Y94FNZ8L{5-+VR8xy#{h#N>b+ag9viDLS>#jY-_9^VaWF*{C&si z@*~6}M4GOl<}W$wG#1QzaO17n2G6G=dKQC&gB#z$O$;Up#p=@SH+qYT7|WsDSPlv9 zR7dtppUffVx(AFriD4SraHjNP#{tIRFVIrtxnT*rrD-OplBWj~>;kM_;f#sx>`2RpLQCdavK3j_W{NZMHWt)0?xh z^6l9E)c!U7sWttH&>ts#vv?NtQ2*n&T8Pm0Gz=^8DxnSWaXB4mrNH(L6{x*=^4?8U z`VKnCJXU;?kYoBn$N%PTn4|%;_Q*nTHLDU9Vy!f24o|MgE+sF~Qc_KvLlaqjZK8gT zteOR-@n@3*P^xoM?XPW9?VrpoDBZ*-ha}9b35%1ESp&pFndrS@(Bdvt;N^Q`-c22L zK9Jv#PTz472iJ0;e#6`7)~$vs<&nhnmbkk74Z{G$b-@Q+P{T;Y@6PL2sd+O#>k8Ak zt0@HNp)BZCzVu&}CGUoJ8qgzJjAZpyrjg0*)vh<~!PmCEd)H6k!L%0}pY{Cx7S%De zSDS4w!cd<53|hQ;K$EeujnLBP84}Vsh*P5V2MeR z-2IfvV?C6(_>D%LsCaZ@y-vCur>U?a`l)OX_!b)ke(BN2fAQ_K(|Y~V_m!ue<+&j6 ze<_}i@!Byt>L;ADVtmvT^B(m+z0?Gcx|mh}M_auQco#3n@!eZn6n@b4)|NOGL~XjU z%uQ}F(XhRhs>RO7*i&mc29Aj7xPsOF09@j#YpNs$K`-9F@t-GiPs+Jk5&*G z{b52Jox>({_YQqTfOAd}Lse6tzs7?6j>?NcaB2AQwa4eRj_quBzv{CEyj{eMCxB9gqEwy3_kjT-@DML6QB+BNio-_S_+qDGXQ1C( z8=}4e->T*kUwB;f>O3?rHmE}HzvnNnw_?7wL})KOPM~0i|4u%~PPa0cRL$?^LD*f}9baItBX-IN_sUFH98OM}59^bZDW^ z)mad4FWpdFv5GyzX&4*O!+Tk#E1q%q5RulL@GDOEPedB?erTY__Rkkl0`V*S_i%rp zAA-&y^8ma~usFjxZenqZtMXD75t`GBzq00gp+P(XMXnAaw6cuu4ZL zKMe2gq#LIGK_s~@EIMsGa|KXKox?IPL>0EXLY@mr2<+j4`|wWU35N&ilWOeq7FKqr z1p=^G{Ly{&l~AASD~k{i;iClETW<#0u)d_vAh>GMSA8(L2bl;=I8Iq8+!MA~0Ih~X zyN1)@L4$Kp8AwyZOv7SM_;Dxv1PBSw5rE=_Ikdnxe(~Wx6BLdH-0&+PA{svAhTG-4 z2~B_L6T}FV@J>^|Gu-b>M0j4KAMa>!&jDgCXWhQUKH;lj^YAz=x#2(fUlLF*ZOB4C zjo%5@VFaO=ieP={F|!ddBm)u0Sy)6r0>{C`z(0n<#~1(ynTkstO#$&1UG!emfa^D;f#efNgx4y42PSK4aSUs*2k97^c5XQ>6Z=;x{O=^*XKY@ zO@@qyM6kRWf@DgWQ)w6o>^b4z(Ce^28bJEsa36a%cC2c+XF(Mr{Y?Yd+en#VerEHv z#B2Ds{+H@jcduZzUm8hdMJ{sU2|iKVpb0riOvK0YTh~lP^UF10H0er?F>%?ksM7s` zN5QNZB<+-<4lv3Pdc!^5UVmUiBBz2(D8;3)9-L)mH8rSPir9)=Nq$KY@WVR{yFuzbIrrKfHso3LaSuGU-F5CJ-~k#D+h$0#ZmYsC-aJ2@F&a#M>aydx0WCD|m#Q zMNaqyfe8LU#7uBl0elvL4^sI&UJ@S?6dsC(pMy(LN@>{ZspuQ-kA`1>)ytjX9a;49 z#ca(0-T*a87Xox|nCg0qft*=H$Yz2izUT`+#+)!>U|2XE;A=wq^Yxwz;&&TVFdqg0 zfq<3tjKI|=#9H7%kV^F>wumGKDYz`lA3R@~-vG`mHG?~ex>I5+QYbM@r9QxS ze(DJC1s7T(O%e2>DLhvJyw5{D;TPnB{#tR3l;>U)4^vYG!~gYEx;W}RqxoZ=0|SZ3 z;U5}C)33ORX~PLTpc!L6l=A+hQ5856MuK{ST+%&85vT1c-AxZG22*K95M2y0HsI);6^H~sPsmOcV#puEZBiu2A24Vp z2|GN^T+xH%*@fgW(z0|Xj;bbGhPTJ^snr>kwHrvlUsQ7wBw(h<@}E=_5Jqo@@wV~B z6w0m{#}!%L1&@J&?!HG-pBNN-D1@=kP6R6!JE_ZNJh^BR@M@L*nWuk>#A*Q!x=SJH z^QQo*c9O)2tuRRh<-JW_a@ycS61V4P&84Ch)1s$xvW76_IlBY!zqapFb1ELv9uCX z272W9CQ0?CsbAyJO?KPP_E-cnu1q9ovwC6@=(WIrIs+<0-#}^=EHHEoDvXSvs+}}| zUX+gvH~h2)&P>(AV&EA~VrnpQM?l!0M2JQ6H{vRVV6#vDPF zrCj!Q_v%|y0VMP(2k-TmAx@>e=g=APn)jGS2&-UmlGB|sZHD{2*WnaKXrNaN#kxg& z9XQNFCFG%1Je=w;W5}U` zqbcUs+L`D3wU z2#NSXG1C$Vmi5&aeJ_C`CMN3|n(A_>oYi#TaLVbuWf`~yl`Z9=Gm3%D5=xeX--4v9 zs!U8z_(|+L&w%8s>8$Ddhgq(Wt?isBlLW$s)f{+|26I@mrr5O)R2VkdqVD@_3nHx6 z&$O9h-rx(CV)mO}l}8)6S>?_0O4`~B$++%iiIU}5Jgm8n)fQ7MiWn&Jh60P5SPT_5 zw77+rwz`FvFQ-ce`RBNWizK9a`HmUdT%YvDYb;WDqZU6-vLB;ahpJ*t$+cxV%Q9X_OO%N;Cd*F0KLVnv@iN(0 z_d>A#6}+pwqnWM$f*Cig(?gVM3XI3=BEd}qeCBvly#Wkw-A~F)hTY5<&6v#+r+5wJ z$9+XCRQ?7u=+fK8Zm5O(Nl(!=?9TEcN2lp!~I+VEMH8jvno- zak-?Ni;MWDd{Kz23;3seNljxs9no_psuM7RcL6(;ryRF41QRWB5*HPn=w%r%OHTB% zoR?)MdO4Gq$LBuU#5?n%YCV$jjq%Brg_*zyp)BO^|)!u{0WFmO=yKu$- zr|J4ulKV4k9$g`6ZfdrZ?EekA9y`bri*qyVTVMGztS^*u-4W--TyJra6ye1sq>aF1 ze*jsE`t=~gmTl>V64F(;iA7BMMM@%3{ChS*7fZxp-AbW}AlVAoe)M-9hZC1Jc@0Rp zTpL+QsJ2?XhNb4!TYI?FYiQ-w@p{3tSjXtkxvf+ur$+xJ{kgZGAUBs7`P%)Q zHYu1=e(@fEO0hAvw441IIqH5gSY8+`Z!8bK8{0>)+zAEW&E`5!YV;(+lZc+Q@T5gg zR=mWc74ilNy%e0Wv9gQmRbX|dMrRJ$<}&^$lK&i)Vt-rhXQzOPm*KpZc|BIQBI;Hh z-3pVdV2bJ6j0?+6*JjkyMS3>lLV8HYX4KO``ZeRi7Sk3pu?=bt?`Q`sl_roWxhth?gditc##1hVmgtIE`6m9z1r|wHTC2L;( z+(J^Pf8doRKO$-RO_!WnBFrq|HK*`MUKm3QG^k29^9r*odqJkf{}@Z4VlO}#JTr?~(PWe%!_=ag_2 z;;+ba%J`||uf!t zVqU$fYU1o5KP_Ips#r=2B7R!EdVRXwt5>5dym~cwwO6mkR(bVm=vuE{jjZ;0l8kJNX4ef@|xOts!J02!P9u63S@#dHNZ^Ml}Jf@or64a z1F?hTc#3kLXeE_>pV#_pERFOcwevK6mwJ{wQn&y3^RLF4;Htb(^Q_cE_{a-)(x~Cb_0)T*FZpH!)Tr9wLXrMF8k`V^LlFc zskX5rwy`6!KnZ@r1JZk;g>+LpX9U*$UM&Y+Q{#zR_HbP|OsLgodvDBJV*_3?8S(Sxs%r0f8I{dtxL`x8kWoB~+)p;g%t=T4kK-NEp zH1_Q443rWki|(FD03TAiOAaQ4`>}MBR*dWPqCnBS3j*%ENNRvYd}$#*of?>; zUyQ8jhU7wy73_+Z?vCQG!SbB6Qdm=P@Kwz!N-ONCnHIRqwt#h*Z6wn~O4YlI_@~IU z(XYBwej79}e+mZkDA7eqhocpH-BMzsstq^>vlVUh(*_ObSGAK6E?vtD2Zi6VSz{g=wN!1ToZpG+KJV zt$56*1%!YcJ}oREAc{|K2rxl~y{djW)KCj^8sj@cQEaILCquWW_c|mgeJxtSXasRn zoWOoH4jcEnrH3t79d7J?Q+|cPTlR4(O<_^w&dkO}U$l_DY-C^2|7Pz?;G(M9{|5oZ zbw-n-(wY(r(~6`FMQcXD?#Q6zQj`@Si;&0=%(#>#I8e}S%68jnxAnChTR}{4OVlha zL)tH5iCU&+&j0(I^W0%TaCv**-~atB!-xCav!C;v=lh)Xo+FkwFpY=z5WHgnv6|j{ z;XMM=(0DcB6|?m#>AgSRBjsxtUN6QZG;9aZ2rtn>13bq9+UxsxI5iSBbs8VWbc^D5 zAd}zFmYT1%*t(TL*)0c=_qS!Y4t}Y9Lwh7zp^oSOK9M6s*J;?GW-NUJrX%O}u1xK8 zMo_h7_|5xe$a%kPO!=8<%C8rO8*Qij#EfA3dB3XrFz;8GiWxuZ*eOGQb>EU|5tD#8 zpYvGLe;rSDlqdM+-Hz<~`{vz_bUJcW@UI#Y9NBgDO}ZWF#6yCPrvK!SptI>eMUAzK zp8AnRJD&dik)gPM?>9{HF@*c~9XVY`^E!KQ%mh#WjiqsCY^s?5qq`ZhTEAz(1mFM7 z|6wr3Z2ez2|F;_Fe9QYPPXgw%FZWSh!Sv6C~fFE%#2x{2mnuzfx@+Y_`IH4fdD@jtuPeFEV>N#>il^11rj zhX1r$KeCCXCQ8naWzhUsd<#vr5Zp1NBxeSwcZL3wdnZ0+30^nAw|-#O*AM6h60v^J z8!syQ+?_5TV0EDL<%19`0(823&8E+3fS*t&esz80)BLtsY-w4+HqIEKNovlS}L zB4Euyggkl0?`zAklwA?_8?`s5T_KcZU;exg6h=Nq-ILdWZz z9E}$(2l|zeKEq`V>b80Q2+WtA@=bmu=F3K2)8`M& zmtEAe%8U83zM;vOQVVM>?^*bTnNaW;BsVVAeIkgjv^#*uM}~ zenl8fNQzp<^Z+q9Rx&tNR$8pAv{+ebv9i))Wu?W6N;|4>5Pw_0e-d+_`BFwsxFT7o zYL>U3FF!JVA?qhPS=(v+#XBp}0z*ZgcZzR5zJhEZShH#3`=%3}kEiK)F#(Udu;JTU zs4?RZIWLcjku&aE270M9H!qTc?t9yTB#T#2UUc=>>iDpqBPl_@A7v9?!fkZMp6L9% z$R=jzMJ|!C@%jGq^m-DQa%TSYIQhSlKmB>_Lg&u|c}L;T96v`r<4phU{Hd-+@4t10 z0`KZ-Ws`43gDxk*5sB4}Axia*5GAT!ss1)Z!R<2gPZ?CNM8O9xFO6AOttbfuP3`~(q<-D_QJBgNJ zV2Z}EoW)guk5XP-CkcJm>z7p_5&rorzjq6KG}-XMuTN@@w*JxxFwi%#P!@mn)7M|H z4ic&-RS7$B7N8%MYi)t~>5?Mrxby&5tq63JNT1Z2rinTLX z=NpG47K!~#bPZ2Djut{9n-natDmVvh1Ga0`3DH@F14?QjC*7#-)GCNXAgW8eXlRd!Es z7&@e6qL|>4oe5IPhP#l+-a@(RtP*IUX93~`H!3Mw!^~y1zDsfT( z3|L`OsL-ND#ha{AHD06Zx&rI$RH=#Tyd*{K6;6j5(4_>BuA>wdSoRgRi+mS_y|gD6 z76pw!LG6LW2g)Am%~x8?Nw+O-PufR>8n%&Y5ZsJV2B9+B7T7Ebj8oZgK>_L%<0Mfw zS!S}6^(q9J3riv`#8<@$aiXv|Jz@!Dg{s#INx~q;4!Na+laR|!ON{zKflab@fed;V z1s>N!7MRPLpWq3C2F1)a38MuPP2${{Bu7A!shnoiH3dQ)uW4K4Xex3XCRJ_fN+HJU z+Z1`FPn7lgmEz4s-mlkh6V-1HBo22$;K)f)!LybgtGFSuxIqd&JdmYL?%t-fCcU)L z0(!?Nt=WfLJ5JLi>_)ULtVz@_^uZDl6JfWliV}Q;Tz8_PNVl;-@1_FZlr8W^CvcEN z<7mB3>z5=Fm1>bC4yN}IS>#MyaUkK_9~dQVAmNL;>m0t2=V&UR*-vdjc;aB&Mq5Qv zi6;WWbtHYz0PP`6_fkp-3;AZHOp?x3j9f|xZ?)sJ)xniiGRk(xHKa7VImM;{^F z0?)WJgw6r&r1YQpN)J)z(v#40lXME{YTVSW0~)Hv2WY|4PAgmjI!x9#B#M-cD6*@o zUf(zi&=!d1iSP-W;xmi!o}kkh*VNQOS=Y(75=|45!y1}h-GY`bvF8^1AndlV_uPVZ zvxglEgQ#aJX%&~0%7RsSq3oddQ68L@Au2iq2T76`P=pL`YJ5+UC9S8DcC)F)Mbr@? zI7{s%IM``ng><9DqHThp>u@d)mSx3#97^C6QnwIUl5dD^Bw-LmGWlt3Ec+eVB$FNK zu(pyd8mD+a$v&dQHXLy)OKii;xhOHc2pvu>x~SX0-Bj8)%DA-AxSN4ENC%)ErL;nx zS$lQ&!}24zv%??DqJ;`Twdu8jo=4j@7>of=A}FH-XD(|Sy%iKrm5Wm<5~(Yr=~1C_ zg}|a_LDep1bNse&q1$UOpHQO%qT^Re zHQ^U%I!{Wqrc3o=u4itO1v8IQ&q7r}(NdSICzU!{V)%_NveaB+i{4C$Mj8D||3;Z) zABE!@jt~+qx|*V{spLm=FL45H;(oMYda@XD7(3TB2oKA|os3DS__WF#XLM+&|NwF}xsW-;r zUM0mHg1=v{eA+z-&X!4ywx2S5l)8r+^L5C2(>q#1>TbV-jS&*#I5LB{m`w^zMMe6x z*YQP1lwEL_S^?Q5%O>1s%Qn1?1f){YlaNo;QhbPBLnn%Mv{Qd#*1G$Dw+ zh=xUo-7ZQg(Am#Es9GA^2m@qa3_(1>bT5(+dD?P|kx^n`4OKm5l4LBK)VV+E=N`cX z9&-o*falaB#vI9d#f$3csN#Kt4kSw>FQMId$c1d-7-vy(yrIHmTPCN0a1pGmdCG6+ zHIJ%`0%ru~jr3}DFXz7a`-dSwVx)!hgNXylqUuGZw)WM;xV2+#m&%o&OqHK(AG8$> zIN*vd-xl0on`B&AiN%=20G!B7qnQBAHV7sKV4?vp*|355V1F#GpT;3-iHpc~E^H%E z+9J@%$|6)U)ofybHQJ5|a>I!3b=vwq=^!mP2y~$J&-- zSH;N zTYO4Bqzyj^nDh}PVI8W){B9ikD?Yh7KLJ-K;Zu29b^k&eh8fF%SE}H}9{5L`>ZZ4$ zzqiIJuCL&H8cSy&Qk!Zdi6UYB7SmIHQ&gM93|Z?G6{f~`nraY6&OAkhz;sc=KO2F9 z9r1_(8sl%ofY1rae=7!rrb{Jc9(*hyj@Skr2OCfdgigrTV>od}A_jy`$p2e0Aaugq zzZC;Qt3?nQJ(5mXK{J*#aoK@HK&E8`s_d2i^VP}`sIss3H{y{IsIvF;H{y{Is1<(v zIYvdxNnN0YI3*DS{>TVa*`WW8{KyE@rN^J2j_XTCpvrdUxbovSS*>dVluJgiM!N`? zsqqG~olr34LJ1WgES!snsgu$7EH9mUca-sscOzVs2PX+k8~ z;b9s_Uy)vchiO6*+2LUtmr8bcm?q?7FLe>w=l{3TWgRk+G-0bQ>jZxKnn8!vNugVH z*)asP;~4(qbQ$r1O45jKZGEdoKB^ibP1r`4{WGliAE3)R)rRFqE2q<~o#dkk|4Jv_KxNPuop%E<`zpGDN_pqqz~hYIDBZy0jiHU| zY=ibAWAIbHt%W#>>O3+AKRo!w(7Eb7-WWRX1|Dw=op%F|jG<#bv{#*N^zV_8bjXTh zs?Ot$NA@E-?*<-kJjdz=9&bDysLnR+^zp`1AyC(OH}H7lIaW9Dc;h)%H}J@KIussX zH}JehxxH&dSFtr$twMRNmHBx3RL~_ikm9+&PH;kwe`z~L(-=E%(6yI~TXOB5Ue)$; zwO;t^c({6G?mCpp|2RF>3A8%s+W2Xi&bxTW$%dm0SC2P_{~vm4(7HAwsiSxCjD z+w_#LAAP+1sSv0;5k1whUXXff4RB1F2FRxIq85a^%V`s+37;1!DvpuwU;uiYIYr=v zkiQcFg-*cC#y_703Y`%4w_-r(1hXE)Khv;K=!6J8hGX=DI#iMrnl5Gi8+<_Mgy`dp zp+j*=z`in?tVBfAyTt@OcY*c&h2nm_;9quj!Imj;K9I$(euWEnvC+&}GKZvzK4r|q ziyc?t&^|28C)=uop?=U$5C7j`bhfh~FWnk24Ca*p2T@3nFhs#J zXN(96H%8FvTHEPhWzccPg;n73ok`zuMuBC<@tuj^aYljl`SG2}A4P%bqCndEsV+B0 zVA;p7mZ^n79l-;@tPgLnVTG7NGg7f&6eI~B*~15NiA@Hy){q+uiF4z|Mjo=U^;F%O z#IN1=6VA(M|L{mHKzzgGx&#}^6?Ki@=LI-z#Y~f7*jkR0J|-eD{eyv~-e2(WvDL2a zj!XajmbJxOpla#Yw0Se{xm@1)es86ccC26j#0P6|W}#9^9|oK^xuoN^v%Jw z0oU9M6ZVhNrw3bhUKk1!_K(sR2s6%!!j%_R>>s5M5$+iO_T4aH|0sQr(EEa3xDecm z{iF0*!a(JnD_}bQ{iAKZH^{}&NNvW??wtzuhkm2^^Z|C8`1HZgw0o5F0iBW6st+vx zrw?@9)^1T5!zKBK+L8MUQRv`m+LyK#sXfL#}FN{{G4h5T} z>5w1`REQOa1SvQyhz<#|SYS?tnclG!SyUuqu;%09zam(*7){;b0}+KF03xy=A}b4qJ(su(pXW(zCB=v zVva@msGQ@8Q7GqFl#j|eo*0E3k44LKx z!VbamwxIGrd29xnR_bMnIaUc--2Frs=UwBm9>&d^bEad>yam-*a1F`e6eYb2J~p5a z-*8q+^BFVi2Vidmc9!D&%eb;b?i~Z@1Cegt<<%hL{-PGleSd9-ZcYoI{5SIl9 z;@svMeX{_1fUBA&Z2YTDYbNJ|aUNA}xcMqvDsH_B8xQ2I;_>S4L{(D{s$0eF^NoNB z?!q*de2EvjOp7K-aNw`81Un`SIEkE^{?dKMlJ{U#)K|kBVOHqsz!zW=2D0h2tUotN-?X! z_n86>aWVVi)Su#wu|MGgGrFmfZ_ZvhiM;HGjj`l)crX2WF17}iHc}Sg5u3vEaW5eb z0Qv&2sdR%fXfpnj@Gth3uEb`ofLd(kLc(H0Lowy9q*dh#iuxKC&7CeTnhQQ?#HS=k0lDkzt+(T19>S?w(}ZJ94BpT|$f}>^ zt+3RMAGi?%_7dm%EGA2fX*dVF3LcGTQpv&f#mbma0P@Urw?c%?yxSw z23d&E+u_NexIf)k@*7gYDL=SOPW?<6?ai=DRj;PO0lo6QKUZTkj+>QINN3aC}9x=yRb$AcqrpZrcZQw?|nNIk5o2J5SBN{qh9esx5r!XAFXbN0*E995YYvp z#94isd6w53wb8x*0p~JAGpamLUEVxGkC^YrgabCG<2nbsx`q=m)2A|@Y2PjW%S&Ou zfuO_yg;cc$=S6B@oVpGbUjY*o3EiR*ZB;jmvqeM|5!fdyh0UF1!oJ}J){-#DJaAV z+tdITlEzdaKfl5G2{!ykVJ|h-%l~rY?X?^SV}iw z3%^1;JoaT9?U2vfAzzzrV(rkv+QCKIA(^y8KK1ldalL|$SgZPl04=f!O@Td$P#Qvt zsJmg-<_LuWxfwnZ;6-tqL)2~}BJz!RL;yrW0wan_q0U12NzHKigqkrRFx5#Tl^kkj zU=(Qa3aUq4&7`zZGnJ&h{mx_Z-ycbO!me(!l}|I-$_ufoT)cCUh(Gw_tv-RE`b?y) zuXlylQ7UMa#U@5EwAe%0pz(4OUJ~hrGL|U%8F-;?Llpwya%Ed>EIAoyG`7}S8@o*y zJeHQ1eny*UEL}ow?)?$Q5*$TMZ)W2ibjdIdkBu*ny$iQ&lFp8FS9Jx?&4?2X+(v78 zY?=0c&Y#p@by)V*8eJLHyMk~b^fk)Rz4HE93{B6VFAqHrpg(}jQY3T=D;cz>(*N{Y zD}~yGdjz?o8?*JAKfOj1`*+u%+b`YdO7^8uRenPe;tkcp!xuq8q1`3!0ofQ97n;%T zrhviV@8qleIGeGh4QIhlaEAI~f?4&50L%iv!J@TfOMKrVGWM0C?zVzq#K8}lYcIlw z04PAGekY8#%I-U3Rhgp~{KLFfgB5Mxe)xOLWy$+Erf>c3md{T2$j^y2M)D zq^0aWBtGgFaiQL}UnsIbiRoEroBq3BoM`&uj&I7srmY=j;qi7^xUO9mEOd7(7$ECB z_>$HP5RjDGlJKRV^bO&0{kOc8Y>&3%3Y{Vj3bLMCP4JrOlMqHoY(?K9zKev_9SjYC?ba zfe_bN^yr+yirTHYOBB97r`C@ed%nzGW2Z#1Z) z-X)O%Ie%#=%*89H`mI9H#Ww!twPJ>VTeh!|7f1`m25HII*hX4#TaVtHLR4Ns zo`tA9Lkyx;^bx$MSB6o`dN*F(^GFIx$Pyh1#E7a_P_;>5nW44fi{R3};vrv+Bws=R zY@UQAC~kxu9XK-thuV}S^r+Nk{&Iu_T<*`_Rtb=GMB=0UBqWve?K=PJ-__h&{iVpE zsB6+;BmngDi{e=sg--&wnuQ45A>GF6A|Qhafz6dpZ6tuzR(lE9y|Z%(K(EtJ0<2rot^#(SZ2|Se{qIqv;@-;+=JYqWUxIx%x|&B9b`uqiERU zP-0AOB;$?NCDkV^ctbCcZZ^&qE0RD6^|JHhfy9g5O##kx>2Wqa`q2ofG#YznJoCo~}fmTcZ_CysWF!@ZO=q@hj&j!z?@p$m`A+NPGn=$$s@$XJ41acyEDbyP(WU?80# zXJjZCddBD|K;SS&i%`F`gP64gJ48%p%9wf?OK%K@WbE?~?J~O)0U~4tL8`RJ0{s_q4tGnRyocUXA z>7QD?pW0$p8r>JeGyDV>!A@8Vf(2z&iTA|Qh|xmAsd%OqiGnj*Ly)5t$#1Xw>^y?2n1U!XRWYA0B(kURAopJVkX%|@SJXwf$(|7PMEL^)jCdR0>(Qe(ijcvR{ih{l+JH zf726&n5oZ}FoC+8rNZcWP!f@lR(vIOH-!tW(sF0>eEJfe`YXUGePY3bd(*P#q>P&+dsYl2t?#F2x8>s!rfiTex2K2ChVC z_>=9RXD(%Q20M)qPNhY9xFT{K&yJ_UK#Kf4H04TpDZ!r-A->5A5=ma1mJ$8eHamCA*5LW54bM=i|uq<28{` z$uvaQl!6C(@>#Xs#)%#aY# zC>3F#3XJbwUo0j&SHa3(Uh$CyQWam#P78pyF0r1VFi;#UKbFk(NY6fSVOfuHWpM)+ z;wbMBm8L4M-Nd4<*w z-VP(k5=kBbQG>U)z)Mwm@Ry+Q-Kkc!H4^xT*M2fRzih5*-591B%RfrT{{I@9T4vY~oE9LBFBQ-;v`l! zvgw7|D1Zz~J=t1GprCn0v)!{y!8^^rSJD(q?Mg5STso|HYl}u-XmI^OQ#NRoF)v)~ z{R>eW?=d2PwUXWynlW7O4Lv2sV32X9?;2XGcvOnho?fMRLX`^x47R{^-q5|H$UhDi zf&V$tlp(hTz7#Z7B_AQKeSs$DwfICuSgM=6q0hh*c>l9*7xS63w>LCH1bvHqVQLf` zqA-Dp4APmW$+T#dWXGEsY>%{3*9G8_`bqJwESeuR%;4JRxuQ$p$}z+N2;&t2Cnj7L^E@rw^-rk$KLhC-e8)}FaJQWx3>8_8fc*ziGwBNVSbF@ z-?%P;wSs@Qoh`~u=UIdIIPzW`c2D(@gbFZQQ&0h(aXt>O^@je6+7ldB(mzuI*C?LJ z!-lQ|Z&wxzb}Plz#B6WqO8CQ~9kKXafcOcyD6YpT@PzKc(8&ORnWjh7av?VE1756M zg<3`sXM}hO?jW3R-bJqw{k-hpy}xxaEQ=sv2B&yg?n2@MKCFjLcPwOjLw~x2EHG*9 zi;3`zVa_^)7T&z|4E9P3Rfr!_Wr|99@2BAx=XSFh;k}`EBVIoxp=S=1;`fH$b`19s z$8bNVb9eMoLuet+M3N@Iv=P%y5X}QhZH-`@x29PJ(_SP6g*c@GnWV44}y;{7aUZ{b!H4pYcj%)$JxkPc!YX8+aN=AZmZ zi}GSW2o|4f)BwpK+Gc|)J}IW}t;W)gbFr7zVp7sqt3hQof``^hbn~!(%gB35XaZUk z#mwv7E#g>SC`DIjWq*MYbjv9V3TFX@3YBt&9JX=6y0!SEDC(E;oRIP%>bj8$LAUiT zkHB3xLEh?^grNC*OT7zvtDiPeyD8genIBqrv(VUj4Dv-C!VlnqmhZ4g{*CBztkJ&9 zlmpKSIC(1^^t{QOYLE31+aCr}?l@

    3ya}VlK)(AFHu0Gk20{0JMhXNRO^*W*OSY^gxWUP{r7Gu%UU7+;)JwBid{` z=q2Q}&E5kenBL^?uPeTl66{x9CL1c|kyM<$ACQ|mGF zX~#e&f^H^?q|t13Q;@CtyV1@d48;Nz_phcbqoYTbahEa6YTOl~xL2AKcdg0lKF|vm z(c2W0BxXq>C9z17BuT0y`GS-cK^ElOBKhW6RDqWQ3*zh}9mp)-XyO-djzv{?DHtd% z>0Q3n%QwfOM!YEARawU9Z&vR$F6d({r9&vOBf+NbC6IPnWQ_F7C=%m>i^K7lA8yKu zGcJe=HxmI%h(NH2(6JRDXrzhEryULL*aZvl?lN2Tj?2KuE_;oR^Nc0asGH{g)dG_d z|5uyvNHOCvBND9LjsJs)&rw5wx?#0= zZWPb2#Pd7xTqB;F#Pe(M{9ZiQis$FzxlKHOpcE8~NHa;KnJUs0wbek0MmJEZ(G8Sr zbi=^s-1u4@Fu98(q9kB+`Ne5g`Q^ z5ej*u2ph?U*l_|30&Xn8kA>tELAQ%K+Aiv7yQrh>-vejs@c#w=x5Lk_Mv`UxUj?CA za07&9K^Dn^W0$e?HJYYEY&Q2n%u9cY{E&c=5FH?ZQs|Jqgq#XE`4}qU+Mt*z2Mr2E z24ayUNs?4a@&)n1wV{lvsK6rPtdemGxHd?BQ$%IN@PdKDOCw%o3{}22!9J9HwJ0Z* zgUUxb#pYdYERFF&7N8(FIwTw&5{?cDM~8%?L&DJ^;Rv7k7y}WMj|KO|l${fXdv16> zq5kdgA_VUM_>FdThh5#P)GmiRx>(iddSH&vp!~5H9WNX%Y*SZ=BRm@v_W`P^QJC?d zA-wz7RH``q`)dXm9Tq(12uKRyL)Ag@lFal>ri$BDM~`}XY@tUZJv4f>;L*8gHVN0= z;@O%0*dbi^h-YWIq*=J`rTkbd^i)JI7sw%k>u?n!P_OIhQw|csi<8C;c?e;yhS%0 zOIeYhKjA&Pp+@-cs6#}4b_&}!{Rc{ZyO7`QLVmXk`Q5&PKz0f}QiOh7Mh5?<61-9=IC`h~n+ zEfjZ361~q5Fr7&9D`7`C+O>kT82&rf*l@Uwf-M+_?pZD6TIlZ`IBJDUAyxQFxR9El z{_B4S6%H1xqKX%TO`i@Q^*1`O(5#(zVDa?<_73AqIO>D;3a2N|dL)9CT_PDYc;AT6 zxO{{60){ZM_T z?%XEEo!i8?^Iw&2IY}ZVcdt-iczL7(HkgO%C5mwZ$@91qQIt~@B2uA_DAFn!shrk0 zfk-j#qzEavh)}2(im;Jvh|wnyS?jn{)Y>XSq;2f#1kDpyr+t1K0PJl>4g|i{4N+pF;#I)l859@ zJcN6ng44*oQFpJ>Uj$3^=^h^fuWdyj*d>sH@uHAvi4=?%BQcGqbkIHePXk$}O-N^b z909Th0kQ^tatB=K3}h!VcR@1OY2T`obdLeD6G{HKL3SdM9us6I5?MQtbu_v2H$Wy7 z6KX&Jtw8{-!A3x95I}3N5zrb0&>Cz6v<4k$4FYHdqXAnU(3m=L`1`tyr2{MaiH& zEUli@MQM{s!)et9ERV%V!SR<- z0sfryvDEhh-g*ar9ELT$!Ar#RQSp3EJZGOm_H)JaX7QXao*#>6k$5f?&l2&xT|CX= z*-tzN;Mr!uR2W*<_mr64yI<&H*yF&q-dm$q zc|&6mA=bgXp<^lj&~Ra_d%t^-p$c+lo~C#QH=YbH*vN?GtDVuy;K86h-A^p=c3Xx% zv0)w76njrz+64kYU1W5&akEeGs5h`Aj?K zhD&X59&9Mp+Td)w1t8wq-~xWD41rOZS%nCD-$)^Ag90e!R(rMg!RIMrdyrYT#D;_3 z-{_VI7;q{wjtlH)RX&JrP2qO~CF{nK#-K8-^{UbWg5dU4*t~(!!ZsiFmYcs8C!PuTiG_Dr1byTt zgS)|dZSXIz>6!c)Z|3VJrFe(pphp^M4`P-wFu{5 zoKIk;b!93J0-GstGlet5H=Y!3BxvE;WQQeGv$tAZh2288BOtA-CfU@WDy2MVb@OVl z!vfLME*ITuQGw!PGg{`iV8PiN+P6QI_k;aNM11#(jR@G3>kWO0?6DhRxZ=(TkA@pQ z;-hbAlkE7~jP~c!*D|z;p9~REt3>V>>$=`*f=t@5~y9!4O`AyPy)|be5D&OCmt#%QVO1{2ko?`+G+0Z4XuHks#}1zNC-m7 z+pq=K=my5mv4Z(*u4vTV#Rx_pn|-DQ!_8;7j^L;Uze8vM#`@?E z-q7)|qOGrPZ=lQKOLLfCn$95zd5a9`>h4JnKpjLj_t*V;L%aF%-rP0nYjUL>M%UqP zKtR%Z1AXC-7)EjoT}6f0put*?)(Lgm^a<8E^tz?(P5K!a`*Bi?x*I@p1#7A(b}e07 z1tDs??PDfXFX0|n_v}P9m=$+s7-Tvz%p3X}u%)Q+_{u!qxO}6!(TvMS=pScjRnv{C^g~RzQ58~oJ<5Ypntkc1!QoFqLw_**neFF4 zG8Fz|YFtjgT;#RMMH!{UxmY3JeYpra&Ri^uYE4Qp#^H9%;HRHN7Qh)r`J*1jJIN?A zOS*}ehz4TJTWEv~uCCtDo=B)wJFSHVI2Fnqm2wa|066pX?hbR4r8`RF2@b_OeFGk$ zy=BDCT6ajeh6AkVr3=!)mRaHUGZX-HHL0{ZgtMnxM_Y~W#f9`w^z=eQSQTau#KB~+ z=!)w@iV{6Rs}f`CoM%{7TQ4PMLqSj64j+PxK4a<&y4u{;5zXJ?06V#TY;Du6h>&Ci zo6OFwOuQC7#gPH7feMnqMKi_GN%1IFpJhEE^I0R6FjwHxfSTdhyqBq{L4zYvW;6^U zj|s>l0C1MiK~a^E=3oUG=^s_qq8Q)k9sOz-gX`DfQb#WhX#RuJrLr4k*lyajP!Y|i zYJWf9e1|w-js0_jah=A z26d}z2EHwtbE8&_N1ZEk z&yufQ-IO~*Z+uDA9?GHfF$Fe;JGVN6N;bNBY0JSzZvXTGL&l_ED2!3?jFw}otDDx3 zq#h>_ZvuD2VXghnX+Z%&EiZ>Kh>g1lHGo1HOMZd}Ivvu}yB92)K7~=2|Hnvu{ITWq zsz0`1ccj!Ip5RMXLC?4c|Goq{tPyfPRq?zUZV?M9JF5_0-735MwRlGr$ep7<8y17HX`;*{tGlqkBw7H?=2UIF%A zsO=DZEu(!x!w?+&QctWeUO_BFbF~&504X1oEo3~-Gd5eBL-`<+H}qsgvM(YZrDu)lLUt zmm_fn8>Z!d?^U7_L#Z7_rejv4g{YA{M%hiiZQiD+s;E`QXX4cA_^7YruoJepCC{0e zYc1Y=MP?p8Z``Q1;6qtYY(RX^I^#3e;ypQenYMD=TiJ6p;t5g@KvF|68tvsuQrx}o z$G2YI!7Z12jbp011{jB;>v@s!E19j*d^hm5=s^yb}E0yw9G$;@`}{sRO$x?>1i9^|Gs-+kNBR| z2s;o#YJT}W;4(|94JP#*jg-mLp-%+6?cow+u+3`Rf# z4!7g2(qO>HSA(|1#cXjwQV>&k1*%cBoS(?c-qDD zD)CgrbC2*N{qGa+vRntn`yuf>ES?e2iQd5*#q)FVyj?u=#dErN4inE8#FIV|@D9FF zJV%RXmUw3S+2@M)JUrK~MHlage_clu-c|>&`7uV^>nFii&s(GUs>JX@3*U~ ztosZ>*zMyy$*NjH64R4{{@7v<+@Pf6MCA>(^qTQ%e-rIdM>i29WM5oBpwZdW_%5is zu?0O^dlZscHLYpLPQUXqr5yOp_qlhP>}creTELJ*oI;0bh%o!m`b6W{O_{jJc`!yJ zhQydndkRmQv03B&KS~xF3dMibUf><1z{nwW>H8f>C9BpjxelJxct4 zzyBp1XfgE?CH;zNm%h@h7k^2AX%1p{Gt*H_?M$OXr9UT|?_#=y>Dx>nV1MCEyE4sS z_Z^(xZEXKK)74BHnf}JK>&Y@*JDWe`@Lw>^W_!InPjdN+nBK^AJk#M!PvdyQnMSbv z1#H&i!`un|ibzcmrN)h@gQ+B#p6b_@uQ#_dzs}|=rj_m7qdDEn+ND4IBpL4nrZ+NO z$aE3Y7nm+(`US_on&}TrP3*p}UHV(N{EbXCrhAxnW&Z_C%}gVhUd41Y)8R~Y{$#Vc zgz5Vn?{jQk!REzm{*29f_=9Y|f!%fcpz`iT)LAO>NUGcav(z%Amx!;CsUD9tH?zPA zLu__h-i*xHoc!#}0&*Ldlb2JNotdHgi-otGteo^TXQr_7Gf&FA$(311k>KabD|F@O zI|`hc8Rm2mo4L@H!-3$Qlb7#unhTwX$DCPE;1G$yetKGlIVUe8bFSIxFwe}KXD)EK z@-hky4)}ItnP+9raum#izuB1uIa%|}`2~*YxtX)fjy!W#o1C)yth9994+7zrpH@)F zDN>;9%(M(q&^ZN;ycy>7+?>oj=Y@rt1qg3;&dZmDq;Q$A$jHgaI~Tdm%tN6hzvg7- z6l9pew2Z>+w3(T{FrrLcKBQCVNS~QWtjV04pP5cf$w+gi4KwFCoMtCj?Mo-aK`CUX z%|<5k9IhGJ!Xq&w-7zaaHxuk~rWMWve`n@7=H!X=z%X+`X1aqilEI9W>1VhKa!{;{ z%=ChJ`OX|io&o+cb7mv`G^%iO7IKm6Ujc2xW#;+9Wfg!^eyq&PL>$DFa|@}O48n|( zz)Q|-s#LPXk6Ae@r?8N65~r9^18K7g$&G$((km!T6XDH{eCcX1q^A)-W~DjPvpbX{ z;z~g#A_tR^i1a8Tl`%|r<>Y2SYzhn0W@MtcIk_&uY+2K&|J+;$qR-886wD$i7xi4| zntmf{$()xqE7KRNj8C}dR~7!(x1eEzx|9% zr!!|(rXwpOZC=EXRu|akkVApLCE`K(($Wb@?d?19-=@BDGxKIRvs)8Ee2{M^;nR@; z=#Y+K+(dYKdnoi@N4VuNH4m3 z5~ZCWF-zen?nF{(u=9hBu#cZhioLB1`HxfL&Cr4ckOUvlCP1Fk%&}JU^m%3oNlrRM zIK7H6yAkH zLFR17OkaaV!8@=vkUc9UsfBYLXbCc;y(2HjiKGiNovwUNU`n=7fa!Qr?fW#LNLMJo zsgvx;Uu!;CLyKIq{iMvoduP@pIFm zWo1#~rr0N&V-YGR(;V;DUJCok)bi$~`@2l0#$LvgC5#^U{x-)YwwIMmVK7LP+CJp$>|9io;>HQ%^|u(av4B_Jx}a zm5Ok_oai3(ej}=aI~-XBj#*O0P0s|tQRAYkX_kFWJwcYUSY6KamRky}9y@09T=}`8 z7iw0}_nIvFUb^2_Uj{=`fy3!YcjS`jh_*7r0ayrj%KoW&@&ucnIOIa;L7{RppiKdi z+B(&DHHEILwn}?{xxoUTk?8#3j;LfNEx*V1Yk>CQY`QTZMOAnk&~= zL;-x_uI$-(|Az1+AxS6sGaJ_{wfv^QssqaS3bJuPz-5Vq&!9AoGzsm z&4MmTdUsRAY?I>|s_+gOWP|$50TSV!?wo6$<$~(e+b)U#_y?kqWMUdLV*x5r;A)l& znh8C|%)B&=b24Zg0Nv(7&BiBA)&+{f>+OeV5Aq!l_(Do6Q*T1zWETU4Xjh$?vN5?@ zsL>3xNm8K}qPGS?rp~u$_}H7F)t|8T^CrXT{;18>>liJ*XefNplf86q2B?uIJZ8?y zcg{0Rf%Z;-U<1)m5j04m4ucboVxf5k#)A3Ogg8;*g_Jckm9b*TW>%;p4?a-%BMX@$ zI_hEsLaF9Z7lq;m-e|CiI!()UAvs+)$P7wL?wtaN>8@Oo3SzgcFM%c+C5i$7g^oFh z7@0aU2l`l&@>iIdj&T`UQ!y06kgmXt4CY8pEn-JG(A*1|5NQy9e61#RrD&uj+Xwca zRG8_?aGVb{l>s%I<;oMCREk&dR*Db&5^qHx%}*a-SSx%nqtRcJZ3dw?Lvr1~Y@U+? zRYNgmIL!IfYPOb?+9~SbOLfE9GH|orjB9k znUOsQdyvvMGEIcSHGGMl-8tZemhEmdZrc@75jf=i;!qq-V5PIQjZQl=G(nxwo? z6m9EyN&)Z=o}<5Pi_^#UqB3-T9?d^A1G<;!l%!23=87OwCfkzCiPl)D4p_#9LH|g- zLP`R?bwF^kVm<#N!Xmv4zhnd_7*FcKoHL8sKH>^@O46wd4hK@DqL6ys==q$S?Q&+& z1VuIqoR&+@v!=`WCa~#z=n}<%8p)a&SEGc(iz^JRFbi(=Q&%4@!HS`C-0vk{^yoPesU~;BT99`SDlx z86WG%VJaE(p7Yz-F|KbfjAN(SyAToiny#K*W{ZnoY4<9-< z+N3N6&OdzH97y*LnW*7IZz)0j{VP zkA?F#@lbv^9vxS$^@^A}$Wbd_+r>*(OJA;z2rk$@FwOiRXwM`PXwtIckjuK6QEN zfJg1(IU+}$#?vlGZOTRb0UF??BfRLjV9iCoj=-y53`ddM4q|GP4=N4vLA-4(N1OVg zQnb;a9q@x=I7U9&#U$hLYZ=;U;@12eT@%O0DWaWhk7Wwq28SJBc*4X9@sw+;-EN4B zA7`CvpJEsVGx9c>np>pI{XM-`jddZ>%|`DLlTzsO&CnMt{QCJALSc%MBF0bli(11= z^O52G{KcVHXqY_ds!6f-2~(~+!C&0OD<)hqDb7&;yj&;Km>QyFeoQY&`v|6nk3n=5tum!*B9Zhn#1-JAc`yw`1Fs-^!+SjpJ)9oXrz3CMh zZzR(y?24yfGMne>_QRxo1)D2%`*WpzBbyDcG9Ly>`v^8$bo&TtpUvhn-9B8}FJ*JR zZhxt?-_K^#Ys`m}rTvH#{6$_gJnG_0MqC;_(mFO4V4a?pkwTqseI>?k#=o7tzS5Y& z6E`w_Y*-Y(ICBrN4$SNQ28GQ*>>k19U^XvhGq!4p-!L|__!ur`GmDL3G@IGGkBF(Y z6pSEQRq)beiawGv-6-=F#?;I-f@w6J8=3B8 z+QQT@Q|8OW)XX%JsfDS+G?{5O)45E`m@a0zgeffn`BpMhe9I>Wy_|k^o}#aC5byIG zF#1jH5~F+Ke-ZP?H$L}^vlrYOQ)GGM`c#SolUiArzA)@RL)s(Ww0t?mipj$ieMZkv z$L@wRr9a&q#O8W-Z%;$meG9vr+L^=Htg*YfojJ0d*}~=!_Mg8 zyDw^Iu3+|Wo_+{oric5h*`f$PP@bU(WfU^CU9|1W?IdO4qE3mwOL z`Cepu9nX5X=!zZsVI#QsMRR%!*dwbYgTnR;*`B`grC&1Jm$JRCAF|oLjO}$jF_-Pj z*fcY|qW0PcF}t*%la}S6vPVvOUQ@ z{kCvC+)Nl~GbjBtwm(Z64ftqD{Pwdw8#^UoDH0c)J%gFedU+$*td}#A&3gHw*{qk# z!e+uW{S-Fq-kP)Gd|D}zic-1elJ5lo4MOyn9FAFE*Of~%-t448JoGg zVpzmxUA`8xS(mE{HtX`Vgw0``pQUU*mCcoGK8?*)Y(AaM&`W-*5PEE&cBy?zsNs=6xxC0DufP|Q)dRh$WzdQifOv30|y)A61}gP zYU9s;rI*Fqus=)YOUFyE8PcrdB#g~EJ|ftx%gJaq>vEFBW?e3F*{sV&37hqLUXmlz zqmMJ_SHbSOTz<&zI^V0PI`lo!mA;Ah~#r*y6tH`+n2SY6>M%# zE7`t1t!Ml8RAc-0)NroMPXyB>rgNEAFs)(-x*7qh&l1OckctOv{)qVOqzug=yFr<_FVMre#c*Fs)gHG1Zuwteiil z$xP=mUBq-L(|V>F(~z;8E>jEBRHj8t7c;G7x`k;AQ&X&rCz5GWCp4Sw+tVVpZ%-Gq zeS5l;?c39Ow)eFY{4zc*&oC}?I`$hB7_9jPpz{plU3vJ=HCSCUFz=Udn3(P~OmNIL zV9$Z*Z}Autd$BS9ZA4X7EC} z8OCRxCAU{#2_8$i@IR^hjhiD!JRkju<=H2T_kQ{3{O?CDeC$H+9T(pn8@HmNY0Z>d z9vJ?@@uD~7v1+|=WbACiMB--_>AKkSTqR$p%HQvHvQ0s~IE zbLOaf`&uW?*tX;0J?lSfdHbirhhBA_{qt*=lzw;MQf+{1d)^hhPrGU0kWb4U?@jOX za@fbGAG+$Ygq0iTnIHYS>hRok*Zy|qH%p?*y47CvMnBUv=N9cuNxgExOQ*gwzW4b* z-u%@4s~+D~(HN8X`gy-Et!w^Zw0rU+X{QVgy6ycrU!3!8PXF|&XZ5-jETAqS4JWCq zO5IHw8kq5K!G96{sp~yrXmL;g^)-`T{O!ugnbzBCo;&5Vhi*7`)S8*E#O#iL;>=f) z559VT;P(kr4@R2z&6@q%y|dSr4Yqgr{m_>`PW*Dsd7l==U2@Jn&rW~GcI_JtGfsbh z@Zvr@;=ipre0>+!g*E+J?8VPMJkGQ7z^0i$r`!|x;N$m&Hs3t!ldrCs^x*mKk3ZjZ zmNR)sPNOZZZq?m4mM?eBop<+dGcQYiR<8q+>zVxzFv*lT)Jt`9TAalKL5#}_iqgBa^1p{ ze;GPp{hjx{J@3VqJ>B*`{awz4b-#U;x%uPZu4hiac*C8CUs&}uZk+{m5oo-gl8wRC;zrW>v_<$ZME&a*BX)AgH&UJt(Pn{glgl=zNk%DutYueiza zdDkFsXi{qUpNmg@xap%W*2Y@O=RCP}#z$kdrDbY)x9Dl7{`~c?b@Q(1G5_f%aP4Uboi_Jeb1OsaBc3N-ada_6Weq9%sF9UG|14 z(;gdj!HDoTX7uP~{Q2tpH$L?1+fUy6*y$5LttxuPye%y!Va~NDpVn_ckN5BY?#J^g zs$v_@9zF1s)BE-8-M!Ciwd$T_OWr-d?xi#Om!7)&YI`@=KR)>8kzfBxUGVHv=LG!m z;qL|4eHxP$ckyk1PMbX>R^7I8(3HaYvZ0tMy!0WS~9#Wfd;gbXRM!vai=cLyHhCZ?^|D}V<1AWiVXu4v> zU5A#Oc6m$1mSMMEwQEt-*|igFcT{hP-g@|%)pw2P`T64Y#lOE0(Qxzg=iL3?SI>R& z+T}kyF=|-v`{pJ+wl?L)>Emvjviu~^KCN=gq8t7gdBN}hs9E@N(e+QwzrQ}`rSmsC z-s(4aeas`T*1dRZm?u@ZO_4mpnSrotgLGPq+Q#eK}

    _$-M@D_n~SV9btX2 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

    DrKnx0IEZqm``PuGdSCZnS|231M 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 CecXBg literal 0 HcmV?d00001 diff --git a/externe_kniznice/teuniz_rs232/LICENSE b/externe_kniznice/teuniz_rs232/LICENSE new file mode 100644 index 0000000..e43d6cf --- /dev/null +++ b/externe_kniznice/teuniz_rs232/LICENSE @@ -0,0 +1,677 @@ + + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + diff --git a/externe_kniznice/teuniz_rs232/Makefile b/externe_kniznice/teuniz_rs232/Makefile new file mode 100644 index 0000000..9f745d0 --- /dev/null +++ b/externe_kniznice/teuniz_rs232/Makefile @@ -0,0 +1,42 @@ +# +# +# Author: Teunis van Beelen +# +# email: teuniz@protonmail.com +# +# + +CC = gcc +CFLAGS = -Wall -Wextra -Wshadow -Wformat-nonliteral -Wformat-security -Wtype-limits -O2 + +objects = rs232.o + +all: test_rx test_tx + +test_rx : $(objects) demo_rx.o + $(CC) $(objects) demo_rx.o -o test_rx + +test_tx : $(objects) demo_tx.o + $(CC) $(objects) demo_tx.o -o test_tx + +demo_rx.o : demo_rx.c rs232.h + $(CC) $(CFLAGS) -c demo_rx.c -o demo_rx.o + +demo_tx.o : demo_tx.c rs232.h + $(CC) $(CFLAGS) -c demo_tx.c -o demo_tx.o + +rs232.o : rs232.h rs232.c + $(CC) $(CFLAGS) -c rs232.c -o rs232.o + +clean : + $(RM) test_rx test_tx $(objects) demo_rx.o demo_tx.o rs232.o + +# +# +# +# + + + + + diff --git a/externe_kniznice/teuniz_rs232/README.md b/externe_kniznice/teuniz_rs232/README.md new file mode 100644 index 0000000..201e071 --- /dev/null +++ b/externe_kniznice/teuniz_rs232/README.md @@ -0,0 +1,6 @@ +# RS-232 +RS-232 for Linux, FreeBSD and windows + +Website: https://www.teuniz.net/RS-232/ + + diff --git a/externe_kniznice/teuniz_rs232/demo_rx.c b/externe_kniznice/teuniz_rs232/demo_rx.c new file mode 100644 index 0000000..ed836d5 --- /dev/null +++ b/externe_kniznice/teuniz_rs232/demo_rx.c @@ -0,0 +1,72 @@ + +/************************************************** + +file: demo_rx.c +purpose: simple demo that receives characters from +the serial port and print them on the screen, +exit the program by pressing Ctrl-C + +compile with the command: gcc demo_rx.c rs232.c -Wall -Wextra -o2 -o test_rx + +**************************************************/ + +#include +#include + +#ifdef _WIN32 +#include +#else +#include +#endif + +#include "rs232.h" + + + +int main() +{ + int i, n, + cport_nr=0, /* /dev/ttyS0 (COM1 on windows) */ + bdrate=9600; /* 9600 baud */ + + unsigned char buf[4096]; + + char mode[]={'8','N','1',0}; + + + if(RS232_OpenComport(cport_nr, bdrate, mode, 0)) + { + printf("Can not open comport\n"); + + return(0); + } + + while(1) + { + n = RS232_PollComport(cport_nr, buf, 4095); + + if(n > 0) + { + buf[n] = 0; /* always put a "null" at the end of a string! */ + + for(i=0; i < n; i++) + { + if(buf[i] < 32) /* replace unreadable control-codes by dots */ + { + buf[i] = '.'; + } + } + + printf("received %i bytes: %s\n", n, (char *)buf); + } + +#ifdef _WIN32 + Sleep(100); +#else + usleep(100000); /* sleep for 100 milliSeconds */ +#endif + } + + return(0); +} + diff --git a/externe_kniznice/teuniz_rs232/demo_tx.c b/externe_kniznice/teuniz_rs232/demo_tx.c new file mode 100644 index 0000000..55607db --- /dev/null +++ b/externe_kniznice/teuniz_rs232/demo_tx.c @@ -0,0 +1,66 @@ + +/************************************************** + +file: demo_tx.c +purpose: simple demo that transmits characters to +the serial port and print them on the screen, +exit the program by pressing Ctrl-C + +compile with the command: gcc demo_tx.c rs232.c -Wall -Wextra -o2 -o test_tx + +**************************************************/ + +#include +#include + +#ifdef _WIN32 +#include +#else +#include +#endif + +#include "rs232.h" + + + +int main() +{ + int i=0, + cport_nr=0, /* /dev/ttyS0 (COM1 on windows) */ + bdrate=9600; /* 9600 baud */ + + char mode[]={'8','N','1',0}, + str[2][512]; + + + strcpy(str[0], "The quick brown fox jumped over the lazy grey dog.\n"); + + strcpy(str[1], "Happy serial programming!\n"); + + if(RS232_OpenComport(cport_nr, bdrate, mode, 0)) + { + printf("Can not open comport\n"); + + return(0); + } + + while(1) + { + RS232_cputs(cport_nr, str[i]); + + printf("sent: %s\n", str[i]); + +#ifdef _WIN32 + Sleep(1000); +#else + usleep(1000000); /* sleep for 1 Second */ +#endif + + i++; + + i %= 2; + } + + return(0); +} + diff --git a/externe_kniznice/teuniz_rs232/doc.txt b/externe_kniznice/teuniz_rs232/doc.txt new file mode 100644 index 0000000..92e2a6b --- /dev/null +++ b/externe_kniznice/teuniz_rs232/doc.txt @@ -0,0 +1,235 @@ + +Library: RS-232 +Author: Teunis van Beelen +Url: http://www.teuniz.net/RS-232/ +E-mail: teuniz@protonmail.com +License: GPLv3 + +Last revision: May 31, 2019 + + + +int RS232_OpenComport(int comport_number, int baudrate, const char * mode, int flowctrl) + + Opens the comport, comportnumber starts with 0 (see the list of numbers). + Baudrate is expressed in baud per second i.e 115200 (see the list of possible baudrates). + Mode is a string in the form of "8N1", "7E2", etc. + 8N1 means eight databits, no parity, one stopbit. If in doubt, use 8N1 (see the list of possible modes). + If flowctrl is set to 0, no flow control is used. + If flowctrl is set to 1, hardware flow control is enabled using the RTS/CTS lines. + Returns 1 in case of an error. + In case the comport is already opened (by another process), + it will not open the port but raise an error instead. + +int RS232_PollComport(int comport_number, unsigned char *buf, int size) + + Gets characters from the serial port (if any). Buf is a pointer to a buffer + and size the size of the buffer in bytes. + Returns the amount of received characters into the buffer. This can be less than size or zero! + It does not block or wait, it returns immediately, no matter if any characters have been received or not. + After succesfully opening the COM-port, connect this function to a timer. + The timer should have an interval of approx. 20 to 100 milliSeconds. + Do not forget to stop the timer before closing the COM-port. + Allways check the return value! The return value tells you how many bytes + are actually received and present in your buffer! + +int RS232_SendByte(int comport_number, unsigned char byte) + + Sends a byte via the serial port. Returns 1 in case of an error. + +int RS232_SendBuf(int comport_number, unsigned char *buf, int size) + + Sends multiple bytes via the serial port. Buf is a pointer to a buffer + and size the size of the buffer in bytes. + Returns -1 in case of an error, otherwise it returns the amount of bytes sent. + This function blocks (it returns after all the bytes have been processed). + +void RS232_CloseComport(int comport_number) + + Closes the serial port. + +void RS232_cputs(int comport_number, const char *text) + + Sends a string via the serial port. String must be null-terminated. + +int RS232_GetPortnr(const char *devname) + + Returns the comport number based on the device name e.g. "ttyS0" or "COM1". + (Doesn't mean the device actually exists!) + Returns -1 when not found. + + +The following functions are normally not needed but can be used to set or check the status of the control-lines: +================================================================================================================ + +void RS232_enableDTR(int comport_number) + + Sets the DTR line high (active state). + +void RS232_disableDTR(int comport_number) + + Sets the DTR line low (non active state). + +void RS232_enableRTS(int comport_number) + + Sets the RTS line high (active state). Do not use this function if hardware flow control is enabled! + +void RS232_disableRTS(int comport_number) Do not use this function if hardware flow control is enabled! + + Sets the RTS line low (non active state). + +int RS232_IsRINGEnabled(int comport_number) + + Checks the status of the RING-pin. Returns 1 when the the RING line is high (active state), otherwise 0. + +int RS232_IsDSREnabled(int comport_number) + + Checks the status of the DSR-pin. Returns 1 when the the DSR line is high (active state), otherwise 0. + +int RS232_IsCTSEnabled(int comport_number) + + Checks the status of the CTS-pin. Returns 1 when the the CTS line is high (active state), otherwise 0. + +int RS232_IsDCDEnabled(int comport_number) + + Checks the status of the DCD-pin. Returns 1 when the the DCD line is high (active state), otherwise 0. + + +The following functions are normally not needed but can be used to empty the rx/tx buffers: +=========================================================================================== + +("discards data written to the serial port but not transmitted, or data received but not read") + +void RS232_flushRX(int comport_number) + + Flushes data received but not read. + +void RS232_flushTX(int comport_number) + + Flushes data written but not transmitted. + +void RS232_flushRXTX(int comport_number) + + Flushes both data received but not read, and data written but not transmitted. + + + +Notes: + +You don't need to call RS232_PollComport() when you only want to send characters. +Sending and receiving do not influence eachother. + +The os (kernel) has an internal buffer of 4096 bytes (for traditional onboard serial ports). +USB/Serial-converter drivers use much bigger buffers (multiples of 4096). +If this buffer is full and a new character arrives on the serial port, +the oldest character in the buffer will be overwritten and thus will be lost. + +After a successfull call to RS232_OpenComport(), the os will start to buffer incoming characters. + +tip: To get access to the serial port on Linux, you need to be a member of the group "dialout". + +Note: Traditional (on-board) UART's usually have a speed limit of max. 115200 baud. + Special cards and USB to Serial converters can usually be set to higher baudrates. + + +List of comport numbers, possible baudrates and modes: + + Linux windows +0 ttyS0 COM1 +1 ttyS1 COM2 +2 ttyS2 COM3 +3 ttyS3 COM4 +4 ttyS4 COM5 +5 ttyS5 COM6 +6 ttyS6 COM7 +7 ttyS7 COM8 +8 ttyS8 COM9 +9 ttyS9 COM10 +10 ttyS10 COM11 +11 ttyS11 COM12 +12 ttyS12 COM13 +13 ttyS13 COM14 +14 ttyS14 COM15 +15 ttyS15 COM16 +16 ttyUSB0 COM17 +17 ttyUSB1 COM18 +18 ttyUSB2 COM19 +19 ttyUSB3 COM20 +20 ttyUSB4 COM21 +21 ttyUSB5 COM22 +22 ttyAMA0 COM23 +23 ttyAMA1 COM24 +24 ttyACM0 COM25 +25 ttyACM1 COM26 +26 rfcomm0 COM27 +27 rfcomm1 COM28 +28 ircomm0 COM29 +29 ircomm1 COM30 +30 cuau0 COM31 +31 cuau1 COM32 +32 cuau2 n.a. +33 cuau3 n.a. +34 cuaU0 n.a. +35 cuaU1 n.a. +36 cuaU2 n.a. +37 cuaU3 n.a. + +Linux windows +50 n.a. +75 n.a. +110 110 +134 n.a. +150 n.a. +200 n.a. +300 300 +600 600 +1200 1200 +1800 n.a. +2400 2400 +4800 4800 +9600 9600 +19200 19200 +38400 38400 +57600 57600 +115200 115200 +230400 128000 +460800 256000 +500000 500000 +576000 n.a. +921600 921600 +1000000 1000000 +1152000 n.a. +1500000 1500000 +2000000 2000000 +2500000 n.a. +3000000 3000000 +3500000 n.a. +4000000 n.a. + +Mode +8N1 +8O1 +8E1 +8N2 +8O2 +8E2 +7N1 +7O1 +7E1 +7N2 +7O2 +7E2 +6N1 +6O1 +6E1 +6N2 +6O2 +6E2 +5N1 +5O1 +5E1 +5N2 +5O2 +5E2 + + diff --git a/externe_kniznice/teuniz_rs232/gpl.txt b/externe_kniznice/teuniz_rs232/gpl.txt new file mode 100644 index 0000000..e43d6cf --- /dev/null +++ b/externe_kniznice/teuniz_rs232/gpl.txt @@ -0,0 +1,677 @@ + + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + diff --git a/externe_kniznice/teuniz_rs232/howto_compile.txt b/externe_kniznice/teuniz_rs232/howto_compile.txt new file mode 100644 index 0000000..de152cb --- /dev/null +++ b/externe_kniznice/teuniz_rs232/howto_compile.txt @@ -0,0 +1,28 @@ + +Compiling the demo's can be done as follows: + +gcc demo_rx.c rs232.c -Wall -Wextra -o2 -o test_rx + +gcc demo_tx.c rs232.c -Wall -Wextra -o2 -o test_tx + +or use the makefile by entering "make" + +Run the demo by typing: + +./test_rx + +or + +./test_tx + + + +To include this library into your project: + +Put the two files rs232.h and rs232.c in your project/sourcedirectory. + +Write #include "rs232.h" in your sourcefiles that needs access to the library. + +Add the file rs232.c to your project settings (in order to get it compiled and linked with your program). + + diff --git a/kniznica/rs232.c b/externe_kniznice/teuniz_rs232/rs232.c similarity index 99% rename from kniznica/rs232.c rename to externe_kniznice/teuniz_rs232/rs232.c index 00499f4..6b0e872 100644 --- a/kniznica/rs232.c +++ b/externe_kniznice/teuniz_rs232/rs232.c @@ -859,4 +859,15 @@ int RS232_GetPortnr(const char *devname) } return -1; /* device not found */ -} \ No newline at end of file +} + + + + + + + + + + + diff --git a/kniznica/rs232.h b/externe_kniznice/teuniz_rs232/rs232.h similarity index 100% rename from kniznica/rs232.h rename to externe_kniznice/teuniz_rs232/rs232.h diff --git a/wolfssl/wolfssl/callbacks.h b/externe_kniznice/wolfssl/callbacks.h similarity index 100% rename from wolfssl/wolfssl/callbacks.h rename to externe_kniznice/wolfssl/callbacks.h diff --git a/wolfssl/wolfssl/certs_test.h b/externe_kniznice/wolfssl/certs_test.h similarity index 100% rename from wolfssl/wolfssl/certs_test.h rename to externe_kniznice/wolfssl/certs_test.h diff --git a/wolfssl/wolfssl/crl.h b/externe_kniznice/wolfssl/crl.h similarity index 100% rename from wolfssl/wolfssl/crl.h rename to externe_kniznice/wolfssl/crl.h diff --git a/wolfssl/wolfssl/error-ssl.h b/externe_kniznice/wolfssl/error-ssl.h similarity index 100% rename from wolfssl/wolfssl/error-ssl.h rename to externe_kniznice/wolfssl/error-ssl.h diff --git a/wolfssl/wolfssl/include.am b/externe_kniznice/wolfssl/include.am similarity index 100% rename from wolfssl/wolfssl/include.am rename to externe_kniznice/wolfssl/include.am diff --git a/wolfssl/wolfssl/internal.h b/externe_kniznice/wolfssl/internal.h similarity index 100% rename from wolfssl/wolfssl/internal.h rename to externe_kniznice/wolfssl/internal.h diff --git a/wolfssl/wolfssl/ocsp.h b/externe_kniznice/wolfssl/ocsp.h similarity index 100% rename from wolfssl/wolfssl/ocsp.h rename to externe_kniznice/wolfssl/ocsp.h diff --git a/wolfssl/wolfssl/openssl/aes.h b/externe_kniznice/wolfssl/openssl/aes.h similarity index 100% rename from wolfssl/wolfssl/openssl/aes.h rename to externe_kniznice/wolfssl/openssl/aes.h diff --git a/wolfssl/wolfssl/openssl/asn1.h b/externe_kniznice/wolfssl/openssl/asn1.h similarity index 100% rename from wolfssl/wolfssl/openssl/asn1.h rename to externe_kniznice/wolfssl/openssl/asn1.h diff --git a/wolfssl/wolfssl/openssl/bio.h b/externe_kniznice/wolfssl/openssl/bio.h similarity index 100% rename from wolfssl/wolfssl/openssl/bio.h rename to externe_kniznice/wolfssl/openssl/bio.h diff --git a/wolfssl/wolfssl/openssl/bn.h b/externe_kniznice/wolfssl/openssl/bn.h similarity index 100% rename from wolfssl/wolfssl/openssl/bn.h rename to externe_kniznice/wolfssl/openssl/bn.h diff --git a/wolfssl/wolfssl/openssl/buffer.h b/externe_kniznice/wolfssl/openssl/buffer.h similarity index 100% rename from wolfssl/wolfssl/openssl/buffer.h rename to externe_kniznice/wolfssl/openssl/buffer.h diff --git a/wolfssl/wolfssl/openssl/conf.h b/externe_kniznice/wolfssl/openssl/conf.h similarity index 100% rename from wolfssl/wolfssl/openssl/conf.h rename to externe_kniznice/wolfssl/openssl/conf.h diff --git a/wolfssl/wolfssl/openssl/crypto.h b/externe_kniznice/wolfssl/openssl/crypto.h similarity index 100% rename from wolfssl/wolfssl/openssl/crypto.h rename to externe_kniznice/wolfssl/openssl/crypto.h diff --git a/wolfssl/wolfssl/openssl/des.h b/externe_kniznice/wolfssl/openssl/des.h similarity index 100% rename from wolfssl/wolfssl/openssl/des.h rename to externe_kniznice/wolfssl/openssl/des.h diff --git a/wolfssl/wolfssl/openssl/dh.h b/externe_kniznice/wolfssl/openssl/dh.h similarity index 100% rename from wolfssl/wolfssl/openssl/dh.h rename to externe_kniznice/wolfssl/openssl/dh.h diff --git a/wolfssl/wolfssl/openssl/dsa.h b/externe_kniznice/wolfssl/openssl/dsa.h similarity index 100% rename from wolfssl/wolfssl/openssl/dsa.h rename to externe_kniznice/wolfssl/openssl/dsa.h diff --git a/wolfssl/wolfssl/openssl/ec.h b/externe_kniznice/wolfssl/openssl/ec.h similarity index 100% rename from wolfssl/wolfssl/openssl/ec.h rename to externe_kniznice/wolfssl/openssl/ec.h diff --git a/wolfssl/wolfssl/openssl/ec25519.h b/externe_kniznice/wolfssl/openssl/ec25519.h similarity index 100% rename from wolfssl/wolfssl/openssl/ec25519.h rename to externe_kniznice/wolfssl/openssl/ec25519.h diff --git a/wolfssl/wolfssl/openssl/ecdh.h b/externe_kniznice/wolfssl/openssl/ecdh.h similarity index 100% rename from wolfssl/wolfssl/openssl/ecdh.h rename to externe_kniznice/wolfssl/openssl/ecdh.h diff --git a/wolfssl/wolfssl/openssl/ecdsa.h b/externe_kniznice/wolfssl/openssl/ecdsa.h similarity index 100% rename from wolfssl/wolfssl/openssl/ecdsa.h rename to externe_kniznice/wolfssl/openssl/ecdsa.h diff --git a/wolfssl/wolfssl/openssl/ed25519.h b/externe_kniznice/wolfssl/openssl/ed25519.h similarity index 100% rename from wolfssl/wolfssl/openssl/ed25519.h rename to externe_kniznice/wolfssl/openssl/ed25519.h diff --git a/wolfssl/wolfssl/openssl/engine.h b/externe_kniznice/wolfssl/openssl/engine.h similarity index 100% rename from wolfssl/wolfssl/openssl/engine.h rename to externe_kniznice/wolfssl/openssl/engine.h diff --git a/wolfssl/wolfssl/openssl/err.h b/externe_kniznice/wolfssl/openssl/err.h similarity index 100% rename from wolfssl/wolfssl/openssl/err.h rename to externe_kniznice/wolfssl/openssl/err.h diff --git a/wolfssl/wolfssl/openssl/evp.h b/externe_kniznice/wolfssl/openssl/evp.h similarity index 100% rename from wolfssl/wolfssl/openssl/evp.h rename to externe_kniznice/wolfssl/openssl/evp.h diff --git a/wolfssl/wolfssl/openssl/hmac.h b/externe_kniznice/wolfssl/openssl/hmac.h similarity index 100% rename from wolfssl/wolfssl/openssl/hmac.h rename to externe_kniznice/wolfssl/openssl/hmac.h diff --git a/wolfssl/wolfssl/openssl/include.am b/externe_kniznice/wolfssl/openssl/include.am similarity index 100% rename from wolfssl/wolfssl/openssl/include.am rename to externe_kniznice/wolfssl/openssl/include.am diff --git a/wolfssl/wolfssl/openssl/lhash.h b/externe_kniznice/wolfssl/openssl/lhash.h similarity index 100% rename from wolfssl/wolfssl/openssl/lhash.h rename to externe_kniznice/wolfssl/openssl/lhash.h diff --git a/wolfssl/wolfssl/openssl/md4.h b/externe_kniznice/wolfssl/openssl/md4.h similarity index 100% rename from wolfssl/wolfssl/openssl/md4.h rename to externe_kniznice/wolfssl/openssl/md4.h diff --git a/wolfssl/wolfssl/openssl/md5.h b/externe_kniznice/wolfssl/openssl/md5.h similarity index 100% rename from wolfssl/wolfssl/openssl/md5.h rename to externe_kniznice/wolfssl/openssl/md5.h diff --git a/wolfssl/wolfssl/openssl/objects.h b/externe_kniznice/wolfssl/openssl/objects.h similarity index 100% rename from wolfssl/wolfssl/openssl/objects.h rename to externe_kniznice/wolfssl/openssl/objects.h diff --git a/wolfssl/wolfssl/openssl/ocsp.h b/externe_kniznice/wolfssl/openssl/ocsp.h similarity index 100% rename from wolfssl/wolfssl/openssl/ocsp.h rename to externe_kniznice/wolfssl/openssl/ocsp.h diff --git a/wolfssl/wolfssl/openssl/opensslconf.h b/externe_kniznice/wolfssl/openssl/opensslconf.h similarity index 100% rename from wolfssl/wolfssl/openssl/opensslconf.h rename to externe_kniznice/wolfssl/openssl/opensslconf.h diff --git a/wolfssl/wolfssl/openssl/opensslv.h b/externe_kniznice/wolfssl/openssl/opensslv.h similarity index 100% rename from wolfssl/wolfssl/openssl/opensslv.h rename to externe_kniznice/wolfssl/openssl/opensslv.h diff --git a/wolfssl/wolfssl/openssl/ossl_typ.h b/externe_kniznice/wolfssl/openssl/ossl_typ.h similarity index 100% rename from wolfssl/wolfssl/openssl/ossl_typ.h rename to externe_kniznice/wolfssl/openssl/ossl_typ.h diff --git a/wolfssl/wolfssl/openssl/pem.h b/externe_kniznice/wolfssl/openssl/pem.h similarity index 100% rename from wolfssl/wolfssl/openssl/pem.h rename to externe_kniznice/wolfssl/openssl/pem.h diff --git a/wolfssl/wolfssl/openssl/pkcs12.h b/externe_kniznice/wolfssl/openssl/pkcs12.h similarity index 100% rename from wolfssl/wolfssl/openssl/pkcs12.h rename to externe_kniznice/wolfssl/openssl/pkcs12.h diff --git a/wolfssl/wolfssl/openssl/pkcs7.h b/externe_kniznice/wolfssl/openssl/pkcs7.h similarity index 100% rename from wolfssl/wolfssl/openssl/pkcs7.h rename to externe_kniznice/wolfssl/openssl/pkcs7.h diff --git a/wolfssl/wolfssl/openssl/rand.h b/externe_kniznice/wolfssl/openssl/rand.h similarity index 100% rename from wolfssl/wolfssl/openssl/rand.h rename to externe_kniznice/wolfssl/openssl/rand.h diff --git a/wolfssl/wolfssl/openssl/rc4.h b/externe_kniznice/wolfssl/openssl/rc4.h similarity index 100% rename from wolfssl/wolfssl/openssl/rc4.h rename to externe_kniznice/wolfssl/openssl/rc4.h diff --git a/wolfssl/wolfssl/openssl/ripemd.h b/externe_kniznice/wolfssl/openssl/ripemd.h similarity index 100% rename from wolfssl/wolfssl/openssl/ripemd.h rename to externe_kniznice/wolfssl/openssl/ripemd.h diff --git a/wolfssl/wolfssl/openssl/rsa.h b/externe_kniznice/wolfssl/openssl/rsa.h similarity index 100% rename from wolfssl/wolfssl/openssl/rsa.h rename to externe_kniznice/wolfssl/openssl/rsa.h diff --git a/wolfssl/wolfssl/openssl/sha.h b/externe_kniznice/wolfssl/openssl/sha.h similarity index 100% rename from wolfssl/wolfssl/openssl/sha.h rename to externe_kniznice/wolfssl/openssl/sha.h diff --git a/wolfssl/wolfssl/openssl/ssl.h b/externe_kniznice/wolfssl/openssl/ssl.h similarity index 100% rename from wolfssl/wolfssl/openssl/ssl.h rename to externe_kniznice/wolfssl/openssl/ssl.h diff --git a/wolfssl/wolfssl/openssl/ssl23.h b/externe_kniznice/wolfssl/openssl/ssl23.h similarity index 100% rename from wolfssl/wolfssl/openssl/ssl23.h rename to externe_kniznice/wolfssl/openssl/ssl23.h diff --git a/wolfssl/wolfssl/openssl/stack.h b/externe_kniznice/wolfssl/openssl/stack.h similarity index 100% rename from wolfssl/wolfssl/openssl/stack.h rename to externe_kniznice/wolfssl/openssl/stack.h diff --git a/wolfssl/wolfssl/openssl/tls1.h b/externe_kniznice/wolfssl/openssl/tls1.h similarity index 100% rename from wolfssl/wolfssl/openssl/tls1.h rename to externe_kniznice/wolfssl/openssl/tls1.h diff --git a/wolfssl/wolfssl/openssl/ui.h b/externe_kniznice/wolfssl/openssl/ui.h similarity index 100% rename from wolfssl/wolfssl/openssl/ui.h rename to externe_kniznice/wolfssl/openssl/ui.h diff --git a/wolfssl/wolfssl/openssl/x509.h b/externe_kniznice/wolfssl/openssl/x509.h similarity index 100% rename from wolfssl/wolfssl/openssl/x509.h rename to externe_kniznice/wolfssl/openssl/x509.h diff --git a/wolfssl/wolfssl/openssl/x509_vfy.h b/externe_kniznice/wolfssl/openssl/x509_vfy.h similarity index 100% rename from wolfssl/wolfssl/openssl/x509_vfy.h rename to externe_kniznice/wolfssl/openssl/x509_vfy.h diff --git a/wolfssl/wolfssl/openssl/x509v3.h b/externe_kniznice/wolfssl/openssl/x509v3.h similarity index 100% rename from wolfssl/wolfssl/openssl/x509v3.h rename to externe_kniznice/wolfssl/openssl/x509v3.h diff --git a/wolfssl/wolfssl/options.h b/externe_kniznice/wolfssl/options.h similarity index 100% rename from wolfssl/wolfssl/options.h rename to externe_kniznice/wolfssl/options.h diff --git a/wolfssl/wolfssl/options.h.in b/externe_kniznice/wolfssl/options.h.in similarity index 100% rename from wolfssl/wolfssl/options.h.in rename to externe_kniznice/wolfssl/options.h.in diff --git a/wolfssl/wolfssl/sniffer.h b/externe_kniznice/wolfssl/sniffer.h similarity index 100% rename from wolfssl/wolfssl/sniffer.h rename to externe_kniznice/wolfssl/sniffer.h diff --git a/wolfssl/wolfssl/sniffer_error.h b/externe_kniznice/wolfssl/sniffer_error.h similarity index 100% rename from wolfssl/wolfssl/sniffer_error.h rename to externe_kniznice/wolfssl/sniffer_error.h diff --git a/wolfssl/wolfssl/sniffer_error.rc b/externe_kniznice/wolfssl/sniffer_error.rc similarity index 100% rename from wolfssl/wolfssl/sniffer_error.rc rename to externe_kniznice/wolfssl/sniffer_error.rc diff --git a/wolfssl/wolfssl/ssl.h b/externe_kniznice/wolfssl/ssl.h similarity index 100% rename from wolfssl/wolfssl/ssl.h rename to externe_kniznice/wolfssl/ssl.h diff --git a/wolfssl/wolfssl/test.h b/externe_kniznice/wolfssl/test.h similarity index 100% rename from wolfssl/wolfssl/test.h rename to externe_kniznice/wolfssl/test.h diff --git a/wolfssl/wolfssl/user_settings.h b/externe_kniznice/wolfssl/user_settings.h similarity index 100% rename from wolfssl/wolfssl/user_settings.h rename to externe_kniznice/wolfssl/user_settings.h diff --git a/wolfssl/wolfssl/version.h b/externe_kniznice/wolfssl/version.h similarity index 100% rename from wolfssl/wolfssl/version.h rename to externe_kniznice/wolfssl/version.h diff --git a/wolfssl/wolfssl/version.h.in b/externe_kniznice/wolfssl/version.h.in similarity index 100% rename from wolfssl/wolfssl/version.h.in rename to externe_kniznice/wolfssl/version.h.in diff --git a/wolfssl/wolfssl/wolfcrypt/aes.h b/externe_kniznice/wolfssl/wolfcrypt/aes.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/aes.h rename to externe_kniznice/wolfssl/wolfcrypt/aes.h diff --git a/wolfssl/wolfssl/wolfcrypt/arc4.h b/externe_kniznice/wolfssl/wolfcrypt/arc4.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/arc4.h rename to externe_kniznice/wolfssl/wolfcrypt/arc4.h diff --git a/wolfssl/wolfssl/wolfcrypt/asn.h b/externe_kniznice/wolfssl/wolfcrypt/asn.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/asn.h rename to externe_kniznice/wolfssl/wolfcrypt/asn.h diff --git a/wolfssl/wolfssl/wolfcrypt/asn_public.h b/externe_kniznice/wolfssl/wolfcrypt/asn_public.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/asn_public.h rename to externe_kniznice/wolfssl/wolfcrypt/asn_public.h diff --git a/wolfssl/wolfssl/wolfcrypt/async.h b/externe_kniznice/wolfssl/wolfcrypt/async.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/async.h rename to externe_kniznice/wolfssl/wolfcrypt/async.h diff --git a/wolfssl/wolfssl/wolfcrypt/blake2-impl.h b/externe_kniznice/wolfssl/wolfcrypt/blake2-impl.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/blake2-impl.h rename to externe_kniznice/wolfssl/wolfcrypt/blake2-impl.h diff --git a/wolfssl/wolfssl/wolfcrypt/blake2-int.h b/externe_kniznice/wolfssl/wolfcrypt/blake2-int.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/blake2-int.h rename to externe_kniznice/wolfssl/wolfcrypt/blake2-int.h diff --git a/wolfssl/wolfssl/wolfcrypt/blake2.h b/externe_kniznice/wolfssl/wolfcrypt/blake2.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/blake2.h rename to externe_kniznice/wolfssl/wolfcrypt/blake2.h diff --git a/wolfssl/wolfssl/wolfcrypt/camellia.h b/externe_kniznice/wolfssl/wolfcrypt/camellia.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/camellia.h rename to externe_kniznice/wolfssl/wolfcrypt/camellia.h diff --git a/wolfssl/wolfssl/wolfcrypt/chacha.h b/externe_kniznice/wolfssl/wolfcrypt/chacha.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/chacha.h rename to externe_kniznice/wolfssl/wolfcrypt/chacha.h diff --git a/wolfssl/wolfssl/wolfcrypt/chacha20_poly1305.h b/externe_kniznice/wolfssl/wolfcrypt/chacha20_poly1305.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/chacha20_poly1305.h rename to externe_kniznice/wolfssl/wolfcrypt/chacha20_poly1305.h diff --git a/wolfssl/wolfssl/wolfcrypt/cmac.h b/externe_kniznice/wolfssl/wolfcrypt/cmac.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/cmac.h rename to externe_kniznice/wolfssl/wolfcrypt/cmac.h diff --git a/wolfssl/wolfssl/wolfcrypt/coding.h b/externe_kniznice/wolfssl/wolfcrypt/coding.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/coding.h rename to externe_kniznice/wolfssl/wolfcrypt/coding.h diff --git a/wolfssl/wolfssl/wolfcrypt/compress.h b/externe_kniznice/wolfssl/wolfcrypt/compress.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/compress.h rename to externe_kniznice/wolfssl/wolfcrypt/compress.h diff --git a/wolfssl/wolfssl/wolfcrypt/cpuid.h b/externe_kniznice/wolfssl/wolfcrypt/cpuid.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/cpuid.h rename to externe_kniznice/wolfssl/wolfcrypt/cpuid.h diff --git a/wolfssl/wolfssl/wolfcrypt/cryptocb.h b/externe_kniznice/wolfssl/wolfcrypt/cryptocb.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/cryptocb.h rename to externe_kniznice/wolfssl/wolfcrypt/cryptocb.h diff --git a/wolfssl/wolfssl/wolfcrypt/curve25519.h b/externe_kniznice/wolfssl/wolfcrypt/curve25519.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/curve25519.h rename to externe_kniznice/wolfssl/wolfcrypt/curve25519.h diff --git a/wolfssl/wolfssl/wolfcrypt/des3.h b/externe_kniznice/wolfssl/wolfcrypt/des3.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/des3.h rename to externe_kniznice/wolfssl/wolfcrypt/des3.h diff --git a/wolfssl/wolfssl/wolfcrypt/dh.h b/externe_kniznice/wolfssl/wolfcrypt/dh.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/dh.h rename to externe_kniznice/wolfssl/wolfcrypt/dh.h diff --git a/wolfssl/wolfssl/wolfcrypt/dsa.h b/externe_kniznice/wolfssl/wolfcrypt/dsa.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/dsa.h rename to externe_kniznice/wolfssl/wolfcrypt/dsa.h diff --git a/wolfssl/wolfssl/wolfcrypt/ecc.h b/externe_kniznice/wolfssl/wolfcrypt/ecc.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/ecc.h rename to externe_kniznice/wolfssl/wolfcrypt/ecc.h diff --git a/wolfssl/wolfssl/wolfcrypt/ed25519.h b/externe_kniznice/wolfssl/wolfcrypt/ed25519.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/ed25519.h rename to externe_kniznice/wolfssl/wolfcrypt/ed25519.h diff --git a/wolfssl/wolfssl/wolfcrypt/error-crypt.h b/externe_kniznice/wolfssl/wolfcrypt/error-crypt.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/error-crypt.h rename to externe_kniznice/wolfssl/wolfcrypt/error-crypt.h diff --git a/wolfssl/wolfssl/wolfcrypt/fe_operations.h b/externe_kniznice/wolfssl/wolfcrypt/fe_operations.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/fe_operations.h rename to externe_kniznice/wolfssl/wolfcrypt/fe_operations.h diff --git a/wolfssl/wolfssl/wolfcrypt/fips.h b/externe_kniznice/wolfssl/wolfcrypt/fips.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/fips.h rename to externe_kniznice/wolfssl/wolfcrypt/fips.h diff --git a/wolfssl/wolfssl/wolfcrypt/fips_test.h b/externe_kniznice/wolfssl/wolfcrypt/fips_test.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/fips_test.h rename to externe_kniznice/wolfssl/wolfcrypt/fips_test.h diff --git a/wolfssl/wolfssl/wolfcrypt/ge_operations.h b/externe_kniznice/wolfssl/wolfcrypt/ge_operations.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/ge_operations.h rename to externe_kniznice/wolfssl/wolfcrypt/ge_operations.h diff --git a/wolfssl/wolfssl/wolfcrypt/hash.h b/externe_kniznice/wolfssl/wolfcrypt/hash.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/hash.h rename to externe_kniznice/wolfssl/wolfcrypt/hash.h diff --git a/wolfssl/wolfssl/wolfcrypt/hc128.h b/externe_kniznice/wolfssl/wolfcrypt/hc128.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/hc128.h rename to externe_kniznice/wolfssl/wolfcrypt/hc128.h diff --git a/wolfssl/wolfssl/wolfcrypt/hmac.h b/externe_kniznice/wolfssl/wolfcrypt/hmac.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/hmac.h rename to externe_kniznice/wolfssl/wolfcrypt/hmac.h diff --git a/wolfssl/wolfssl/wolfcrypt/idea.h b/externe_kniznice/wolfssl/wolfcrypt/idea.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/idea.h rename to externe_kniznice/wolfssl/wolfcrypt/idea.h diff --git a/wolfssl/wolfssl/wolfcrypt/include.am b/externe_kniznice/wolfssl/wolfcrypt/include.am similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/include.am rename to externe_kniznice/wolfssl/wolfcrypt/include.am diff --git a/wolfssl/wolfssl/wolfcrypt/integer.h b/externe_kniznice/wolfssl/wolfcrypt/integer.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/integer.h rename to externe_kniznice/wolfssl/wolfcrypt/integer.h diff --git a/wolfssl/wolfssl/wolfcrypt/logging.h b/externe_kniznice/wolfssl/wolfcrypt/logging.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/logging.h rename to externe_kniznice/wolfssl/wolfcrypt/logging.h diff --git a/wolfssl/wolfssl/wolfcrypt/md2.h b/externe_kniznice/wolfssl/wolfcrypt/md2.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/md2.h rename to externe_kniznice/wolfssl/wolfcrypt/md2.h diff --git a/wolfssl/wolfssl/wolfcrypt/md4.h b/externe_kniznice/wolfssl/wolfcrypt/md4.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/md4.h rename to externe_kniznice/wolfssl/wolfcrypt/md4.h diff --git a/wolfssl/wolfssl/wolfcrypt/md5.h b/externe_kniznice/wolfssl/wolfcrypt/md5.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/md5.h rename to externe_kniznice/wolfssl/wolfcrypt/md5.h diff --git a/wolfssl/wolfssl/wolfcrypt/mem_track.h b/externe_kniznice/wolfssl/wolfcrypt/mem_track.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/mem_track.h rename to externe_kniznice/wolfssl/wolfcrypt/mem_track.h diff --git a/wolfssl/wolfssl/wolfcrypt/memory.h b/externe_kniznice/wolfssl/wolfcrypt/memory.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/memory.h rename to externe_kniznice/wolfssl/wolfcrypt/memory.h diff --git a/wolfssl/wolfssl/wolfcrypt/misc.h b/externe_kniznice/wolfssl/wolfcrypt/misc.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/misc.h rename to externe_kniznice/wolfssl/wolfcrypt/misc.h diff --git a/wolfssl/wolfssl/wolfcrypt/mpi_class.h b/externe_kniznice/wolfssl/wolfcrypt/mpi_class.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/mpi_class.h rename to externe_kniznice/wolfssl/wolfcrypt/mpi_class.h diff --git a/wolfssl/wolfssl/wolfcrypt/mpi_superclass.h b/externe_kniznice/wolfssl/wolfcrypt/mpi_superclass.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/mpi_superclass.h rename to externe_kniznice/wolfssl/wolfcrypt/mpi_superclass.h diff --git a/wolfssl/wolfssl/wolfcrypt/pkcs11.h b/externe_kniznice/wolfssl/wolfcrypt/pkcs11.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/pkcs11.h rename to externe_kniznice/wolfssl/wolfcrypt/pkcs11.h diff --git a/wolfssl/wolfssl/wolfcrypt/pkcs12.h b/externe_kniznice/wolfssl/wolfcrypt/pkcs12.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/pkcs12.h rename to externe_kniznice/wolfssl/wolfcrypt/pkcs12.h diff --git a/wolfssl/wolfssl/wolfcrypt/pkcs7.h b/externe_kniznice/wolfssl/wolfcrypt/pkcs7.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/pkcs7.h rename to externe_kniznice/wolfssl/wolfcrypt/pkcs7.h diff --git a/wolfssl/wolfssl/wolfcrypt/poly1305.h b/externe_kniznice/wolfssl/wolfcrypt/poly1305.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/poly1305.h rename to externe_kniznice/wolfssl/wolfcrypt/poly1305.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h b/externe_kniznice/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h rename to externe_kniznice/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h b/externe_kniznice/wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h rename to externe_kniznice/wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/af_alg/afalg_hash.h b/externe_kniznice/wolfssl/wolfcrypt/port/af_alg/afalg_hash.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/af_alg/afalg_hash.h rename to externe_kniznice/wolfssl/wolfcrypt/port/af_alg/afalg_hash.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/af_alg/wc_afalg.h b/externe_kniznice/wolfssl/wolfcrypt/port/af_alg/wc_afalg.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/af_alg/wc_afalg.h rename to externe_kniznice/wolfssl/wolfcrypt/port/af_alg/wc_afalg.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/arm/cryptoCell.h b/externe_kniznice/wolfssl/wolfcrypt/port/arm/cryptoCell.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/arm/cryptoCell.h rename to externe_kniznice/wolfssl/wolfcrypt/port/arm/cryptoCell.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/atmel/atmel.h b/externe_kniznice/wolfssl/wolfcrypt/port/atmel/atmel.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/atmel/atmel.h rename to externe_kniznice/wolfssl/wolfcrypt/port/atmel/atmel.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/caam/caam_driver.h b/externe_kniznice/wolfssl/wolfcrypt/port/caam/caam_driver.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/caam/caam_driver.h rename to externe_kniznice/wolfssl/wolfcrypt/port/caam/caam_driver.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam.h b/externe_kniznice/wolfssl/wolfcrypt/port/caam/wolfcaam.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam.h rename to externe_kniznice/wolfssl/wolfcrypt/port/caam/wolfcaam.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam_sha.h b/externe_kniznice/wolfssl/wolfcrypt/port/caam/wolfcaam_sha.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam_sha.h rename to externe_kniznice/wolfssl/wolfcrypt/port/caam/wolfcaam_sha.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/cavium/cavium_nitrox.h b/externe_kniznice/wolfssl/wolfcrypt/port/cavium/cavium_nitrox.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/cavium/cavium_nitrox.h rename to externe_kniznice/wolfssl/wolfcrypt/port/cavium/cavium_nitrox.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/cavium/cavium_octeon_sync.h b/externe_kniznice/wolfssl/wolfcrypt/port/cavium/cavium_octeon_sync.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/cavium/cavium_octeon_sync.h rename to externe_kniznice/wolfssl/wolfcrypt/port/cavium/cavium_octeon_sync.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/devcrypto/wc_devcrypto.h b/externe_kniznice/wolfssl/wolfcrypt/port/devcrypto/wc_devcrypto.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/devcrypto/wc_devcrypto.h rename to externe_kniznice/wolfssl/wolfcrypt/port/devcrypto/wc_devcrypto.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/intel/quickassist.h b/externe_kniznice/wolfssl/wolfcrypt/port/intel/quickassist.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/intel/quickassist.h rename to externe_kniznice/wolfssl/wolfcrypt/port/intel/quickassist.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/intel/quickassist_mem.h b/externe_kniznice/wolfssl/wolfcrypt/port/intel/quickassist_mem.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/intel/quickassist_mem.h rename to externe_kniznice/wolfssl/wolfcrypt/port/intel/quickassist_mem.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/intel/quickassist_sync.h b/externe_kniznice/wolfssl/wolfcrypt/port/intel/quickassist_sync.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/intel/quickassist_sync.h rename to externe_kniznice/wolfssl/wolfcrypt/port/intel/quickassist_sync.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/nrf51.h b/externe_kniznice/wolfssl/wolfcrypt/port/nrf51.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/nrf51.h rename to externe_kniznice/wolfssl/wolfcrypt/port/nrf51.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/nxp/ksdk_port.h b/externe_kniznice/wolfssl/wolfcrypt/port/nxp/ksdk_port.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/nxp/ksdk_port.h rename to externe_kniznice/wolfssl/wolfcrypt/port/nxp/ksdk_port.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/pic32/pic32mz-crypt.h b/externe_kniznice/wolfssl/wolfcrypt/port/pic32/pic32mz-crypt.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/pic32/pic32mz-crypt.h rename to externe_kniznice/wolfssl/wolfcrypt/port/pic32/pic32mz-crypt.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/st/stm32.h b/externe_kniznice/wolfssl/wolfcrypt/port/st/stm32.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/st/stm32.h rename to externe_kniznice/wolfssl/wolfcrypt/port/st/stm32.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/st/stsafe.h b/externe_kniznice/wolfssl/wolfcrypt/port/st/stsafe.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/st/stsafe.h rename to externe_kniznice/wolfssl/wolfcrypt/port/st/stsafe.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/ti/ti-ccm.h b/externe_kniznice/wolfssl/wolfcrypt/port/ti/ti-ccm.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/ti/ti-ccm.h rename to externe_kniznice/wolfssl/wolfcrypt/port/ti/ti-ccm.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/ti/ti-hash.h b/externe_kniznice/wolfssl/wolfcrypt/port/ti/ti-hash.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/ti/ti-hash.h rename to externe_kniznice/wolfssl/wolfcrypt/port/ti/ti-hash.h diff --git a/wolfssl/wolfssl/wolfcrypt/port/xilinx/xil-sha3.h b/externe_kniznice/wolfssl/wolfcrypt/port/xilinx/xil-sha3.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/port/xilinx/xil-sha3.h rename to externe_kniznice/wolfssl/wolfcrypt/port/xilinx/xil-sha3.h diff --git a/wolfssl/wolfssl/wolfcrypt/pwdbased.h b/externe_kniznice/wolfssl/wolfcrypt/pwdbased.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/pwdbased.h rename to externe_kniznice/wolfssl/wolfcrypt/pwdbased.h diff --git a/wolfssl/wolfssl/wolfcrypt/rabbit.h b/externe_kniznice/wolfssl/wolfcrypt/rabbit.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/rabbit.h rename to externe_kniznice/wolfssl/wolfcrypt/rabbit.h diff --git a/wolfssl/wolfssl/wolfcrypt/random.h b/externe_kniznice/wolfssl/wolfcrypt/random.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/random.h rename to externe_kniznice/wolfssl/wolfcrypt/random.h diff --git a/wolfssl/wolfssl/wolfcrypt/ripemd.h b/externe_kniznice/wolfssl/wolfcrypt/ripemd.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/ripemd.h rename to externe_kniznice/wolfssl/wolfcrypt/ripemd.h diff --git a/wolfssl/wolfssl/wolfcrypt/rsa.h b/externe_kniznice/wolfssl/wolfcrypt/rsa.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/rsa.h rename to externe_kniznice/wolfssl/wolfcrypt/rsa.h diff --git a/wolfssl/wolfssl/wolfcrypt/selftest.h b/externe_kniznice/wolfssl/wolfcrypt/selftest.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/selftest.h rename to externe_kniznice/wolfssl/wolfcrypt/selftest.h diff --git a/wolfssl/wolfssl/wolfcrypt/settings.h b/externe_kniznice/wolfssl/wolfcrypt/settings.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/settings.h rename to externe_kniznice/wolfssl/wolfcrypt/settings.h diff --git a/wolfssl/wolfssl/wolfcrypt/sha.h b/externe_kniznice/wolfssl/wolfcrypt/sha.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/sha.h rename to externe_kniznice/wolfssl/wolfcrypt/sha.h diff --git a/wolfssl/wolfssl/wolfcrypt/sha256.h b/externe_kniznice/wolfssl/wolfcrypt/sha256.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/sha256.h rename to externe_kniznice/wolfssl/wolfcrypt/sha256.h diff --git a/wolfssl/wolfssl/wolfcrypt/sha3.h b/externe_kniznice/wolfssl/wolfcrypt/sha3.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/sha3.h rename to externe_kniznice/wolfssl/wolfcrypt/sha3.h diff --git a/wolfssl/wolfssl/wolfcrypt/sha512.h b/externe_kniznice/wolfssl/wolfcrypt/sha512.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/sha512.h rename to externe_kniznice/wolfssl/wolfcrypt/sha512.h diff --git a/wolfssl/wolfssl/wolfcrypt/signature.h b/externe_kniznice/wolfssl/wolfcrypt/signature.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/signature.h rename to externe_kniznice/wolfssl/wolfcrypt/signature.h diff --git a/wolfssl/wolfssl/wolfcrypt/sp.h b/externe_kniznice/wolfssl/wolfcrypt/sp.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/sp.h rename to externe_kniznice/wolfssl/wolfcrypt/sp.h diff --git a/wolfssl/wolfssl/wolfcrypt/sp_int.h b/externe_kniznice/wolfssl/wolfcrypt/sp_int.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/sp_int.h rename to externe_kniznice/wolfssl/wolfcrypt/sp_int.h diff --git a/wolfssl/wolfssl/wolfcrypt/srp.h b/externe_kniznice/wolfssl/wolfcrypt/srp.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/srp.h rename to externe_kniznice/wolfssl/wolfcrypt/srp.h diff --git a/wolfssl/wolfssl/wolfcrypt/tfm.h b/externe_kniznice/wolfssl/wolfcrypt/tfm.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/tfm.h rename to externe_kniznice/wolfssl/wolfcrypt/tfm.h diff --git a/wolfssl/wolfssl/wolfcrypt/types.h b/externe_kniznice/wolfssl/wolfcrypt/types.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/types.h rename to externe_kniznice/wolfssl/wolfcrypt/types.h diff --git a/wolfssl/wolfssl/wolfcrypt/visibility.h b/externe_kniznice/wolfssl/wolfcrypt/visibility.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/visibility.h rename to externe_kniznice/wolfssl/wolfcrypt/visibility.h diff --git a/wolfssl/wolfssl/wolfcrypt/wc_encrypt.h b/externe_kniznice/wolfssl/wolfcrypt/wc_encrypt.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/wc_encrypt.h rename to externe_kniznice/wolfssl/wolfcrypt/wc_encrypt.h diff --git a/wolfssl/wolfssl/wolfcrypt/wc_pkcs11.h b/externe_kniznice/wolfssl/wolfcrypt/wc_pkcs11.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/wc_pkcs11.h rename to externe_kniznice/wolfssl/wolfcrypt/wc_pkcs11.h diff --git a/wolfssl/wolfssl/wolfcrypt/wc_port.h b/externe_kniznice/wolfssl/wolfcrypt/wc_port.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/wc_port.h rename to externe_kniznice/wolfssl/wolfcrypt/wc_port.h diff --git a/wolfssl/wolfssl/wolfcrypt/wolfevent.h b/externe_kniznice/wolfssl/wolfcrypt/wolfevent.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/wolfevent.h rename to externe_kniznice/wolfssl/wolfcrypt/wolfevent.h diff --git a/wolfssl/wolfssl/wolfcrypt/wolfmath.h b/externe_kniznice/wolfssl/wolfcrypt/wolfmath.h similarity index 100% rename from wolfssl/wolfssl/wolfcrypt/wolfmath.h rename to externe_kniznice/wolfssl/wolfcrypt/wolfmath.h diff --git a/wolfssl/wolfssl/wolfio.h b/externe_kniznice/wolfssl/wolfio.h similarity index 100% rename from wolfssl/wolfssl/wolfio.h rename to externe_kniznice/wolfssl/wolfio.h diff --git a/externe_kniznice/zlib/.gitignore b/externe_kniznice/zlib/.gitignore new file mode 100644 index 0000000..b1c7422 --- /dev/null +++ b/externe_kniznice/zlib/.gitignore @@ -0,0 +1,26 @@ +*.diff +*.patch +*.orig +*.rej + +*~ +*.a +*.lo +*.o +*.dylib + +*.gcda +*.gcno +*.gcov + +/example +/example64 +/examplesh +/libz.so* +/minigzip +/minigzip64 +/minigzipsh +/zlib.pc +/configure.log + +.DS_Store diff --git a/externe_kniznice/zlib/CMakeLists.txt b/externe_kniznice/zlib/CMakeLists.txt new file mode 100644 index 0000000..0fe939d --- /dev/null +++ b/externe_kniznice/zlib/CMakeLists.txt @@ -0,0 +1,249 @@ +cmake_minimum_required(VERSION 2.4.4) +set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON) + +project(zlib C) + +set(VERSION "1.2.11") + +option(ASM686 "Enable building i686 assembly implementation") +option(AMD64 "Enable building amd64 assembly implementation") + +set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables") +set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries") +set(INSTALL_INC_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Installation directory for headers") +set(INSTALL_MAN_DIR "${CMAKE_INSTALL_PREFIX}/share/man" CACHE PATH "Installation directory for manual pages") +set(INSTALL_PKGCONFIG_DIR "${CMAKE_INSTALL_PREFIX}/share/pkgconfig" CACHE PATH "Installation directory for pkgconfig (.pc) files") + +include(CheckTypeSize) +include(CheckFunctionExists) +include(CheckIncludeFile) +include(CheckCSourceCompiles) +enable_testing() + +check_include_file(sys/types.h HAVE_SYS_TYPES_H) +check_include_file(stdint.h HAVE_STDINT_H) +check_include_file(stddef.h HAVE_STDDEF_H) + +# +# Check to see if we have large file support +# +set(CMAKE_REQUIRED_DEFINITIONS -D_LARGEFILE64_SOURCE=1) +# We add these other definitions here because CheckTypeSize.cmake +# in CMake 2.4.x does not automatically do so and we want +# compatibility with CMake 2.4.x. +if(HAVE_SYS_TYPES_H) + list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_SYS_TYPES_H) +endif() +if(HAVE_STDINT_H) + list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDINT_H) +endif() +if(HAVE_STDDEF_H) + list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDDEF_H) +endif() +check_type_size(off64_t OFF64_T) +if(HAVE_OFF64_T) + add_definitions(-D_LARGEFILE64_SOURCE=1) +endif() +set(CMAKE_REQUIRED_DEFINITIONS) # clear variable + +# +# Check for fseeko +# +check_function_exists(fseeko HAVE_FSEEKO) +if(NOT HAVE_FSEEKO) + add_definitions(-DNO_FSEEKO) +endif() + +# +# Check for unistd.h +# +check_include_file(unistd.h Z_HAVE_UNISTD_H) + +if(MSVC) + set(CMAKE_DEBUG_POSTFIX "d") + add_definitions(-D_CRT_SECURE_NO_DEPRECATE) + add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE) + include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +endif() + +if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR) + # If we're doing an out of source build and the user has a zconf.h + # in their source tree... + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h) + message(STATUS "Renaming") + message(STATUS " ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h") + message(STATUS "to 'zconf.h.included' because this file is included with zlib") + message(STATUS "but CMake generates it automatically in the build directory.") + file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.included) + endif() +endif() + +set(ZLIB_PC ${CMAKE_CURRENT_BINARY_DIR}/zlib.pc) +configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/zlib.pc.cmakein + ${ZLIB_PC} @ONLY) +configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.cmakein + ${CMAKE_CURRENT_BINARY_DIR}/zconf.h @ONLY) +include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}) + + +#============================================================================ +# zlib +#============================================================================ + +set(ZLIB_PUBLIC_HDRS + ${CMAKE_CURRENT_BINARY_DIR}/zconf.h + zlib.h +) +set(ZLIB_PRIVATE_HDRS + crc32.h + deflate.h + gzguts.h + inffast.h + inffixed.h + inflate.h + inftrees.h + trees.h + zutil.h +) +set(ZLIB_SRCS + adler32.c + compress.c + crc32.c + deflate.c + gzclose.c + gzlib.c + gzread.c + gzwrite.c + inflate.c + infback.c + inftrees.c + inffast.c + trees.c + uncompr.c + zutil.c +) + +if(NOT MINGW) + set(ZLIB_DLL_SRCS + win32/zlib1.rc # If present will override custom build rule below. + ) +endif() + +if(CMAKE_COMPILER_IS_GNUCC) + if(ASM686) + set(ZLIB_ASMS contrib/asm686/match.S) + elseif (AMD64) + set(ZLIB_ASMS contrib/amd64/amd64-match.S) + endif () + + if(ZLIB_ASMS) + add_definitions(-DASMV) + set_source_files_properties(${ZLIB_ASMS} PROPERTIES LANGUAGE C COMPILE_FLAGS -DNO_UNDERLINE) + endif() +endif() + +if(MSVC) + if(ASM686) + ENABLE_LANGUAGE(ASM_MASM) + set(ZLIB_ASMS + contrib/masmx86/inffas32.asm + contrib/masmx86/match686.asm + ) + elseif (AMD64) + ENABLE_LANGUAGE(ASM_MASM) + set(ZLIB_ASMS + contrib/masmx64/gvmat64.asm + contrib/masmx64/inffasx64.asm + ) + endif() + + if(ZLIB_ASMS) + add_definitions(-DASMV -DASMINF) + endif() +endif() + +# parse the full version number from zlib.h and include in ZLIB_FULL_VERSION +file(READ ${CMAKE_CURRENT_SOURCE_DIR}/zlib.h _zlib_h_contents) +string(REGEX REPLACE ".*#define[ \t]+ZLIB_VERSION[ \t]+\"([-0-9A-Za-z.]+)\".*" + "\\1" ZLIB_FULL_VERSION ${_zlib_h_contents}) + +if(MINGW) + # This gets us DLL resource information when compiling on MinGW. + if(NOT CMAKE_RC_COMPILER) + set(CMAKE_RC_COMPILER windres.exe) + endif() + + add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj + COMMAND ${CMAKE_RC_COMPILER} + -D GCC_WINDRES + -I ${CMAKE_CURRENT_SOURCE_DIR} + -I ${CMAKE_CURRENT_BINARY_DIR} + -o ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj + -i ${CMAKE_CURRENT_SOURCE_DIR}/win32/zlib1.rc) + set(ZLIB_DLL_SRCS ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj) +endif(MINGW) + +add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) +add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) +set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL) +set_target_properties(zlib PROPERTIES SOVERSION 1) + +if(NOT CYGWIN) + # This property causes shared libraries on Linux to have the full version + # encoded into their final filename. We disable this on Cygwin because + # it causes cygz-${ZLIB_FULL_VERSION}.dll to be created when cygz.dll + # seems to be the default. + # + # This has no effect with MSVC, on that platform the version info for + # the DLL comes from the resource file win32/zlib1.rc + set_target_properties(zlib PROPERTIES VERSION ${ZLIB_FULL_VERSION}) +endif() + +if(UNIX) + # On unix-like platforms the library is almost always called libz + set_target_properties(zlib zlibstatic PROPERTIES OUTPUT_NAME z) + if(NOT APPLE) + set_target_properties(zlib PROPERTIES LINK_FLAGS "-Wl,--version-script,\"${CMAKE_CURRENT_SOURCE_DIR}/zlib.map\"") + endif() +elseif(BUILD_SHARED_LIBS AND WIN32) + # Creates zlib1.dll when building shared library version + set_target_properties(zlib PROPERTIES SUFFIX "1.dll") +endif() + +if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL ) + install(TARGETS zlib zlibstatic + RUNTIME DESTINATION "${INSTALL_BIN_DIR}" + ARCHIVE DESTINATION "${INSTALL_LIB_DIR}" + LIBRARY DESTINATION "${INSTALL_LIB_DIR}" ) +endif() +if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL ) + install(FILES ${ZLIB_PUBLIC_HDRS} DESTINATION "${INSTALL_INC_DIR}") +endif() +if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL ) + install(FILES zlib.3 DESTINATION "${INSTALL_MAN_DIR}/man3") +endif() +if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL ) + install(FILES ${ZLIB_PC} DESTINATION "${INSTALL_PKGCONFIG_DIR}") +endif() + +#============================================================================ +# Example binaries +#============================================================================ + +add_executable(example test/example.c) +target_link_libraries(example zlib) +add_test(example example) + +add_executable(minigzip test/minigzip.c) +target_link_libraries(minigzip zlib) + +if(HAVE_OFF64_T) + add_executable(example64 test/example.c) + target_link_libraries(example64 zlib) + set_target_properties(example64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64") + add_test(example64 example64) + + add_executable(minigzip64 test/minigzip.c) + target_link_libraries(minigzip64 zlib) + set_target_properties(minigzip64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64") +endif() diff --git a/externe_kniznice/zlib/ChangeLog b/externe_kniznice/zlib/ChangeLog new file mode 100644 index 0000000..30199a6 --- /dev/null +++ b/externe_kniznice/zlib/ChangeLog @@ -0,0 +1,1515 @@ + + ChangeLog file for zlib + +Changes in 1.2.11 (15 Jan 2017) +- Fix deflate stored bug when pulling last block from window +- Permit immediate deflateParams changes before any deflate input + +Changes in 1.2.10 (2 Jan 2017) +- Avoid warnings on snprintf() return value +- Fix bug in deflate_stored() for zero-length input +- Fix bug in gzwrite.c that produced corrupt gzip files +- Remove files to be installed before copying them in Makefile.in +- Add warnings when compiling with assembler code + +Changes in 1.2.9 (31 Dec 2016) +- Fix contrib/minizip to permit unzipping with desktop API [Zouzou] +- Improve contrib/blast to return unused bytes +- Assure that gzoffset() is correct when appending +- Improve compress() and uncompress() to support large lengths +- Fix bug in test/example.c where error code not saved +- Remedy Coverity warning [Randers-Pehrson] +- Improve speed of gzprintf() in transparent mode +- Fix inflateInit2() bug when windowBits is 16 or 32 +- Change DEBUG macro to ZLIB_DEBUG +- Avoid uninitialized access by gzclose_w() +- Allow building zlib outside of the source directory +- Fix bug that accepted invalid zlib header when windowBits is zero +- Fix gzseek() problem on MinGW due to buggy _lseeki64 there +- Loop on write() calls in gzwrite.c in case of non-blocking I/O +- Add --warn (-w) option to ./configure for more compiler warnings +- Reject a window size of 256 bytes if not using the zlib wrapper +- Fix bug when level 0 used with Z_HUFFMAN or Z_RLE +- Add --debug (-d) option to ./configure to define ZLIB_DEBUG +- Fix bugs in creating a very large gzip header +- Add uncompress2() function, which returns the input size used +- Assure that deflateParams() will not switch functions mid-block +- Dramatically speed up deflation for level 0 (storing) +- Add gzfread(), duplicating the interface of fread() +- Add gzfwrite(), duplicating the interface of fwrite() +- Add deflateGetDictionary() function +- Use snprintf() for later versions of Microsoft C +- Fix *Init macros to use z_ prefix when requested +- Replace as400 with os400 for OS/400 support [Monnerat] +- Add crc32_z() and adler32_z() functions with size_t lengths +- Update Visual Studio project files [AraHaan] + +Changes in 1.2.8 (28 Apr 2013) +- Update contrib/minizip/iowin32.c for Windows RT [Vollant] +- Do not force Z_CONST for C++ +- Clean up contrib/vstudio [Roß] +- Correct spelling error in zlib.h +- Fix mixed line endings in contrib/vstudio + +Changes in 1.2.7.3 (13 Apr 2013) +- Fix version numbers and DLL names in contrib/vstudio/*/zlib.rc + +Changes in 1.2.7.2 (13 Apr 2013) +- Change check for a four-byte type back to hexadecimal +- Fix typo in win32/Makefile.msc +- Add casts in gzwrite.c for pointer differences + +Changes in 1.2.7.1 (24 Mar 2013) +- Replace use of unsafe string functions with snprintf if available +- Avoid including stddef.h on Windows for Z_SOLO compile [Niessink] +- Fix gzgetc undefine when Z_PREFIX set [Turk] +- Eliminate use of mktemp in Makefile (not always available) +- Fix bug in 'F' mode for gzopen() +- Add inflateGetDictionary() function +- Correct comment in deflate.h +- Use _snprintf for snprintf in Microsoft C +- On Darwin, only use /usr/bin/libtool if libtool is not Apple +- Delete "--version" file if created by "ar --version" [Richard G.] +- Fix configure check for veracity of compiler error return codes +- Fix CMake compilation of static lib for MSVC2010 x64 +- Remove unused variable in infback9.c +- Fix argument checks in gzlog_compress() and gzlog_write() +- Clean up the usage of z_const and respect const usage within zlib +- Clean up examples/gzlog.[ch] comparisons of different types +- Avoid shift equal to bits in type (caused endless loop) +- Fix uninitialized value bug in gzputc() introduced by const patches +- Fix memory allocation error in examples/zran.c [Nor] +- Fix bug where gzopen(), gzclose() would write an empty file +- Fix bug in gzclose() when gzwrite() runs out of memory +- Check for input buffer malloc failure in examples/gzappend.c +- Add note to contrib/blast to use binary mode in stdio +- Fix comparisons of differently signed integers in contrib/blast +- Check for invalid code length codes in contrib/puff +- Fix serious but very rare decompression bug in inftrees.c +- Update inflateBack() comments, since inflate() can be faster +- Use underscored I/O function names for WINAPI_FAMILY +- Add _tr_flush_bits to the external symbols prefixed by --zprefix +- Add contrib/vstudio/vc10 pre-build step for static only +- Quote --version-script argument in CMakeLists.txt +- Don't specify --version-script on Apple platforms in CMakeLists.txt +- Fix casting error in contrib/testzlib/testzlib.c +- Fix types in contrib/minizip to match result of get_crc_table() +- Simplify contrib/vstudio/vc10 with 'd' suffix +- Add TOP support to win32/Makefile.msc +- Suport i686 and amd64 assembler builds in CMakeLists.txt +- Fix typos in the use of _LARGEFILE64_SOURCE in zconf.h +- Add vc11 and vc12 build files to contrib/vstudio +- Add gzvprintf() as an undocumented function in zlib +- Fix configure for Sun shell +- Remove runtime check in configure for four-byte integer type +- Add casts and consts to ease user conversion to C++ +- Add man pages for minizip and miniunzip +- In Makefile uninstall, don't rm if preceding cd fails +- Do not return Z_BUF_ERROR if deflateParam() has nothing to write + +Changes in 1.2.7 (2 May 2012) +- Replace use of memmove() with a simple copy for portability +- Test for existence of strerror +- Restore gzgetc_ for backward compatibility with 1.2.6 +- Fix build with non-GNU make on Solaris +- Require gcc 4.0 or later on Mac OS X to use the hidden attribute +- Include unistd.h for Watcom C +- Use __WATCOMC__ instead of __WATCOM__ +- Do not use the visibility attribute if NO_VIZ defined +- Improve the detection of no hidden visibility attribute +- Avoid using __int64 for gcc or solo compilation +- Cast to char * in gzprintf to avoid warnings [Zinser] +- Fix make_vms.com for VAX [Zinser] +- Don't use library or built-in byte swaps +- Simplify test and use of gcc hidden attribute +- Fix bug in gzclose_w() when gzwrite() fails to allocate memory +- Add "x" (O_EXCL) and "e" (O_CLOEXEC) modes support to gzopen() +- Fix bug in test/minigzip.c for configure --solo +- Fix contrib/vstudio project link errors [Mohanathas] +- Add ability to choose the builder in make_vms.com [Schweda] +- Add DESTDIR support to mingw32 win32/Makefile.gcc +- Fix comments in win32/Makefile.gcc for proper usage +- Allow overriding the default install locations for cmake +- Generate and install the pkg-config file with cmake +- Build both a static and a shared version of zlib with cmake +- Include version symbols for cmake builds +- If using cmake with MSVC, add the source directory to the includes +- Remove unneeded EXTRA_CFLAGS from win32/Makefile.gcc [Truta] +- Move obsolete emx makefile to old [Truta] +- Allow the use of -Wundef when compiling or using zlib +- Avoid the use of the -u option with mktemp +- Improve inflate() documentation on the use of Z_FINISH +- Recognize clang as gcc +- Add gzopen_w() in Windows for wide character path names +- Rename zconf.h in CMakeLists.txt to move it out of the way +- Add source directory in CMakeLists.txt for building examples +- Look in build directory for zlib.pc in CMakeLists.txt +- Remove gzflags from zlibvc.def in vc9 and vc10 +- Fix contrib/minizip compilation in the MinGW environment +- Update ./configure for Solaris, support --64 [Mooney] +- Remove -R. from Solaris shared build (possible security issue) +- Avoid race condition for parallel make (-j) running example +- Fix type mismatch between get_crc_table() and crc_table +- Fix parsing of version with "-" in CMakeLists.txt [Snider, Ziegler] +- Fix the path to zlib.map in CMakeLists.txt +- Force the native libtool in Mac OS X to avoid GNU libtool [Beebe] +- Add instructions to win32/Makefile.gcc for shared install [Torri] + +Changes in 1.2.6.1 (12 Feb 2012) +- Avoid the use of the Objective-C reserved name "id" +- Include io.h in gzguts.h for Microsoft compilers +- Fix problem with ./configure --prefix and gzgetc macro +- Include gz_header definition when compiling zlib solo +- Put gzflags() functionality back in zutil.c +- Avoid library header include in crc32.c for Z_SOLO +- Use name in GCC_CLASSIC as C compiler for coverage testing, if set +- Minor cleanup in contrib/minizip/zip.c [Vollant] +- Update make_vms.com [Zinser] +- Remove unnecessary gzgetc_ function +- Use optimized byte swap operations for Microsoft and GNU [Snyder] +- Fix minor typo in zlib.h comments [Rzesniowiecki] + +Changes in 1.2.6 (29 Jan 2012) +- Update the Pascal interface in contrib/pascal +- Fix function numbers for gzgetc_ in zlibvc.def files +- Fix configure.ac for contrib/minizip [Schiffer] +- Fix large-entry detection in minizip on 64-bit systems [Schiffer] +- Have ./configure use the compiler return code for error indication +- Fix CMakeLists.txt for cross compilation [McClure] +- Fix contrib/minizip/zip.c for 64-bit architectures [Dalsnes] +- Fix compilation of contrib/minizip on FreeBSD [Marquez] +- Correct suggested usages in win32/Makefile.msc [Shachar, Horvath] +- Include io.h for Turbo C / Borland C on all platforms [Truta] +- Make version explicit in contrib/minizip/configure.ac [Bosmans] +- Avoid warning for no encryption in contrib/minizip/zip.c [Vollant] +- Minor cleanup up contrib/minizip/unzip.c [Vollant] +- Fix bug when compiling minizip with C++ [Vollant] +- Protect for long name and extra fields in contrib/minizip [Vollant] +- Avoid some warnings in contrib/minizip [Vollant] +- Add -I../.. -L../.. to CFLAGS for minizip and miniunzip +- Add missing libs to minizip linker command +- Add support for VPATH builds in contrib/minizip +- Add an --enable-demos option to contrib/minizip/configure +- Add the generation of configure.log by ./configure +- Exit when required parameters not provided to win32/Makefile.gcc +- Have gzputc return the character written instead of the argument +- Use the -m option on ldconfig for BSD systems [Tobias] +- Correct in zlib.map when deflateResetKeep was added + +Changes in 1.2.5.3 (15 Jan 2012) +- Restore gzgetc function for binary compatibility +- Do not use _lseeki64 under Borland C++ [Truta] +- Update win32/Makefile.msc to build test/*.c [Truta] +- Remove old/visualc6 given CMakefile and other alternatives +- Update AS400 build files and documentation [Monnerat] +- Update win32/Makefile.gcc to build test/*.c [Truta] +- Permit stronger flushes after Z_BLOCK flushes +- Avoid extraneous empty blocks when doing empty flushes +- Permit Z_NULL arguments to deflatePending +- Allow deflatePrime() to insert bits in the middle of a stream +- Remove second empty static block for Z_PARTIAL_FLUSH +- Write out all of the available bits when using Z_BLOCK +- Insert the first two strings in the hash table after a flush + +Changes in 1.2.5.2 (17 Dec 2011) +- fix ld error: unable to find version dependency 'ZLIB_1.2.5' +- use relative symlinks for shared libs +- Avoid searching past window for Z_RLE strategy +- Assure that high-water mark initialization is always applied in deflate +- Add assertions to fill_window() in deflate.c to match comments +- Update python link in README +- Correct spelling error in gzread.c +- Fix bug in gzgets() for a concatenated empty gzip stream +- Correct error in comment for gz_make() +- Change gzread() and related to ignore junk after gzip streams +- Allow gzread() and related to continue after gzclearerr() +- Allow gzrewind() and gzseek() after a premature end-of-file +- Simplify gzseek() now that raw after gzip is ignored +- Change gzgetc() to a macro for speed (~40% speedup in testing) +- Fix gzclose() to return the actual error last encountered +- Always add large file support for windows +- Include zconf.h for windows large file support +- Include zconf.h.cmakein for windows large file support +- Update zconf.h.cmakein on make distclean +- Merge vestigial vsnprintf determination from zutil.h to gzguts.h +- Clarify how gzopen() appends in zlib.h comments +- Correct documentation of gzdirect() since junk at end now ignored +- Add a transparent write mode to gzopen() when 'T' is in the mode +- Update python link in zlib man page +- Get inffixed.h and MAKEFIXED result to match +- Add a ./config --solo option to make zlib subset with no library use +- Add undocumented inflateResetKeep() function for CAB file decoding +- Add --cover option to ./configure for gcc coverage testing +- Add #define ZLIB_CONST option to use const in the z_stream interface +- Add comment to gzdopen() in zlib.h to use dup() when using fileno() +- Note behavior of uncompress() to provide as much data as it can +- Add files in contrib/minizip to aid in building libminizip +- Split off AR options in Makefile.in and configure +- Change ON macro to Z_ARG to avoid application conflicts +- Facilitate compilation with Borland C++ for pragmas and vsnprintf +- Include io.h for Turbo C / Borland C++ +- Move example.c and minigzip.c to test/ +- Simplify incomplete code table filling in inflate_table() +- Remove code from inflate.c and infback.c that is impossible to execute +- Test the inflate code with full coverage +- Allow deflateSetDictionary, inflateSetDictionary at any time (in raw) +- Add deflateResetKeep and fix inflateResetKeep to retain dictionary +- Fix gzwrite.c to accommodate reduced memory zlib compilation +- Have inflate() with Z_FINISH avoid the allocation of a window +- Do not set strm->adler when doing raw inflate +- Fix gzeof() to behave just like feof() when read is not past end of file +- Fix bug in gzread.c when end-of-file is reached +- Avoid use of Z_BUF_ERROR in gz* functions except for premature EOF +- Document gzread() capability to read concurrently written files +- Remove hard-coding of resource compiler in CMakeLists.txt [Blammo] + +Changes in 1.2.5.1 (10 Sep 2011) +- Update FAQ entry on shared builds (#13) +- Avoid symbolic argument to chmod in Makefile.in +- Fix bug and add consts in contrib/puff [Oberhumer] +- Update contrib/puff/zeros.raw test file to have all block types +- Add full coverage test for puff in contrib/puff/Makefile +- Fix static-only-build install in Makefile.in +- Fix bug in unzGetCurrentFileInfo() in contrib/minizip [Kuno] +- Add libz.a dependency to shared in Makefile.in for parallel builds +- Spell out "number" (instead of "nb") in zlib.h for total_in, total_out +- Replace $(...) with `...` in configure for non-bash sh [Bowler] +- Add darwin* to Darwin* and solaris* to SunOS\ 5* in configure [Groffen] +- Add solaris* to Linux* in configure to allow gcc use [Groffen] +- Add *bsd* to Linux* case in configure [Bar-Lev] +- Add inffast.obj to dependencies in win32/Makefile.msc +- Correct spelling error in deflate.h [Kohler] +- Change libzdll.a again to libz.dll.a (!) in win32/Makefile.gcc +- Add test to configure for GNU C looking for gcc in output of $cc -v +- Add zlib.pc generation to win32/Makefile.gcc [Weigelt] +- Fix bug in zlib.h for _FILE_OFFSET_BITS set and _LARGEFILE64_SOURCE not +- Add comment in zlib.h that adler32_combine with len2 < 0 makes no sense +- Make NO_DIVIDE option in adler32.c much faster (thanks to John Reiser) +- Make stronger test in zconf.h to include unistd.h for LFS +- Apply Darwin patches for 64-bit file offsets to contrib/minizip [Slack] +- Fix zlib.h LFS support when Z_PREFIX used +- Add updated as400 support (removed from old) [Monnerat] +- Avoid deflate sensitivity to volatile input data +- Avoid division in adler32_combine for NO_DIVIDE +- Clarify the use of Z_FINISH with deflateBound() amount of space +- Set binary for output file in puff.c +- Use u4 type for crc_table to avoid conversion warnings +- Apply casts in zlib.h to avoid conversion warnings +- Add OF to prototypes for adler32_combine_ and crc32_combine_ [Miller] +- Improve inflateSync() documentation to note indeterminancy +- Add deflatePending() function to return the amount of pending output +- Correct the spelling of "specification" in FAQ [Randers-Pehrson] +- Add a check in configure for stdarg.h, use for gzprintf() +- Check that pointers fit in ints when gzprint() compiled old style +- Add dummy name before $(SHAREDLIBV) in Makefile [Bar-Lev, Bowler] +- Delete line in configure that adds -L. libz.a to LDFLAGS [Weigelt] +- Add debug records in assmebler code [Londer] +- Update RFC references to use http://tools.ietf.org/html/... [Li] +- Add --archs option, use of libtool to configure for Mac OS X [Borstel] + +Changes in 1.2.5 (19 Apr 2010) +- Disable visibility attribute in win32/Makefile.gcc [Bar-Lev] +- Default to libdir as sharedlibdir in configure [Nieder] +- Update copyright dates on modified source files +- Update trees.c to be able to generate modified trees.h +- Exit configure for MinGW, suggesting win32/Makefile.gcc +- Check for NULL path in gz_open [Homurlu] + +Changes in 1.2.4.5 (18 Apr 2010) +- Set sharedlibdir in configure [Torok] +- Set LDFLAGS in Makefile.in [Bar-Lev] +- Avoid mkdir objs race condition in Makefile.in [Bowler] +- Add ZLIB_INTERNAL in front of internal inter-module functions and arrays +- Define ZLIB_INTERNAL to hide internal functions and arrays for GNU C +- Don't use hidden attribute when it is a warning generator (e.g. Solaris) + +Changes in 1.2.4.4 (18 Apr 2010) +- Fix CROSS_PREFIX executable testing, CHOST extract, mingw* [Torok] +- Undefine _LARGEFILE64_SOURCE in zconf.h if it is zero, but not if empty +- Try to use bash or ksh regardless of functionality of /bin/sh +- Fix configure incompatibility with NetBSD sh +- Remove attempt to run under bash or ksh since have better NetBSD fix +- Fix win32/Makefile.gcc for MinGW [Bar-Lev] +- Add diagnostic messages when using CROSS_PREFIX in configure +- Added --sharedlibdir option to configure [Weigelt] +- Use hidden visibility attribute when available [Frysinger] + +Changes in 1.2.4.3 (10 Apr 2010) +- Only use CROSS_PREFIX in configure for ar and ranlib if they exist +- Use CROSS_PREFIX for nm [Bar-Lev] +- Assume _LARGEFILE64_SOURCE defined is equivalent to true +- Avoid use of undefined symbols in #if with && and || +- Make *64 prototypes in gzguts.h consistent with functions +- Add -shared load option for MinGW in configure [Bowler] +- Move z_off64_t to public interface, use instead of off64_t +- Remove ! from shell test in configure (not portable to Solaris) +- Change +0 macro tests to -0 for possibly increased portability + +Changes in 1.2.4.2 (9 Apr 2010) +- Add consistent carriage returns to readme.txt's in masmx86 and masmx64 +- Really provide prototypes for *64 functions when building without LFS +- Only define unlink() in minigzip.c if unistd.h not included +- Update README to point to contrib/vstudio project files +- Move projects/vc6 to old/ and remove projects/ +- Include stdlib.h in minigzip.c for setmode() definition under WinCE +- Clean up assembler builds in win32/Makefile.msc [Rowe] +- Include sys/types.h for Microsoft for off_t definition +- Fix memory leak on error in gz_open() +- Symbolize nm as $NM in configure [Weigelt] +- Use TEST_LDSHARED instead of LDSHARED to link test programs [Weigelt] +- Add +0 to _FILE_OFFSET_BITS and _LFS64_LARGEFILE in case not defined +- Fix bug in gzeof() to take into account unused input data +- Avoid initialization of structures with variables in puff.c +- Updated win32/README-WIN32.txt [Rowe] + +Changes in 1.2.4.1 (28 Mar 2010) +- Remove the use of [a-z] constructs for sed in configure [gentoo 310225] +- Remove $(SHAREDLIB) from LIBS in Makefile.in [Creech] +- Restore "for debugging" comment on sprintf() in gzlib.c +- Remove fdopen for MVS from gzguts.h +- Put new README-WIN32.txt in win32 [Rowe] +- Add check for shell to configure and invoke another shell if needed +- Fix big fat stinking bug in gzseek() on uncompressed files +- Remove vestigial F_OPEN64 define in zutil.h +- Set and check the value of _LARGEFILE_SOURCE and _LARGEFILE64_SOURCE +- Avoid errors on non-LFS systems when applications define LFS macros +- Set EXE to ".exe" in configure for MINGW [Kahle] +- Match crc32() in crc32.c exactly to the prototype in zlib.h [Sherrill] +- Add prefix for cross-compilation in win32/makefile.gcc [Bar-Lev] +- Add DLL install in win32/makefile.gcc [Bar-Lev] +- Allow Linux* or linux* from uname in configure [Bar-Lev] +- Allow ldconfig to be redefined in configure and Makefile.in [Bar-Lev] +- Add cross-compilation prefixes to configure [Bar-Lev] +- Match type exactly in gz_load() invocation in gzread.c +- Match type exactly of zcalloc() in zutil.c to zlib.h alloc_func +- Provide prototypes for *64 functions when building zlib without LFS +- Don't use -lc when linking shared library on MinGW +- Remove errno.h check in configure and vestigial errno code in zutil.h + +Changes in 1.2.4 (14 Mar 2010) +- Fix VER3 extraction in configure for no fourth subversion +- Update zlib.3, add docs to Makefile.in to make .pdf out of it +- Add zlib.3.pdf to distribution +- Don't set error code in gzerror() if passed pointer is NULL +- Apply destination directory fixes to CMakeLists.txt [Lowman] +- Move #cmakedefine's to a new zconf.in.cmakein +- Restore zconf.h for builds that don't use configure or cmake +- Add distclean to dummy Makefile for convenience +- Update and improve INDEX, README, and FAQ +- Update CMakeLists.txt for the return of zconf.h [Lowman] +- Update contrib/vstudio/vc9 and vc10 [Vollant] +- Change libz.dll.a back to libzdll.a in win32/Makefile.gcc +- Apply license and readme changes to contrib/asm686 [Raiter] +- Check file name lengths and add -c option in minigzip.c [Li] +- Update contrib/amd64 and contrib/masmx86/ [Vollant] +- Avoid use of "eof" parameter in trees.c to not shadow library variable +- Update make_vms.com for removal of zlibdefs.h [Zinser] +- Update assembler code and vstudio projects in contrib [Vollant] +- Remove outdated assembler code contrib/masm686 and contrib/asm586 +- Remove old vc7 and vc8 from contrib/vstudio +- Update win32/Makefile.msc, add ZLIB_VER_SUBREVISION [Rowe] +- Fix memory leaks in gzclose_r() and gzclose_w(), file leak in gz_open() +- Add contrib/gcc_gvmat64 for longest_match and inflate_fast [Vollant] +- Remove *64 functions from win32/zlib.def (they're not 64-bit yet) +- Fix bug in void-returning vsprintf() case in gzwrite.c +- Fix name change from inflate.h in contrib/inflate86/inffas86.c +- Check if temporary file exists before removing in make_vms.com [Zinser] +- Fix make install and uninstall for --static option +- Fix usage of _MSC_VER in gzguts.h and zutil.h [Truta] +- Update readme.txt in contrib/masmx64 and masmx86 to assemble + +Changes in 1.2.3.9 (21 Feb 2010) +- Expunge gzio.c +- Move as400 build information to old +- Fix updates in contrib/minizip and contrib/vstudio +- Add const to vsnprintf test in configure to avoid warnings [Weigelt] +- Delete zconf.h (made by configure) [Weigelt] +- Change zconf.in.h to zconf.h.in per convention [Weigelt] +- Check for NULL buf in gzgets() +- Return empty string for gzgets() with len == 1 (like fgets()) +- Fix description of gzgets() in zlib.h for end-of-file, NULL return +- Update minizip to 1.1 [Vollant] +- Avoid MSVC loss of data warnings in gzread.c, gzwrite.c +- Note in zlib.h that gzerror() should be used to distinguish from EOF +- Remove use of snprintf() from gzlib.c +- Fix bug in gzseek() +- Update contrib/vstudio, adding vc9 and vc10 [Kuno, Vollant] +- Fix zconf.h generation in CMakeLists.txt [Lowman] +- Improve comments in zconf.h where modified by configure + +Changes in 1.2.3.8 (13 Feb 2010) +- Clean up text files (tabs, trailing whitespace, etc.) [Oberhumer] +- Use z_off64_t in gz_zero() and gz_skip() to match state->skip +- Avoid comparison problem when sizeof(int) == sizeof(z_off64_t) +- Revert to Makefile.in from 1.2.3.6 (live with the clutter) +- Fix missing error return in gzflush(), add zlib.h note +- Add *64 functions to zlib.map [Levin] +- Fix signed/unsigned comparison in gz_comp() +- Use SFLAGS when testing shared linking in configure +- Add --64 option to ./configure to use -m64 with gcc +- Fix ./configure --help to correctly name options +- Have make fail if a test fails [Levin] +- Avoid buffer overrun in contrib/masmx64/gvmat64.asm [Simpson] +- Remove assembler object files from contrib + +Changes in 1.2.3.7 (24 Jan 2010) +- Always gzopen() with O_LARGEFILE if available +- Fix gzdirect() to work immediately after gzopen() or gzdopen() +- Make gzdirect() more precise when the state changes while reading +- Improve zlib.h documentation in many places +- Catch memory allocation failure in gz_open() +- Complete close operation if seek forward in gzclose_w() fails +- Return Z_ERRNO from gzclose_r() if close() fails +- Return Z_STREAM_ERROR instead of EOF for gzclose() being passed NULL +- Return zero for gzwrite() errors to match zlib.h description +- Return -1 on gzputs() error to match zlib.h description +- Add zconf.in.h to allow recovery from configure modification [Weigelt] +- Fix static library permissions in Makefile.in [Weigelt] +- Avoid warnings in configure tests that hide functionality [Weigelt] +- Add *BSD and DragonFly to Linux case in configure [gentoo 123571] +- Change libzdll.a to libz.dll.a in win32/Makefile.gcc [gentoo 288212] +- Avoid access of uninitialized data for first inflateReset2 call [Gomes] +- Keep object files in subdirectories to reduce the clutter somewhat +- Remove default Makefile and zlibdefs.h, add dummy Makefile +- Add new external functions to Z_PREFIX, remove duplicates, z_z_ -> z_ +- Remove zlibdefs.h completely -- modify zconf.h instead + +Changes in 1.2.3.6 (17 Jan 2010) +- Avoid void * arithmetic in gzread.c and gzwrite.c +- Make compilers happier with const char * for gz_error message +- Avoid unused parameter warning in inflate.c +- Avoid signed-unsigned comparison warning in inflate.c +- Indent #pragma's for traditional C +- Fix usage of strwinerror() in glib.c, change to gz_strwinerror() +- Correct email address in configure for system options +- Update make_vms.com and add make_vms.com to contrib/minizip [Zinser] +- Update zlib.map [Brown] +- Fix Makefile.in for Solaris 10 make of example64 and minizip64 [Torok] +- Apply various fixes to CMakeLists.txt [Lowman] +- Add checks on len in gzread() and gzwrite() +- Add error message for no more room for gzungetc() +- Remove zlib version check in gzwrite() +- Defer compression of gzprintf() result until need to +- Use snprintf() in gzdopen() if available +- Remove USE_MMAP configuration determination (only used by minigzip) +- Remove examples/pigz.c (available separately) +- Update examples/gun.c to 1.6 + +Changes in 1.2.3.5 (8 Jan 2010) +- Add space after #if in zutil.h for some compilers +- Fix relatively harmless bug in deflate_fast() [Exarevsky] +- Fix same problem in deflate_slow() +- Add $(SHAREDLIBV) to LIBS in Makefile.in [Brown] +- Add deflate_rle() for faster Z_RLE strategy run-length encoding +- Add deflate_huff() for faster Z_HUFFMAN_ONLY encoding +- Change name of "write" variable in inffast.c to avoid library collisions +- Fix premature EOF from gzread() in gzio.c [Brown] +- Use zlib header window size if windowBits is 0 in inflateInit2() +- Remove compressBound() call in deflate.c to avoid linking compress.o +- Replace use of errno in gz* with functions, support WinCE [Alves] +- Provide alternative to perror() in minigzip.c for WinCE [Alves] +- Don't use _vsnprintf on later versions of MSVC [Lowman] +- Add CMake build script and input file [Lowman] +- Update contrib/minizip to 1.1 [Svensson, Vollant] +- Moved nintendods directory from contrib to . +- Replace gzio.c with a new set of routines with the same functionality +- Add gzbuffer(), gzoffset(), gzclose_r(), gzclose_w() as part of above +- Update contrib/minizip to 1.1b +- Change gzeof() to return 0 on error instead of -1 to agree with zlib.h + +Changes in 1.2.3.4 (21 Dec 2009) +- Use old school .SUFFIXES in Makefile.in for FreeBSD compatibility +- Update comments in configure and Makefile.in for default --shared +- Fix test -z's in configure [Marquess] +- Build examplesh and minigzipsh when not testing +- Change NULL's to Z_NULL's in deflate.c and in comments in zlib.h +- Import LDFLAGS from the environment in configure +- Fix configure to populate SFLAGS with discovered CFLAGS options +- Adapt make_vms.com to the new Makefile.in [Zinser] +- Add zlib2ansi script for C++ compilation [Marquess] +- Add _FILE_OFFSET_BITS=64 test to make test (when applicable) +- Add AMD64 assembler code for longest match to contrib [Teterin] +- Include options from $SFLAGS when doing $LDSHARED +- Simplify 64-bit file support by introducing z_off64_t type +- Make shared object files in objs directory to work around old Sun cc +- Use only three-part version number for Darwin shared compiles +- Add rc option to ar in Makefile.in for when ./configure not run +- Add -WI,-rpath,. to LDFLAGS for OSF 1 V4* +- Set LD_LIBRARYN32_PATH for SGI IRIX shared compile +- Protect against _FILE_OFFSET_BITS being defined when compiling zlib +- Rename Makefile.in targets allstatic to static and allshared to shared +- Fix static and shared Makefile.in targets to be independent +- Correct error return bug in gz_open() by setting state [Brown] +- Put spaces before ;;'s in configure for better sh compatibility +- Add pigz.c (parallel implementation of gzip) to examples/ +- Correct constant in crc32.c to UL [Leventhal] +- Reject negative lengths in crc32_combine() +- Add inflateReset2() function to work like inflateEnd()/inflateInit2() +- Include sys/types.h for _LARGEFILE64_SOURCE [Brown] +- Correct typo in doc/algorithm.txt [Janik] +- Fix bug in adler32_combine() [Zhu] +- Catch missing-end-of-block-code error in all inflates and in puff + Assures that random input to inflate eventually results in an error +- Added enough.c (calculation of ENOUGH for inftrees.h) to examples/ +- Update ENOUGH and its usage to reflect discovered bounds +- Fix gzerror() error report on empty input file [Brown] +- Add ush casts in trees.c to avoid pedantic runtime errors +- Fix typo in zlib.h uncompress() description [Reiss] +- Correct inflate() comments with regard to automatic header detection +- Remove deprecation comment on Z_PARTIAL_FLUSH (it stays) +- Put new version of gzlog (2.0) in examples with interruption recovery +- Add puff compile option to permit invalid distance-too-far streams +- Add puff TEST command options, ability to read piped input +- Prototype the *64 functions in zlib.h when _FILE_OFFSET_BITS == 64, but + _LARGEFILE64_SOURCE not defined +- Fix Z_FULL_FLUSH to truly erase the past by resetting s->strstart +- Fix deflateSetDictionary() to use all 32K for output consistency +- Remove extraneous #define MIN_LOOKAHEAD in deflate.c (in deflate.h) +- Clear bytes after deflate lookahead to avoid use of uninitialized data +- Change a limit in inftrees.c to be more transparent to Coverity Prevent +- Update win32/zlib.def with exported symbols from zlib.h +- Correct spelling errors in zlib.h [Willem, Sobrado] +- Allow Z_BLOCK for deflate() to force a new block +- Allow negative bits in inflatePrime() to delete existing bit buffer +- Add Z_TREES flush option to inflate() to return at end of trees +- Add inflateMark() to return current state information for random access +- Add Makefile for NintendoDS to contrib [Costa] +- Add -w in configure compile tests to avoid spurious warnings [Beucler] +- Fix typos in zlib.h comments for deflateSetDictionary() +- Fix EOF detection in transparent gzread() [Maier] + +Changes in 1.2.3.3 (2 October 2006) +- Make --shared the default for configure, add a --static option +- Add compile option to permit invalid distance-too-far streams +- Add inflateUndermine() function which is required to enable above +- Remove use of "this" variable name for C++ compatibility [Marquess] +- Add testing of shared library in make test, if shared library built +- Use ftello() and fseeko() if available instead of ftell() and fseek() +- Provide two versions of all functions that use the z_off_t type for + binary compatibility -- a normal version and a 64-bit offset version, + per the Large File Support Extension when _LARGEFILE64_SOURCE is + defined; use the 64-bit versions by default when _FILE_OFFSET_BITS + is defined to be 64 +- Add a --uname= option to configure to perhaps help with cross-compiling + +Changes in 1.2.3.2 (3 September 2006) +- Turn off silly Borland warnings [Hay] +- Use off64_t and define _LARGEFILE64_SOURCE when present +- Fix missing dependency on inffixed.h in Makefile.in +- Rig configure --shared to build both shared and static [Teredesai, Truta] +- Remove zconf.in.h and instead create a new zlibdefs.h file +- Fix contrib/minizip/unzip.c non-encrypted after encrypted [Vollant] +- Add treebuild.xml (see http://treebuild.metux.de/) [Weigelt] + +Changes in 1.2.3.1 (16 August 2006) +- Add watcom directory with OpenWatcom make files [Daniel] +- Remove #undef of FAR in zconf.in.h for MVS [Fedtke] +- Update make_vms.com [Zinser] +- Use -fPIC for shared build in configure [Teredesai, Nicholson] +- Use only major version number for libz.so on IRIX and OSF1 [Reinholdtsen] +- Use fdopen() (not _fdopen()) for Interix in zutil.h [Bäck] +- Add some FAQ entries about the contrib directory +- Update the MVS question in the FAQ +- Avoid extraneous reads after EOF in gzio.c [Brown] +- Correct spelling of "successfully" in gzio.c [Randers-Pehrson] +- Add comments to zlib.h about gzerror() usage [Brown] +- Set extra flags in gzip header in gzopen() like deflate() does +- Make configure options more compatible with double-dash conventions + [Weigelt] +- Clean up compilation under Solaris SunStudio cc [Rowe, Reinholdtsen] +- Fix uninstall target in Makefile.in [Truta] +- Add pkgconfig support [Weigelt] +- Use $(DESTDIR) macro in Makefile.in [Reinholdtsen, Weigelt] +- Replace set_data_type() with a more accurate detect_data_type() in + trees.c, according to the txtvsbin.txt document [Truta] +- Swap the order of #include and #include "zlib.h" in + gzio.c, example.c and minigzip.c [Truta] +- Shut up annoying VS2005 warnings about standard C deprecation [Rowe, + Truta] (where?) +- Fix target "clean" from win32/Makefile.bor [Truta] +- Create .pdb and .manifest files in win32/makefile.msc [Ziegler, Rowe] +- Update zlib www home address in win32/DLL_FAQ.txt [Truta] +- Update contrib/masmx86/inffas32.asm for VS2005 [Vollant, Van Wassenhove] +- Enable browse info in the "Debug" and "ASM Debug" configurations in + the Visual C++ 6 project, and set (non-ASM) "Debug" as default [Truta] +- Add pkgconfig support [Weigelt] +- Add ZLIB_VER_MAJOR, ZLIB_VER_MINOR and ZLIB_VER_REVISION in zlib.h, + for use in win32/zlib1.rc [Polushin, Rowe, Truta] +- Add a document that explains the new text detection scheme to + doc/txtvsbin.txt [Truta] +- Add rfc1950.txt, rfc1951.txt and rfc1952.txt to doc/ [Truta] +- Move algorithm.txt into doc/ [Truta] +- Synchronize FAQ with website +- Fix compressBound(), was low for some pathological cases [Fearnley] +- Take into account wrapper variations in deflateBound() +- Set examples/zpipe.c input and output to binary mode for Windows +- Update examples/zlib_how.html with new zpipe.c (also web site) +- Fix some warnings in examples/gzlog.c and examples/zran.c (it seems + that gcc became pickier in 4.0) +- Add zlib.map for Linux: "All symbols from zlib-1.1.4 remain + un-versioned, the patch adds versioning only for symbols introduced in + zlib-1.2.0 or later. It also declares as local those symbols which are + not designed to be exported." [Levin] +- Update Z_PREFIX list in zconf.in.h, add --zprefix option to configure +- Do not initialize global static by default in trees.c, add a response + NO_INIT_GLOBAL_POINTERS to initialize them if needed [Marquess] +- Don't use strerror() in gzio.c under WinCE [Yakimov] +- Don't use errno.h in zutil.h under WinCE [Yakimov] +- Move arguments for AR to its usage to allow replacing ar [Marot] +- Add HAVE_VISIBILITY_PRAGMA in zconf.in.h for Mozilla [Randers-Pehrson] +- Improve inflateInit() and inflateInit2() documentation +- Fix structure size comment in inflate.h +- Change configure help option from --h* to --help [Santos] + +Changes in 1.2.3 (18 July 2005) +- Apply security vulnerability fixes to contrib/infback9 as well +- Clean up some text files (carriage returns, trailing space) +- Update testzlib, vstudio, masmx64, and masmx86 in contrib [Vollant] + +Changes in 1.2.2.4 (11 July 2005) +- Add inflatePrime() function for starting inflation at bit boundary +- Avoid some Visual C warnings in deflate.c +- Avoid more silly Visual C warnings in inflate.c and inftrees.c for 64-bit + compile +- Fix some spelling errors in comments [Betts] +- Correct inflateInit2() error return documentation in zlib.h +- Add zran.c example of compressed data random access to examples + directory, shows use of inflatePrime() +- Fix cast for assignments to strm->state in inflate.c and infback.c +- Fix zlibCompileFlags() in zutil.c to use 1L for long shifts [Oberhumer] +- Move declarations of gf2 functions to right place in crc32.c [Oberhumer] +- Add cast in trees.c t avoid a warning [Oberhumer] +- Avoid some warnings in fitblk.c, gun.c, gzjoin.c in examples [Oberhumer] +- Update make_vms.com [Zinser] +- Initialize state->write in inflateReset() since copied in inflate_fast() +- Be more strict on incomplete code sets in inflate_table() and increase + ENOUGH and MAXD -- this repairs a possible security vulnerability for + invalid inflate input. Thanks to Tavis Ormandy and Markus Oberhumer for + discovering the vulnerability and providing test cases. +- Add ia64 support to configure for HP-UX [Smith] +- Add error return to gzread() for format or i/o error [Levin] +- Use malloc.h for OS/2 [Necasek] + +Changes in 1.2.2.3 (27 May 2005) +- Replace 1U constants in inflate.c and inftrees.c for 64-bit compile +- Typecast fread() return values in gzio.c [Vollant] +- Remove trailing space in minigzip.c outmode (VC++ can't deal with it) +- Fix crc check bug in gzread() after gzungetc() [Heiner] +- Add the deflateTune() function to adjust internal compression parameters +- Add a fast gzip decompressor, gun.c, to examples (use of inflateBack) +- Remove an incorrect assertion in examples/zpipe.c +- Add C++ wrapper in infback9.h [Donais] +- Fix bug in inflateCopy() when decoding fixed codes +- Note in zlib.h how much deflateSetDictionary() actually uses +- Remove USE_DICT_HEAD in deflate.c (would mess up inflate if used) +- Add _WIN32_WCE to define WIN32 in zconf.in.h [Spencer] +- Don't include stderr.h or errno.h for _WIN32_WCE in zutil.h [Spencer] +- Add gzdirect() function to indicate transparent reads +- Update contrib/minizip [Vollant] +- Fix compilation of deflate.c when both ASMV and FASTEST [Oberhumer] +- Add casts in crc32.c to avoid warnings [Oberhumer] +- Add contrib/masmx64 [Vollant] +- Update contrib/asm586, asm686, masmx86, testzlib, vstudio [Vollant] + +Changes in 1.2.2.2 (30 December 2004) +- Replace structure assignments in deflate.c and inflate.c with zmemcpy to + avoid implicit memcpy calls (portability for no-library compilation) +- Increase sprintf() buffer size in gzdopen() to allow for large numbers +- Add INFLATE_STRICT to check distances against zlib header +- Improve WinCE errno handling and comments [Chang] +- Remove comment about no gzip header processing in FAQ +- Add Z_FIXED strategy option to deflateInit2() to force fixed trees +- Add updated make_vms.com [Coghlan], update README +- Create a new "examples" directory, move gzappend.c there, add zpipe.c, + fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html. +- Add FAQ entry and comments in deflate.c on uninitialized memory access +- Add Solaris 9 make options in configure [Gilbert] +- Allow strerror() usage in gzio.c for STDC +- Fix DecompressBuf in contrib/delphi/ZLib.pas [ManChesTer] +- Update contrib/masmx86/inffas32.asm and gvmat32.asm [Vollant] +- Use z_off_t for adler32_combine() and crc32_combine() lengths +- Make adler32() much faster for small len +- Use OS_CODE in deflate() default gzip header + +Changes in 1.2.2.1 (31 October 2004) +- Allow inflateSetDictionary() call for raw inflate +- Fix inflate header crc check bug for file names and comments +- Add deflateSetHeader() and gz_header structure for custom gzip headers +- Add inflateGetheader() to retrieve gzip headers +- Add crc32_combine() and adler32_combine() functions +- Add alloc_func, free_func, in_func, out_func to Z_PREFIX list +- Use zstreamp consistently in zlib.h (inflate_back functions) +- Remove GUNZIP condition from definition of inflate_mode in inflate.h + and in contrib/inflate86/inffast.S [Truta, Anderson] +- Add support for AMD64 in contrib/inflate86/inffas86.c [Anderson] +- Update projects/README.projects and projects/visualc6 [Truta] +- Update win32/DLL_FAQ.txt [Truta] +- Avoid warning under NO_GZCOMPRESS in gzio.c; fix typo [Truta] +- Deprecate Z_ASCII; use Z_TEXT instead [Truta] +- Use a new algorithm for setting strm->data_type in trees.c [Truta] +- Do not define an exit() prototype in zutil.c unless DEBUG defined +- Remove prototype of exit() from zutil.c, example.c, minigzip.c [Truta] +- Add comment in zlib.h for Z_NO_FLUSH parameter to deflate() +- Fix Darwin build version identification [Peterson] + +Changes in 1.2.2 (3 October 2004) +- Update zlib.h comments on gzip in-memory processing +- Set adler to 1 in inflateReset() to support Java test suite [Walles] +- Add contrib/dotzlib [Ravn] +- Update win32/DLL_FAQ.txt [Truta] +- Update contrib/minizip [Vollant] +- Move contrib/visual-basic.txt to old/ [Truta] +- Fix assembler builds in projects/visualc6/ [Truta] + +Changes in 1.2.1.2 (9 September 2004) +- Update INDEX file +- Fix trees.c to update strm->data_type (no one ever noticed!) +- Fix bug in error case in inflate.c, infback.c, and infback9.c [Brown] +- Add "volatile" to crc table flag declaration (for DYNAMIC_CRC_TABLE) +- Add limited multitasking protection to DYNAMIC_CRC_TABLE +- Add NO_vsnprintf for VMS in zutil.h [Mozilla] +- Don't declare strerror() under VMS [Mozilla] +- Add comment to DYNAMIC_CRC_TABLE to use get_crc_table() to initialize +- Update contrib/ada [Anisimkov] +- Update contrib/minizip [Vollant] +- Fix configure to not hardcode directories for Darwin [Peterson] +- Fix gzio.c to not return error on empty files [Brown] +- Fix indentation; update version in contrib/delphi/ZLib.pas and + contrib/pascal/zlibpas.pas [Truta] +- Update mkasm.bat in contrib/masmx86 [Truta] +- Update contrib/untgz [Truta] +- Add projects/README.projects [Truta] +- Add project for MS Visual C++ 6.0 in projects/visualc6 [Cadieux, Truta] +- Update win32/DLL_FAQ.txt [Truta] +- Update list of Z_PREFIX symbols in zconf.h [Randers-Pehrson, Truta] +- Remove an unnecessary assignment to curr in inftrees.c [Truta] +- Add OS/2 to exe builds in configure [Poltorak] +- Remove err dummy parameter in zlib.h [Kientzle] + +Changes in 1.2.1.1 (9 January 2004) +- Update email address in README +- Several FAQ updates +- Fix a big fat bug in inftrees.c that prevented decoding valid + dynamic blocks with only literals and no distance codes -- + Thanks to "Hot Emu" for the bug report and sample file +- Add a note to puff.c on no distance codes case. + +Changes in 1.2.1 (17 November 2003) +- Remove a tab in contrib/gzappend/gzappend.c +- Update some interfaces in contrib for new zlib functions +- Update zlib version number in some contrib entries +- Add Windows CE definition for ptrdiff_t in zutil.h [Mai, Truta] +- Support shared libraries on Hurd and KFreeBSD [Brown] +- Fix error in NO_DIVIDE option of adler32.c + +Changes in 1.2.0.8 (4 November 2003) +- Update version in contrib/delphi/ZLib.pas and contrib/pascal/zlibpas.pas +- Add experimental NO_DIVIDE #define in adler32.c + - Possibly faster on some processors (let me know if it is) +- Correct Z_BLOCK to not return on first inflate call if no wrap +- Fix strm->data_type on inflate() return to correctly indicate EOB +- Add deflatePrime() function for appending in the middle of a byte +- Add contrib/gzappend for an example of appending to a stream +- Update win32/DLL_FAQ.txt [Truta] +- Delete Turbo C comment in README [Truta] +- Improve some indentation in zconf.h [Truta] +- Fix infinite loop on bad input in configure script [Church] +- Fix gzeof() for concatenated gzip files [Johnson] +- Add example to contrib/visual-basic.txt [Michael B.] +- Add -p to mkdir's in Makefile.in [vda] +- Fix configure to properly detect presence or lack of printf functions +- Add AS400 support [Monnerat] +- Add a little Cygwin support [Wilson] + +Changes in 1.2.0.7 (21 September 2003) +- Correct some debug formats in contrib/infback9 +- Cast a type in a debug statement in trees.c +- Change search and replace delimiter in configure from % to # [Beebe] +- Update contrib/untgz to 0.2 with various fixes [Truta] +- Add build support for Amiga [Nikl] +- Remove some directories in old that have been updated to 1.2 +- Add dylib building for Mac OS X in configure and Makefile.in +- Remove old distribution stuff from Makefile +- Update README to point to DLL_FAQ.txt, and add comment on Mac OS X +- Update links in README + +Changes in 1.2.0.6 (13 September 2003) +- Minor FAQ updates +- Update contrib/minizip to 1.00 [Vollant] +- Remove test of gz functions in example.c when GZ_COMPRESS defined [Truta] +- Update POSTINC comment for 68060 [Nikl] +- Add contrib/infback9 with deflate64 decoding (unsupported) +- For MVS define NO_vsnprintf and undefine FAR [van Burik] +- Add pragma for fdopen on MVS [van Burik] + +Changes in 1.2.0.5 (8 September 2003) +- Add OF to inflateBackEnd() declaration in zlib.h +- Remember start when using gzdopen in the middle of a file +- Use internal off_t counters in gz* functions to properly handle seeks +- Perform more rigorous check for distance-too-far in inffast.c +- Add Z_BLOCK flush option to return from inflate at block boundary +- Set strm->data_type on return from inflate + - Indicate bits unused, if at block boundary, and if in last block +- Replace size_t with ptrdiff_t in crc32.c, and check for correct size +- Add condition so old NO_DEFLATE define still works for compatibility +- FAQ update regarding the Windows DLL [Truta] +- INDEX update: add qnx entry, remove aix entry [Truta] +- Install zlib.3 into mandir [Wilson] +- Move contrib/zlib_dll_FAQ.txt to win32/DLL_FAQ.txt; update [Truta] +- Adapt the zlib interface to the new DLL convention guidelines [Truta] +- Introduce ZLIB_WINAPI macro to allow the export of functions using + the WINAPI calling convention, for Visual Basic [Vollant, Truta] +- Update msdos and win32 scripts and makefiles [Truta] +- Export symbols by name, not by ordinal, in win32/zlib.def [Truta] +- Add contrib/ada [Anisimkov] +- Move asm files from contrib/vstudio/vc70_32 to contrib/asm386 [Truta] +- Rename contrib/asm386 to contrib/masmx86 [Truta, Vollant] +- Add contrib/masm686 [Truta] +- Fix offsets in contrib/inflate86 and contrib/masmx86/inffas32.asm + [Truta, Vollant] +- Update contrib/delphi; rename to contrib/pascal; add example [Truta] +- Remove contrib/delphi2; add a new contrib/delphi [Truta] +- Avoid inclusion of the nonstandard in contrib/iostream, + and fix some method prototypes [Truta] +- Fix the ZCR_SEED2 constant to avoid warnings in contrib/minizip + [Truta] +- Avoid the use of backslash (\) in contrib/minizip [Vollant] +- Fix file time handling in contrib/untgz; update makefiles [Truta] +- Update contrib/vstudio/vc70_32 to comply with the new DLL guidelines + [Vollant] +- Remove contrib/vstudio/vc15_16 [Vollant] +- Rename contrib/vstudio/vc70_32 to contrib/vstudio/vc7 [Truta] +- Update README.contrib [Truta] +- Invert the assignment order of match_head and s->prev[...] in + INSERT_STRING [Truta] +- Compare TOO_FAR with 32767 instead of 32768, to avoid 16-bit warnings + [Truta] +- Compare function pointers with 0, not with NULL or Z_NULL [Truta] +- Fix prototype of syncsearch in inflate.c [Truta] +- Introduce ASMINF macro to be enabled when using an ASM implementation + of inflate_fast [Truta] +- Change NO_DEFLATE to NO_GZCOMPRESS [Truta] +- Modify test_gzio in example.c to take a single file name as a + parameter [Truta] +- Exit the example.c program if gzopen fails [Truta] +- Add type casts around strlen in example.c [Truta] +- Remove casting to sizeof in minigzip.c; give a proper type + to the variable compared with SUFFIX_LEN [Truta] +- Update definitions of STDC and STDC99 in zconf.h [Truta] +- Synchronize zconf.h with the new Windows DLL interface [Truta] +- Use SYS16BIT instead of __32BIT__ to distinguish between + 16- and 32-bit platforms [Truta] +- Use far memory allocators in small 16-bit memory models for + Turbo C [Truta] +- Add info about the use of ASMV, ASMINF and ZLIB_WINAPI in + zlibCompileFlags [Truta] +- Cygwin has vsnprintf [Wilson] +- In Windows16, OS_CODE is 0, as in MSDOS [Truta] +- In Cygwin, OS_CODE is 3 (Unix), not 11 (Windows32) [Wilson] + +Changes in 1.2.0.4 (10 August 2003) +- Minor FAQ updates +- Be more strict when checking inflateInit2's windowBits parameter +- Change NO_GUNZIP compile option to NO_GZIP to cover deflate as well +- Add gzip wrapper option to deflateInit2 using windowBits +- Add updated QNX rule in configure and qnx directory [Bonnefoy] +- Make inflate distance-too-far checks more rigorous +- Clean up FAR usage in inflate +- Add casting to sizeof() in gzio.c and minigzip.c + +Changes in 1.2.0.3 (19 July 2003) +- Fix silly error in gzungetc() implementation [Vollant] +- Update contrib/minizip and contrib/vstudio [Vollant] +- Fix printf format in example.c +- Correct cdecl support in zconf.in.h [Anisimkov] +- Minor FAQ updates + +Changes in 1.2.0.2 (13 July 2003) +- Add ZLIB_VERNUM in zlib.h for numerical preprocessor comparisons +- Attempt to avoid warnings in crc32.c for pointer-int conversion +- Add AIX to configure, remove aix directory [Bakker] +- Add some casts to minigzip.c +- Improve checking after insecure sprintf() or vsprintf() calls +- Remove #elif's from crc32.c +- Change leave label to inf_leave in inflate.c and infback.c to avoid + library conflicts +- Remove inflate gzip decoding by default--only enable gzip decoding by + special request for stricter backward compatibility +- Add zlibCompileFlags() function to return compilation information +- More typecasting in deflate.c to avoid warnings +- Remove leading underscore from _Capital #defines [Truta] +- Fix configure to link shared library when testing +- Add some Windows CE target adjustments [Mai] +- Remove #define ZLIB_DLL in zconf.h [Vollant] +- Add zlib.3 [Rodgers] +- Update RFC URL in deflate.c and algorithm.txt [Mai] +- Add zlib_dll_FAQ.txt to contrib [Truta] +- Add UL to some constants [Truta] +- Update minizip and vstudio [Vollant] +- Remove vestigial NEED_DUMMY_RETURN from zconf.in.h +- Expand use of NO_DUMMY_DECL to avoid all dummy structures +- Added iostream3 to contrib [Schwardt] +- Replace rewind() with fseek() for WinCE [Truta] +- Improve setting of zlib format compression level flags + - Report 0 for huffman and rle strategies and for level == 0 or 1 + - Report 2 only for level == 6 +- Only deal with 64K limit when necessary at compile time [Truta] +- Allow TOO_FAR check to be turned off at compile time [Truta] +- Add gzclearerr() function [Souza] +- Add gzungetc() function + +Changes in 1.2.0.1 (17 March 2003) +- Add Z_RLE strategy for run-length encoding [Truta] + - When Z_RLE requested, restrict matches to distance one + - Update zlib.h, minigzip.c, gzopen(), gzdopen() for Z_RLE +- Correct FASTEST compilation to allow level == 0 +- Clean up what gets compiled for FASTEST +- Incorporate changes to zconf.in.h [Vollant] + - Refine detection of Turbo C need for dummy returns + - Refine ZLIB_DLL compilation + - Include additional header file on VMS for off_t typedef +- Try to use _vsnprintf where it supplants vsprintf [Vollant] +- Add some casts in inffast.c +- Enchance comments in zlib.h on what happens if gzprintf() tries to + write more than 4095 bytes before compression +- Remove unused state from inflateBackEnd() +- Remove exit(0) from minigzip.c, example.c +- Get rid of all those darn tabs +- Add "check" target to Makefile.in that does the same thing as "test" +- Add "mostlyclean" and "maintainer-clean" targets to Makefile.in +- Update contrib/inflate86 [Anderson] +- Update contrib/testzlib, contrib/vstudio, contrib/minizip [Vollant] +- Add msdos and win32 directories with makefiles [Truta] +- More additions and improvements to the FAQ + +Changes in 1.2.0 (9 March 2003) +- New and improved inflate code + - About 20% faster + - Does not allocate 32K window unless and until needed + - Automatically detects and decompresses gzip streams + - Raw inflate no longer needs an extra dummy byte at end + - Added inflateBack functions using a callback interface--even faster + than inflate, useful for file utilities (gzip, zip) + - Added inflateCopy() function to record state for random access on + externally generated deflate streams (e.g. in gzip files) + - More readable code (I hope) +- New and improved crc32() + - About 50% faster, thanks to suggestions from Rodney Brown +- Add deflateBound() and compressBound() functions +- Fix memory leak in deflateInit2() +- Permit setting dictionary for raw deflate (for parallel deflate) +- Fix const declaration for gzwrite() +- Check for some malloc() failures in gzio.c +- Fix bug in gzopen() on single-byte file 0x1f +- Fix bug in gzread() on concatenated file with 0x1f at end of buffer + and next buffer doesn't start with 0x8b +- Fix uncompress() to return Z_DATA_ERROR on truncated input +- Free memory at end of example.c +- Remove MAX #define in trees.c (conflicted with some libraries) +- Fix static const's in deflate.c, gzio.c, and zutil.[ch] +- Declare malloc() and free() in gzio.c if STDC not defined +- Use malloc() instead of calloc() in zutil.c if int big enough +- Define STDC for AIX +- Add aix/ with approach for compiling shared library on AIX +- Add HP-UX support for shared libraries in configure +- Add OpenUNIX support for shared libraries in configure +- Use $cc instead of gcc to build shared library +- Make prefix directory if needed when installing +- Correct Macintosh avoidance of typedef Byte in zconf.h +- Correct Turbo C memory allocation when under Linux +- Use libz.a instead of -lz in Makefile (assure use of compiled library) +- Update configure to check for snprintf or vsnprintf functions and their + return value, warn during make if using an insecure function +- Fix configure problem with compile-time knowledge of HAVE_UNISTD_H that + is lost when library is used--resolution is to build new zconf.h +- Documentation improvements (in zlib.h): + - Document raw deflate and inflate + - Update RFCs URL + - Point out that zlib and gzip formats are different + - Note that Z_BUF_ERROR is not fatal + - Document string limit for gzprintf() and possible buffer overflow + - Note requirement on avail_out when flushing + - Note permitted values of flush parameter of inflate() +- Add some FAQs (and even answers) to the FAQ +- Add contrib/inflate86/ for x86 faster inflate +- Add contrib/blast/ for PKWare Data Compression Library decompression +- Add contrib/puff/ simple inflate for deflate format description + +Changes in 1.1.4 (11 March 2002) +- ZFREE was repeated on same allocation on some error conditions. + This creates a security problem described in + http://www.zlib.org/advisory-2002-03-11.txt +- Returned incorrect error (Z_MEM_ERROR) on some invalid data +- Avoid accesses before window for invalid distances with inflate window + less than 32K. +- force windowBits > 8 to avoid a bug in the encoder for a window size + of 256 bytes. (A complete fix will be available in 1.1.5). + +Changes in 1.1.3 (9 July 1998) +- fix "an inflate input buffer bug that shows up on rare but persistent + occasions" (Mark) +- fix gzread and gztell for concatenated .gz files (Didier Le Botlan) +- fix gzseek(..., SEEK_SET) in write mode +- fix crc check after a gzeek (Frank Faubert) +- fix miniunzip when the last entry in a zip file is itself a zip file + (J Lillge) +- add contrib/asm586 and contrib/asm686 (Brian Raiter) + See http://www.muppetlabs.com/~breadbox/software/assembly.html +- add support for Delphi 3 in contrib/delphi (Bob Dellaca) +- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti) +- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren) +- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks) +- added a FAQ file + +- Support gzdopen on Mac with Metrowerks (Jason Linhart) +- Do not redefine Byte on Mac (Brad Pettit & Jason Linhart) +- define SEEK_END too if SEEK_SET is not defined (Albert Chin-A-Young) +- avoid some warnings with Borland C (Tom Tanner) +- fix a problem in contrib/minizip/zip.c for 16-bit MSDOS (Gilles Vollant) +- emulate utime() for WIN32 in contrib/untgz (Gilles Vollant) +- allow several arguments to configure (Tim Mooney, Frodo Looijaard) +- use libdir and includedir in Makefile.in (Tim Mooney) +- support shared libraries on OSF1 V4 (Tim Mooney) +- remove so_locations in "make clean" (Tim Mooney) +- fix maketree.c compilation error (Glenn, Mark) +- Python interface to zlib now in Python 1.5 (Jeremy Hylton) +- new Makefile.riscos (Rich Walker) +- initialize static descriptors in trees.c for embedded targets (Nick Smith) +- use "foo-gz" in example.c for RISCOS and VMS (Nick Smith) +- add the OS/2 files in Makefile.in too (Andrew Zabolotny) +- fix fdopen and halloc macros for Microsoft C 6.0 (Tom Lane) +- fix maketree.c to allow clean compilation of inffixed.h (Mark) +- fix parameter check in deflateCopy (Gunther Nikl) +- cleanup trees.c, use compressed_len only in debug mode (Christian Spieler) +- Many portability patches by Christian Spieler: + . zutil.c, zutil.h: added "const" for zmem* + . Make_vms.com: fixed some typos + . Make_vms.com: msdos/Makefile.*: removed zutil.h from some dependency lists + . msdos/Makefile.msc: remove "default rtl link library" info from obj files + . msdos/Makefile.*: use model-dependent name for the built zlib library + . msdos/Makefile.emx, nt/Makefile.emx, nt/Makefile.gcc: + new makefiles, for emx (DOS/OS2), emx&rsxnt and mingw32 (Windows 9x / NT) +- use define instead of typedef for Bytef also for MSC small/medium (Tom Lane) +- replace __far with _far for better portability (Christian Spieler, Tom Lane) +- fix test for errno.h in configure (Tim Newsham) + +Changes in 1.1.2 (19 March 98) +- added contrib/minzip, mini zip and unzip based on zlib (Gilles Vollant) + See http://www.winimage.com/zLibDll/unzip.html +- preinitialize the inflate tables for fixed codes, to make the code + completely thread safe (Mark) +- some simplifications and slight speed-up to the inflate code (Mark) +- fix gzeof on non-compressed files (Allan Schrum) +- add -std1 option in configure for OSF1 to fix gzprintf (Martin Mokrejs) +- use default value of 4K for Z_BUFSIZE for 16-bit MSDOS (Tim Wegner + Glenn) +- added os2/Makefile.def and os2/zlib.def (Andrew Zabolotny) +- add shared lib support for UNIX_SV4.2MP (MATSUURA Takanori) +- do not wrap extern "C" around system includes (Tom Lane) +- mention zlib binding for TCL in README (Andreas Kupries) +- added amiga/Makefile.pup for Amiga powerUP SAS/C PPC (Andreas Kleinert) +- allow "make install prefix=..." even after configure (Glenn Randers-Pehrson) +- allow "configure --prefix $HOME" (Tim Mooney) +- remove warnings in example.c and gzio.c (Glenn Randers-Pehrson) +- move Makefile.sas to amiga/Makefile.sas + +Changes in 1.1.1 (27 Feb 98) +- fix macros _tr_tally_* in deflate.h for debug mode (Glenn Randers-Pehrson) +- remove block truncation heuristic which had very marginal effect for zlib + (smaller lit_bufsize than in gzip 1.2.4) and degraded a little the + compression ratio on some files. This also allows inlining _tr_tally for + matches in deflate_slow. +- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier) + +Changes in 1.1.0 (24 Feb 98) +- do not return STREAM_END prematurely in inflate (John Bowler) +- revert to the zlib 1.0.8 inflate to avoid the gcc 2.8.0 bug (Jeremy Buhler) +- compile with -DFASTEST to get compression code optimized for speed only +- in minigzip, try mmap'ing the input file first (Miguel Albrecht) +- increase size of I/O buffers in minigzip.c and gzio.c (not a big gain + on Sun but significant on HP) + +- add a pointer to experimental unzip library in README (Gilles Vollant) +- initialize variable gcc in configure (Chris Herborth) + +Changes in 1.0.9 (17 Feb 1998) +- added gzputs and gzgets functions +- do not clear eof flag in gzseek (Mark Diekhans) +- fix gzseek for files in transparent mode (Mark Diekhans) +- do not assume that vsprintf returns the number of bytes written (Jens Krinke) +- replace EXPORT with ZEXPORT to avoid conflict with other programs +- added compress2 in zconf.h, zlib.def, zlib.dnt +- new asm code from Gilles Vollant in contrib/asm386 +- simplify the inflate code (Mark): + . Replace ZALLOC's in huft_build() with single ZALLOC in inflate_blocks_new() + . ZALLOC the length list in inflate_trees_fixed() instead of using stack + . ZALLOC the value area for huft_build() instead of using stack + . Simplify Z_FINISH check in inflate() + +- Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8 +- in inftrees.c, avoid cc -O bug on HP (Farshid Elahi) +- in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with + the declaration of FAR (Gilles VOllant) +- install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann) +- read_buf buf parameter of type Bytef* instead of charf* +- zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout) +- do not redeclare unlink in minigzip.c for WIN32 (John Bowler) +- fix check for presence of directories in "make install" (Ian Willis) + +Changes in 1.0.8 (27 Jan 1998) +- fixed offsets in contrib/asm386/gvmat32.asm (Gilles Vollant) +- fix gzgetc and gzputc for big endian systems (Markus Oberhumer) +- added compress2() to allow setting the compression level +- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong) +- use constant arrays for the static trees in trees.c instead of computing + them at run time (thanks to Ken Raeburn for this suggestion). To create + trees.h, compile with GEN_TREES_H and run "make test". +- check return code of example in "make test" and display result +- pass minigzip command line options to file_compress +- simplifying code of inflateSync to avoid gcc 2.8 bug + +- support CC="gcc -Wall" in configure -s (QingLong) +- avoid a flush caused by ftell in gzopen for write mode (Ken Raeburn) +- fix test for shared library support to avoid compiler warnings +- zlib.lib -> zlib.dll in msdos/zlib.rc (Gilles Vollant) +- check for TARGET_OS_MAC in addition to MACOS (Brad Pettit) +- do not use fdopen for Metrowerks on Mac (Brad Pettit)) +- add checks for gzputc and gzputc in example.c +- avoid warnings in gzio.c and deflate.c (Andreas Kleinert) +- use const for the CRC table (Ken Raeburn) +- fixed "make uninstall" for shared libraries +- use Tracev instead of Trace in infblock.c +- in example.c use correct compressed length for test_sync +- suppress +vnocompatwarnings in configure for HPUX (not always supported) + +Changes in 1.0.7 (20 Jan 1998) +- fix gzseek which was broken in write mode +- return error for gzseek to negative absolute position +- fix configure for Linux (Chun-Chung Chen) +- increase stack space for MSC (Tim Wegner) +- get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant) +- define EXPORTVA for gzprintf (Gilles Vollant) +- added man page zlib.3 (Rick Rodgers) +- for contrib/untgz, fix makedir() and improve Makefile + +- check gzseek in write mode in example.c +- allocate extra buffer for seeks only if gzseek is actually called +- avoid signed/unsigned comparisons (Tim Wegner, Gilles Vollant) +- add inflateSyncPoint in zconf.h +- fix list of exported functions in nt/zlib.dnt and mdsos/zlib.def + +Changes in 1.0.6 (19 Jan 1998) +- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and + gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code) +- Fix a deflate bug occurring only with compression level 0 (thanks to + Andy Buckler for finding this one). +- In minigzip, pass transparently also the first byte for .Z files. +- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress() +- check Z_FINISH in inflate (thanks to Marc Schluper) +- Implement deflateCopy (thanks to Adam Costello) +- make static libraries by default in configure, add --shared option. +- move MSDOS or Windows specific files to directory msdos +- suppress the notion of partial flush to simplify the interface + (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4) +- suppress history buffer provided by application to simplify the interface + (this feature was not implemented anyway in 1.0.4) +- next_in and avail_in must be initialized before calling inflateInit or + inflateInit2 +- add EXPORT in all exported functions (for Windows DLL) +- added Makefile.nt (thanks to Stephen Williams) +- added the unsupported "contrib" directory: + contrib/asm386/ by Gilles Vollant + 386 asm code replacing longest_match(). + contrib/iostream/ by Kevin Ruland + A C++ I/O streams interface to the zlib gz* functions + contrib/iostream2/ by Tyge Løvset + Another C++ I/O streams interface + contrib/untgz/ by "Pedro A. Aranda Guti\irrez" + A very simple tar.gz file extractor using zlib + contrib/visual-basic.txt by Carlos Rios + How to use compress(), uncompress() and the gz* functions from VB. +- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression + level) in minigzip (thanks to Tom Lane) + +- use const for rommable constants in deflate +- added test for gzseek and gztell in example.c +- add undocumented function inflateSyncPoint() (hack for Paul Mackerras) +- add undocumented function zError to convert error code to string + (for Tim Smithers) +- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code. +- Use default memcpy for Symantec MSDOS compiler. +- Add EXPORT keyword for check_func (needed for Windows DLL) +- add current directory to LD_LIBRARY_PATH for "make test" +- create also a link for libz.so.1 +- added support for FUJITSU UXP/DS (thanks to Toshiaki Nomura) +- use $(SHAREDLIB) instead of libz.so in Makefile.in (for HPUX) +- added -soname for Linux in configure (Chun-Chung Chen, +- assign numbers to the exported functions in zlib.def (for Windows DLL) +- add advice in zlib.h for best usage of deflateSetDictionary +- work around compiler bug on Atari (cast Z_NULL in call of s->checkfn) +- allow compilation with ANSI keywords only enabled for TurboC in large model +- avoid "versionString"[0] (Borland bug) +- add NEED_DUMMY_RETURN for Borland +- use variable z_verbose for tracing in debug mode (L. Peter Deutsch). +- allow compilation with CC +- defined STDC for OS/2 (David Charlap) +- limit external names to 8 chars for MVS (Thomas Lund) +- in minigzip.c, use static buffers only for 16-bit systems +- fix suffix check for "minigzip -d foo.gz" +- do not return an error for the 2nd of two consecutive gzflush() (Felix Lee) +- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau) +- added makelcc.bat for lcc-win32 (Tom St Denis) +- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe) +- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion. +- check for unistd.h in configure (for off_t) +- remove useless check parameter in inflate_blocks_free +- avoid useless assignment of s->check to itself in inflate_blocks_new +- do not flush twice in gzclose (thanks to Ken Raeburn) +- rename FOPEN as F_OPEN to avoid clash with /usr/include/sys/file.h +- use NO_ERRNO_H instead of enumeration of operating systems with errno.h +- work around buggy fclose on pipes for HP/UX +- support zlib DLL with BORLAND C++ 5.0 (thanks to Glenn Randers-Pehrson) +- fix configure if CC is already equal to gcc + +Changes in 1.0.5 (3 Jan 98) +- Fix inflate to terminate gracefully when fed corrupted or invalid data +- Use const for rommable constants in inflate +- Eliminate memory leaks on error conditions in inflate +- Removed some vestigial code in inflate +- Update web address in README + +Changes in 1.0.4 (24 Jul 96) +- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF + bit, so the decompressor could decompress all the correct data but went + on to attempt decompressing extra garbage data. This affected minigzip too. +- zlibVersion and gzerror return const char* (needed for DLL) +- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno) +- use z_error only for DEBUG (avoid problem with DLLs) + +Changes in 1.0.3 (2 Jul 96) +- use z_streamp instead of z_stream *, which is now a far pointer in MSDOS + small and medium models; this makes the library incompatible with previous + versions for these models. (No effect in large model or on other systems.) +- return OK instead of BUF_ERROR if previous deflate call returned with + avail_out as zero but there is nothing to do +- added memcmp for non STDC compilers +- define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly) +- define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO) +- better check for 16-bit mode MSC (avoids problem with Symantec) + +Changes in 1.0.2 (23 May 96) +- added Windows DLL support +- added a function zlibVersion (for the DLL support) +- fixed declarations using Bytef in infutil.c (pb with MSDOS medium model) +- Bytef is define's instead of typedef'd only for Borland C +- avoid reading uninitialized memory in example.c +- mention in README that the zlib format is now RFC1950 +- updated Makefile.dj2 +- added algorithm.doc + +Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion] +- fix array overlay in deflate.c which sometimes caused bad compressed data +- fix inflate bug with empty stored block +- fix MSDOS medium model which was broken in 0.99 +- fix deflateParams() which could generate bad compressed data. +- Bytef is define'd instead of typedef'ed (work around Borland bug) +- added an INDEX file +- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32), + Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas) +- speed up adler32 for modern machines without auto-increment +- added -ansi for IRIX in configure +- static_init_done in trees.c is an int +- define unlink as delete for VMS +- fix configure for QNX +- add configure branch for SCO and HPUX +- avoid many warnings (unused variables, dead assignments, etc...) +- no fdopen for BeOS +- fix the Watcom fix for 32 bit mode (define FAR as empty) +- removed redefinition of Byte for MKWERKS +- work around an MWKERKS bug (incorrect merge of all .h files) + +Changes in 0.99 (27 Jan 96) +- allow preset dictionary shared between compressor and decompressor +- allow compression level 0 (no compression) +- add deflateParams in zlib.h: allow dynamic change of compression level + and compression strategy. +- test large buffers and deflateParams in example.c +- add optional "configure" to build zlib as a shared library +- suppress Makefile.qnx, use configure instead +- fixed deflate for 64-bit systems (detected on Cray) +- fixed inflate_blocks for 64-bit systems (detected on Alpha) +- declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2) +- always return Z_BUF_ERROR when deflate() has nothing to do +- deflateInit and inflateInit are now macros to allow version checking +- prefix all global functions and types with z_ with -DZ_PREFIX +- make falloc completely reentrant (inftrees.c) +- fixed very unlikely race condition in ct_static_init +- free in reverse order of allocation to help memory manager +- use zlib-1.0/* instead of zlib/* inside the tar.gz +- make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith + -Wconversion -Wstrict-prototypes -Wmissing-prototypes" +- allow gzread on concatenated .gz files +- deflateEnd now returns Z_DATA_ERROR if it was premature +- deflate is finally (?) fully deterministic (no matches beyond end of input) +- Document Z_SYNC_FLUSH +- add uninstall in Makefile +- Check for __cpluplus in zlib.h +- Better test in ct_align for partial flush +- avoid harmless warnings for Borland C++ +- initialize hash_head in deflate.c +- avoid warning on fdopen (gzio.c) for HP cc -Aa +- include stdlib.h for STDC compilers +- include errno.h for Cray +- ignore error if ranlib doesn't exist +- call ranlib twice for NeXTSTEP +- use exec_prefix instead of prefix for libz.a +- renamed ct_* as _tr_* to avoid conflict with applications +- clear z->msg in inflateInit2 before any error return +- initialize opaque in example.c, gzio.c, deflate.c and inflate.c +- fixed typo in zconf.h (_GNUC__ => __GNUC__) +- check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode) +- fix typo in Make_vms.com (f$trnlnm -> f$getsyi) +- in fcalloc, normalize pointer if size > 65520 bytes +- don't use special fcalloc for 32 bit Borland C++ +- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc... +- use Z_BINARY instead of BINARY +- document that gzclose after gzdopen will close the file +- allow "a" as mode in gzopen. +- fix error checking in gzread +- allow skipping .gz extra-field on pipes +- added reference to Perl interface in README +- put the crc table in FAR data (I dislike more and more the medium model :) +- added get_crc_table +- added a dimension to all arrays (Borland C can't count). +- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast +- guard against multiple inclusion of *.h (for precompiled header on Mac) +- Watcom C pretends to be Microsoft C small model even in 32 bit mode. +- don't use unsized arrays to avoid silly warnings by Visual C++: + warning C4746: 'inflate_mask' : unsized array treated as '__far' + (what's wrong with far data in far model?). +- define enum out of inflate_blocks_state to allow compilation with C++ + +Changes in 0.95 (16 Aug 95) +- fix MSDOS small and medium model (now easier to adapt to any compiler) +- inlined send_bits +- fix the final (:-) bug for deflate with flush (output was correct but + not completely flushed in rare occasions). +- default window size is same for compression and decompression + (it's now sufficient to set MAX_WBITS in zconf.h). +- voidp -> voidpf and voidnp -> voidp (for consistency with other + typedefs and because voidnp was not near in large model). + +Changes in 0.94 (13 Aug 95) +- support MSDOS medium model +- fix deflate with flush (could sometimes generate bad output) +- fix deflateReset (zlib header was incorrectly suppressed) +- added support for VMS +- allow a compression level in gzopen() +- gzflush now calls fflush +- For deflate with flush, flush even if no more input is provided. +- rename libgz.a as libz.a +- avoid complex expression in infcodes.c triggering Turbo C bug +- work around a problem with gcc on Alpha (in INSERT_STRING) +- don't use inline functions (problem with some gcc versions) +- allow renaming of Byte, uInt, etc... with #define. +- avoid warning about (unused) pointer before start of array in deflate.c +- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c +- avoid reserved word 'new' in trees.c + +Changes in 0.93 (25 June 95) +- temporarily disable inline functions +- make deflate deterministic +- give enough lookahead for PARTIAL_FLUSH +- Set binary mode for stdin/stdout in minigzip.c for OS/2 +- don't even use signed char in inflate (not portable enough) +- fix inflate memory leak for segmented architectures + +Changes in 0.92 (3 May 95) +- don't assume that char is signed (problem on SGI) +- Clear bit buffer when starting a stored block +- no memcpy on Pyramid +- suppressed inftest.c +- optimized fill_window, put longest_match inline for gcc +- optimized inflate on stored blocks. +- untabify all sources to simplify patches + +Changes in 0.91 (2 May 95) +- Default MEM_LEVEL is 8 (not 9 for Unix) as documented in zlib.h +- Document the memory requirements in zconf.h +- added "make install" +- fix sync search logic in inflateSync +- deflate(Z_FULL_FLUSH) now works even if output buffer too short +- after inflateSync, don't scare people with just "lo world" +- added support for DJGPP + +Changes in 0.9 (1 May 95) +- don't assume that zalloc clears the allocated memory (the TurboC bug + was Mark's bug after all :) +- let again gzread copy uncompressed data unchanged (was working in 0.71) +- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented +- added a test of inflateSync in example.c +- moved MAX_WBITS to zconf.h because users might want to change that. +- document explicitly that zalloc(64K) on MSDOS must return a normalized + pointer (zero offset) +- added Makefiles for Microsoft C, Turbo C, Borland C++ +- faster crc32() + +Changes in 0.8 (29 April 95) +- added fast inflate (inffast.c) +- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this + is incompatible with previous versions of zlib which returned Z_OK. +- work around a TurboC compiler bug (bad code for b << 0, see infutil.h) + (actually that was not a compiler bug, see 0.81 above) +- gzread no longer reads one extra byte in certain cases +- In gzio destroy(), don't reference a freed structure +- avoid many warnings for MSDOS +- avoid the ERROR symbol which is used by MS Windows + +Changes in 0.71 (14 April 95) +- Fixed more MSDOS compilation problems :( There is still a bug with + TurboC large model. + +Changes in 0.7 (14 April 95) +- Added full inflate support. +- Simplified the crc32() interface. The pre- and post-conditioning + (one's complement) is now done inside crc32(). WARNING: this is + incompatible with previous versions; see zlib.h for the new usage. + +Changes in 0.61 (12 April 95) +- workaround for a bug in TurboC. example and minigzip now work on MSDOS. + +Changes in 0.6 (11 April 95) +- added minigzip.c +- added gzdopen to reopen a file descriptor as gzFile +- added transparent reading of non-gziped files in gzread. +- fixed bug in gzread (don't read crc as data) +- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose). +- don't allocate big arrays in the stack (for MSDOS) +- fix some MSDOS compilation problems + +Changes in 0.5: +- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but + not yet Z_FULL_FLUSH. +- support decompression but only in a single step (forced Z_FINISH) +- added opaque object for zalloc and zfree. +- added deflateReset and inflateReset +- added a variable zlib_version for consistency checking. +- renamed the 'filter' parameter of deflateInit2 as 'strategy'. + Added Z_FILTERED and Z_HUFFMAN_ONLY constants. + +Changes in 0.4: +- avoid "zip" everywhere, use zlib instead of ziplib. +- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush + if compression method == 8. +- added adler32 and crc32 +- renamed deflateOptions as deflateInit2, call one or the other but not both +- added the method parameter for deflateInit2. +- added inflateInit2 +- simplied considerably deflateInit and inflateInit by not supporting + user-provided history buffer. This is supported only in deflateInit2 + and inflateInit2. + +Changes in 0.3: +- prefix all macro names with Z_ +- use Z_FINISH instead of deflateEnd to finish compression. +- added Z_HUFFMAN_ONLY +- added gzerror() diff --git a/externe_kniznice/zlib/FAQ b/externe_kniznice/zlib/FAQ new file mode 100644 index 0000000..99b7cf9 --- /dev/null +++ b/externe_kniznice/zlib/FAQ @@ -0,0 +1,368 @@ + + Frequently Asked Questions about zlib + + +If your question is not there, please check the zlib home page +http://zlib.net/ which may have more recent information. +The lastest zlib FAQ is at http://zlib.net/zlib_faq.html + + + 1. Is zlib Y2K-compliant? + + Yes. zlib doesn't handle dates. + + 2. Where can I get a Windows DLL version? + + The zlib sources can be compiled without change to produce a DLL. See the + file win32/DLL_FAQ.txt in the zlib distribution. Pointers to the + precompiled DLL are found in the zlib web site at http://zlib.net/ . + + 3. Where can I get a Visual Basic interface to zlib? + + See + * http://marknelson.us/1997/01/01/zlib-engine/ + * win32/DLL_FAQ.txt in the zlib distribution + + 4. compress() returns Z_BUF_ERROR. + + Make sure that before the call of compress(), the length of the compressed + buffer is equal to the available size of the compressed buffer and not + zero. For Visual Basic, check that this parameter is passed by reference + ("as any"), not by value ("as long"). + + 5. deflate() or inflate() returns Z_BUF_ERROR. + + Before making the call, make sure that avail_in and avail_out are not zero. + When setting the parameter flush equal to Z_FINISH, also make sure that + avail_out is big enough to allow processing all pending input. Note that a + Z_BUF_ERROR is not fatal--another call to deflate() or inflate() can be + made with more input or output space. A Z_BUF_ERROR may in fact be + unavoidable depending on how the functions are used, since it is not + possible to tell whether or not there is more output pending when + strm.avail_out returns with zero. See http://zlib.net/zlib_how.html for a + heavily annotated example. + + 6. Where's the zlib documentation (man pages, etc.)? + + It's in zlib.h . Examples of zlib usage are in the files test/example.c + and test/minigzip.c, with more in examples/ . + + 7. Why don't you use GNU autoconf or libtool or ...? + + Because we would like to keep zlib as a very small and simple package. + zlib is rather portable and doesn't need much configuration. + + 8. I found a bug in zlib. + + Most of the time, such problems are due to an incorrect usage of zlib. + Please try to reproduce the problem with a small program and send the + corresponding source to us at zlib@gzip.org . Do not send multi-megabyte + data files without prior agreement. + + 9. Why do I get "undefined reference to gzputc"? + + If "make test" produces something like + + example.o(.text+0x154): undefined reference to `gzputc' + + check that you don't have old files libz.* in /usr/lib, /usr/local/lib or + /usr/X11R6/lib. Remove any old versions, then do "make install". + +10. I need a Delphi interface to zlib. + + See the contrib/delphi directory in the zlib distribution. + +11. Can zlib handle .zip archives? + + Not by itself, no. See the directory contrib/minizip in the zlib + distribution. + +12. Can zlib handle .Z files? + + No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt + the code of uncompress on your own. + +13. How can I make a Unix shared library? + + By default a shared (and a static) library is built for Unix. So: + + make distclean + ./configure + make + +14. How do I install a shared zlib library on Unix? + + After the above, then: + + make install + + However, many flavors of Unix come with a shared zlib already installed. + Before going to the trouble of compiling a shared version of zlib and + trying to install it, you may want to check if it's already there! If you + can #include , it's there. The -lz option will probably link to + it. You can check the version at the top of zlib.h or with the + ZLIB_VERSION symbol defined in zlib.h . + +15. I have a question about OttoPDF. + + We are not the authors of OttoPDF. The real author is on the OttoPDF web + site: Joel Hainley, jhainley@myndkryme.com. + +16. Can zlib decode Flate data in an Adobe PDF file? + + Yes. See http://www.pdflib.com/ . To modify PDF forms, see + http://sourceforge.net/projects/acroformtool/ . + +17. Why am I getting this "register_frame_info not found" error on Solaris? + + After installing zlib 1.1.4 on Solaris 2.6, running applications using zlib + generates an error such as: + + ld.so.1: rpm: fatal: relocation error: file /usr/local/lib/libz.so: + symbol __register_frame_info: referenced symbol not found + + The symbol __register_frame_info is not part of zlib, it is generated by + the C compiler (cc or gcc). You must recompile applications using zlib + which have this problem. This problem is specific to Solaris. See + http://www.sunfreeware.com for Solaris versions of zlib and applications + using zlib. + +18. Why does gzip give an error on a file I make with compress/deflate? + + The compress and deflate functions produce data in the zlib format, which + is different and incompatible with the gzip format. The gz* functions in + zlib on the other hand use the gzip format. Both the zlib and gzip formats + use the same compressed data format internally, but have different headers + and trailers around the compressed data. + +19. Ok, so why are there two different formats? + + The gzip format was designed to retain the directory information about a + single file, such as the name and last modification date. The zlib format + on the other hand was designed for in-memory and communication channel + applications, and has a much more compact header and trailer and uses a + faster integrity check than gzip. + +20. Well that's nice, but how do I make a gzip file in memory? + + You can request that deflate write the gzip format instead of the zlib + format using deflateInit2(). You can also request that inflate decode the + gzip format using inflateInit2(). Read zlib.h for more details. + +21. Is zlib thread-safe? + + Yes. However any library routines that zlib uses and any application- + provided memory allocation routines must also be thread-safe. zlib's gz* + functions use stdio library routines, and most of zlib's functions use the + library memory allocation routines by default. zlib's *Init* functions + allow for the application to provide custom memory allocation routines. + + Of course, you should only operate on any given zlib or gzip stream from a + single thread at a time. + +22. Can I use zlib in my commercial application? + + Yes. Please read the license in zlib.h. + +23. Is zlib under the GNU license? + + No. Please read the license in zlib.h. + +24. The license says that altered source versions must be "plainly marked". So + what exactly do I need to do to meet that requirement? + + You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In + particular, the final version number needs to be changed to "f", and an + identification string should be appended to ZLIB_VERSION. Version numbers + x.x.x.f are reserved for modifications to zlib by others than the zlib + maintainers. For example, if the version of the base zlib you are altering + is "1.2.3.4", then in zlib.h you should change ZLIB_VERNUM to 0x123f, and + ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also + update the version strings in deflate.c and inftrees.c. + + For altered source distributions, you should also note the origin and + nature of the changes in zlib.h, as well as in ChangeLog and README, along + with the dates of the alterations. The origin should include at least your + name (or your company's name), and an email address to contact for help or + issues with the library. + + Note that distributing a compiled zlib library along with zlib.h and + zconf.h is also a source distribution, and so you should change + ZLIB_VERSION and ZLIB_VERNUM and note the origin and nature of the changes + in zlib.h as you would for a full source distribution. + +25. Will zlib work on a big-endian or little-endian architecture, and can I + exchange compressed data between them? + + Yes and yes. + +26. Will zlib work on a 64-bit machine? + + Yes. It has been tested on 64-bit machines, and has no dependence on any + data types being limited to 32-bits in length. If you have any + difficulties, please provide a complete problem report to zlib@gzip.org + +27. Will zlib decompress data from the PKWare Data Compression Library? + + No. The PKWare DCL uses a completely different compressed data format than + does PKZIP and zlib. However, you can look in zlib's contrib/blast + directory for a possible solution to your problem. + +28. Can I access data randomly in a compressed stream? + + No, not without some preparation. If when compressing you periodically use + Z_FULL_FLUSH, carefully write all the pending data at those points, and + keep an index of those locations, then you can start decompression at those + points. You have to be careful to not use Z_FULL_FLUSH too often, since it + can significantly degrade compression. Alternatively, you can scan a + deflate stream once to generate an index, and then use that index for + random access. See examples/zran.c . + +29. Does zlib work on MVS, OS/390, CICS, etc.? + + It has in the past, but we have not heard of any recent evidence. There + were working ports of zlib 1.1.4 to MVS, but those links no longer work. + If you know of recent, successful applications of zlib on these operating + systems, please let us know. Thanks. + +30. Is there some simpler, easier to read version of inflate I can look at to + understand the deflate format? + + First off, you should read RFC 1951. Second, yes. Look in zlib's + contrib/puff directory. + +31. Does zlib infringe on any patents? + + As far as we know, no. In fact, that was originally the whole point behind + zlib. Look here for some more information: + + http://www.gzip.org/#faq11 + +32. Can zlib work with greater than 4 GB of data? + + Yes. inflate() and deflate() will process any amount of data correctly. + Each call of inflate() or deflate() is limited to input and output chunks + of the maximum value that can be stored in the compiler's "unsigned int" + type, but there is no limit to the number of chunks. Note however that the + strm.total_in and strm_total_out counters may be limited to 4 GB. These + counters are provided as a convenience and are not used internally by + inflate() or deflate(). The application can easily set up its own counters + updated after each call of inflate() or deflate() to count beyond 4 GB. + compress() and uncompress() may be limited to 4 GB, since they operate in a + single call. gzseek() and gztell() may be limited to 4 GB depending on how + zlib is compiled. See the zlibCompileFlags() function in zlib.h. + + The word "may" appears several times above since there is a 4 GB limit only + if the compiler's "long" type is 32 bits. If the compiler's "long" type is + 64 bits, then the limit is 16 exabytes. + +33. Does zlib have any security vulnerabilities? + + The only one that we are aware of is potentially in gzprintf(). If zlib is + compiled to use sprintf() or vsprintf(), then there is no protection + against a buffer overflow of an 8K string space (or other value as set by + gzbuffer()), other than the caller of gzprintf() assuring that the output + will not exceed 8K. On the other hand, if zlib is compiled to use + snprintf() or vsnprintf(), which should normally be the case, then there is + no vulnerability. The ./configure script will display warnings if an + insecure variation of sprintf() will be used by gzprintf(). Also the + zlibCompileFlags() function will return information on what variant of + sprintf() is used by gzprintf(). + + If you don't have snprintf() or vsnprintf() and would like one, you can + find a portable implementation here: + + http://www.ijs.si/software/snprintf/ + + Note that you should be using the most recent version of zlib. Versions + 1.1.3 and before were subject to a double-free vulnerability, and versions + 1.2.1 and 1.2.2 were subject to an access exception when decompressing + invalid compressed data. + +34. Is there a Java version of zlib? + + Probably what you want is to use zlib in Java. zlib is already included + as part of the Java SDK in the java.util.zip package. If you really want + a version of zlib written in the Java language, look on the zlib home + page for links: http://zlib.net/ . + +35. I get this or that compiler or source-code scanner warning when I crank it + up to maximally-pedantic. Can't you guys write proper code? + + Many years ago, we gave up attempting to avoid warnings on every compiler + in the universe. It just got to be a waste of time, and some compilers + were downright silly as well as contradicted each other. So now, we simply + make sure that the code always works. + +36. Valgrind (or some similar memory access checker) says that deflate is + performing a conditional jump that depends on an uninitialized value. + Isn't that a bug? + + No. That is intentional for performance reasons, and the output of deflate + is not affected. This only started showing up recently since zlib 1.2.x + uses malloc() by default for allocations, whereas earlier versions used + calloc(), which zeros out the allocated memory. Even though the code was + correct, versions 1.2.4 and later was changed to not stimulate these + checkers. + +37. Will zlib read the (insert any ancient or arcane format here) compressed + data format? + + Probably not. Look in the comp.compression FAQ for pointers to various + formats and associated software. + +38. How can I encrypt/decrypt zip files with zlib? + + zlib doesn't support encryption. The original PKZIP encryption is very + weak and can be broken with freely available programs. To get strong + encryption, use GnuPG, http://www.gnupg.org/ , which already includes zlib + compression. For PKZIP compatible "encryption", look at + http://www.info-zip.org/ + +39. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings? + + "gzip" is the gzip format, and "deflate" is the zlib format. They should + probably have called the second one "zlib" instead to avoid confusion with + the raw deflate compressed data format. While the HTTP 1.1 RFC 2616 + correctly points to the zlib specification in RFC 1950 for the "deflate" + transfer encoding, there have been reports of servers and browsers that + incorrectly produce or expect raw deflate data per the deflate + specification in RFC 1951, most notably Microsoft. So even though the + "deflate" transfer encoding using the zlib format would be the more + efficient approach (and in fact exactly what the zlib format was designed + for), using the "gzip" transfer encoding is probably more reliable due to + an unfortunate choice of name on the part of the HTTP 1.1 authors. + + Bottom line: use the gzip format for HTTP 1.1 encoding. + +40. Does zlib support the new "Deflate64" format introduced by PKWare? + + No. PKWare has apparently decided to keep that format proprietary, since + they have not documented it as they have previous compression formats. In + any case, the compression improvements are so modest compared to other more + modern approaches, that it's not worth the effort to implement. + +41. I'm having a problem with the zip functions in zlib, can you help? + + There are no zip functions in zlib. You are probably using minizip by + Giles Vollant, which is found in the contrib directory of zlib. It is not + part of zlib. In fact none of the stuff in contrib is part of zlib. The + files in there are not supported by the zlib authors. You need to contact + the authors of the respective contribution for help. + +42. The match.asm code in contrib is under the GNU General Public License. + Since it's part of zlib, doesn't that mean that all of zlib falls under the + GNU GPL? + + No. The files in contrib are not part of zlib. They were contributed by + other authors and are provided as a convenience to the user within the zlib + distribution. Each item in contrib has its own license. + +43. Is zlib subject to export controls? What is its ECCN? + + zlib is not subject to export controls, and so is classified as EAR99. + +44. Can you please sign these lengthy legal documents and fax them back to us + so that we can use your software in our product? + + No. Go away. Shoo. diff --git a/externe_kniznice/zlib/INDEX b/externe_kniznice/zlib/INDEX new file mode 100644 index 0000000..2ba0641 --- /dev/null +++ b/externe_kniznice/zlib/INDEX @@ -0,0 +1,68 @@ +CMakeLists.txt cmake build file +ChangeLog history of changes +FAQ Frequently Asked Questions about zlib +INDEX this file +Makefile dummy Makefile that tells you to ./configure +Makefile.in template for Unix Makefile +README guess what +configure configure script for Unix +make_vms.com makefile for VMS +test/example.c zlib usages examples for build testing +test/minigzip.c minimal gzip-like functionality for build testing +test/infcover.c inf*.c code coverage for build coverage testing +treebuild.xml XML description of source file dependencies +zconf.h.cmakein zconf.h template for cmake +zconf.h.in zconf.h template for configure +zlib.3 Man page for zlib +zlib.3.pdf Man page in PDF format +zlib.map Linux symbol information +zlib.pc.in Template for pkg-config descriptor +zlib.pc.cmakein zlib.pc template for cmake +zlib2ansi perl script to convert source files for C++ compilation + +amiga/ makefiles for Amiga SAS C +as400/ makefiles for AS/400 +doc/ documentation for formats and algorithms +msdos/ makefiles for MSDOS +nintendods/ makefile for Nintendo DS +old/ makefiles for various architectures and zlib documentation + files that have not yet been updated for zlib 1.2.x +qnx/ makefiles for QNX +watcom/ makefiles for OpenWatcom +win32/ makefiles for Windows + + zlib public header files (required for library use): +zconf.h +zlib.h + + private source files used to build the zlib library: +adler32.c +compress.c +crc32.c +crc32.h +deflate.c +deflate.h +gzclose.c +gzguts.h +gzlib.c +gzread.c +gzwrite.c +infback.c +inffast.c +inffast.h +inffixed.h +inflate.c +inflate.h +inftrees.c +inftrees.h +trees.c +trees.h +uncompr.c +zutil.c +zutil.h + + source files for sample programs +See examples/README.examples + + unsupported contributions by third parties +See contrib/README.contrib diff --git a/externe_kniznice/zlib/Makefile b/externe_kniznice/zlib/Makefile new file mode 100644 index 0000000..6bba86c --- /dev/null +++ b/externe_kniznice/zlib/Makefile @@ -0,0 +1,5 @@ +all: + -@echo "Please use ./configure first. Thank you." + +distclean: + make -f Makefile.in distclean diff --git a/externe_kniznice/zlib/Makefile.in b/externe_kniznice/zlib/Makefile.in new file mode 100644 index 0000000..5a77949 --- /dev/null +++ b/externe_kniznice/zlib/Makefile.in @@ -0,0 +1,410 @@ +# Makefile for zlib +# Copyright (C) 1995-2017 Jean-loup Gailly, Mark Adler +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile and test, type: +# ./configure; make test +# Normally configure builds both a static and a shared library. +# If you want to build just a static library, use: ./configure --static + +# To use the asm code, type: +# cp contrib/asm?86/match.S ./match.S +# make LOC=-DASMV OBJA=match.o + +# To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type: +# make install +# To install in $HOME instead of /usr/local, use: +# make install prefix=$HOME + +CC=cc + +CFLAGS=-O +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-g -DZLIB_DEBUG +#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ +# -Wstrict-prototypes -Wmissing-prototypes + +SFLAGS=-O +LDFLAGS= +TEST_LDFLAGS=-L. libz.a +LDSHARED=$(CC) +CPP=$(CC) -E + +STATICLIB=libz.a +SHAREDLIB=libz.so +SHAREDLIBV=libz.so.1.2.11 +SHAREDLIBM=libz.so.1 +LIBS=$(STATICLIB) $(SHAREDLIBV) + +AR=ar +ARFLAGS=rc +RANLIB=ranlib +LDCONFIG=ldconfig +LDSHAREDLIBC=-lc +TAR=tar +SHELL=/bin/sh +EXE= + +prefix = /usr/local +exec_prefix = ${prefix} +libdir = ${exec_prefix}/lib +sharedlibdir = ${libdir} +includedir = ${prefix}/include +mandir = ${prefix}/share/man +man3dir = ${mandir}/man3 +pkgconfigdir = ${libdir}/pkgconfig +SRCDIR= +ZINC= +ZINCOUT=-I. + +OBJZ = adler32.o crc32.o deflate.o infback.o inffast.o inflate.o inftrees.o trees.o zutil.o +OBJG = compress.o uncompr.o gzclose.o gzlib.o gzread.o gzwrite.o +OBJC = $(OBJZ) $(OBJG) + +PIC_OBJZ = adler32.lo crc32.lo deflate.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo zutil.lo +PIC_OBJG = compress.lo uncompr.lo gzclose.lo gzlib.lo gzread.lo gzwrite.lo +PIC_OBJC = $(PIC_OBJZ) $(PIC_OBJG) + +# to use the asm code: make OBJA=match.o, PIC_OBJA=match.lo +OBJA = +PIC_OBJA = + +OBJS = $(OBJC) $(OBJA) + +PIC_OBJS = $(PIC_OBJC) $(PIC_OBJA) + +all: static shared + +static: example$(EXE) minigzip$(EXE) + +shared: examplesh$(EXE) minigzipsh$(EXE) + +all64: example64$(EXE) minigzip64$(EXE) + +check: test + +test: all teststatic testshared + +teststatic: static + @TMPST=tmpst_$$; \ + if echo hello world | ./minigzip | ./minigzip -d && ./example $$TMPST ; then \ + echo ' *** zlib test OK ***'; \ + else \ + echo ' *** zlib test FAILED ***'; false; \ + fi; \ + rm -f $$TMPST + +testshared: shared + @LD_LIBRARY_PATH=`pwd`:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ + LD_LIBRARYN32_PATH=`pwd`:$(LD_LIBRARYN32_PATH) ; export LD_LIBRARYN32_PATH; \ + DYLD_LIBRARY_PATH=`pwd`:$(DYLD_LIBRARY_PATH) ; export DYLD_LIBRARY_PATH; \ + SHLIB_PATH=`pwd`:$(SHLIB_PATH) ; export SHLIB_PATH; \ + TMPSH=tmpsh_$$; \ + if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh $$TMPSH; then \ + echo ' *** zlib shared test OK ***'; \ + else \ + echo ' *** zlib shared test FAILED ***'; false; \ + fi; \ + rm -f $$TMPSH + +test64: all64 + @TMP64=tmp64_$$; \ + if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64 $$TMP64; then \ + echo ' *** zlib 64-bit test OK ***'; \ + else \ + echo ' *** zlib 64-bit test FAILED ***'; false; \ + fi; \ + rm -f $$TMP64 + +infcover.o: $(SRCDIR)test/infcover.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/infcover.c + +infcover: infcover.o libz.a + $(CC) $(CFLAGS) -o $@ infcover.o libz.a + +cover: infcover + rm -f *.gcda + ./infcover + gcov inf*.c + +libz.a: $(OBJS) + $(AR) $(ARFLAGS) $@ $(OBJS) + -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 + +match.o: match.S + $(CPP) match.S > _match.s + $(CC) -c _match.s + mv _match.o match.o + rm -f _match.s + +match.lo: match.S + $(CPP) match.S > _match.s + $(CC) -c -fPIC _match.s + mv _match.o match.lo + rm -f _match.s + +example.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/example.c + +minigzip.o: $(SRCDIR)test/minigzip.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/minigzip.c + +example64.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/example.c + +minigzip64.o: $(SRCDIR)test/minigzip.c $(SRCDIR)zlib.h zconf.h + $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/minigzip.c + + +adler32.o: $(SRCDIR)adler32.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)adler32.c + +crc32.o: $(SRCDIR)crc32.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)crc32.c + +deflate.o: $(SRCDIR)deflate.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)deflate.c + +infback.o: $(SRCDIR)infback.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)infback.c + +inffast.o: $(SRCDIR)inffast.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)inffast.c + +inflate.o: $(SRCDIR)inflate.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)inflate.c + +inftrees.o: $(SRCDIR)inftrees.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)inftrees.c + +trees.o: $(SRCDIR)trees.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)trees.c + +zutil.o: $(SRCDIR)zutil.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)zutil.c + +compress.o: $(SRCDIR)compress.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)compress.c + +uncompr.o: $(SRCDIR)uncompr.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)uncompr.c + +gzclose.o: $(SRCDIR)gzclose.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzclose.c + +gzlib.o: $(SRCDIR)gzlib.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzlib.c + +gzread.o: $(SRCDIR)gzread.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzread.c + +gzwrite.o: $(SRCDIR)gzwrite.c + $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzwrite.c + + +adler32.lo: $(SRCDIR)adler32.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/adler32.o $(SRCDIR)adler32.c + -@mv objs/adler32.o $@ + +crc32.lo: $(SRCDIR)crc32.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/crc32.o $(SRCDIR)crc32.c + -@mv objs/crc32.o $@ + +deflate.lo: $(SRCDIR)deflate.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/deflate.o $(SRCDIR)deflate.c + -@mv objs/deflate.o $@ + +infback.lo: $(SRCDIR)infback.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/infback.o $(SRCDIR)infback.c + -@mv objs/infback.o $@ + +inffast.lo: $(SRCDIR)inffast.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/inffast.o $(SRCDIR)inffast.c + -@mv objs/inffast.o $@ + +inflate.lo: $(SRCDIR)inflate.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/inflate.o $(SRCDIR)inflate.c + -@mv objs/inflate.o $@ + +inftrees.lo: $(SRCDIR)inftrees.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/inftrees.o $(SRCDIR)inftrees.c + -@mv objs/inftrees.o $@ + +trees.lo: $(SRCDIR)trees.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/trees.o $(SRCDIR)trees.c + -@mv objs/trees.o $@ + +zutil.lo: $(SRCDIR)zutil.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/zutil.o $(SRCDIR)zutil.c + -@mv objs/zutil.o $@ + +compress.lo: $(SRCDIR)compress.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/compress.o $(SRCDIR)compress.c + -@mv objs/compress.o $@ + +uncompr.lo: $(SRCDIR)uncompr.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/uncompr.o $(SRCDIR)uncompr.c + -@mv objs/uncompr.o $@ + +gzclose.lo: $(SRCDIR)gzclose.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzclose.o $(SRCDIR)gzclose.c + -@mv objs/gzclose.o $@ + +gzlib.lo: $(SRCDIR)gzlib.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzlib.o $(SRCDIR)gzlib.c + -@mv objs/gzlib.o $@ + +gzread.lo: $(SRCDIR)gzread.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzread.o $(SRCDIR)gzread.c + -@mv objs/gzread.o $@ + +gzwrite.lo: $(SRCDIR)gzwrite.c + -@mkdir objs 2>/dev/null || test -d objs + $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzwrite.o $(SRCDIR)gzwrite.c + -@mv objs/gzwrite.o $@ + + +placebo $(SHAREDLIBV): $(PIC_OBJS) libz.a + $(LDSHARED) $(SFLAGS) -o $@ $(PIC_OBJS) $(LDSHAREDLIBC) $(LDFLAGS) + rm -f $(SHAREDLIB) $(SHAREDLIBM) + ln -s $@ $(SHAREDLIB) + ln -s $@ $(SHAREDLIBM) + -@rmdir objs + +example$(EXE): example.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ example.o $(TEST_LDFLAGS) + +minigzip$(EXE): minigzip.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ minigzip.o $(TEST_LDFLAGS) + +examplesh$(EXE): example.o $(SHAREDLIBV) + $(CC) $(CFLAGS) -o $@ example.o -L. $(SHAREDLIBV) + +minigzipsh$(EXE): minigzip.o $(SHAREDLIBV) + $(CC) $(CFLAGS) -o $@ minigzip.o -L. $(SHAREDLIBV) + +example64$(EXE): example64.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ example64.o $(TEST_LDFLAGS) + +minigzip64$(EXE): minigzip64.o $(STATICLIB) + $(CC) $(CFLAGS) -o $@ minigzip64.o $(TEST_LDFLAGS) + +install-libs: $(LIBS) + -@if [ ! -d $(DESTDIR)$(exec_prefix) ]; then mkdir -p $(DESTDIR)$(exec_prefix); fi + -@if [ ! -d $(DESTDIR)$(libdir) ]; then mkdir -p $(DESTDIR)$(libdir); fi + -@if [ ! -d $(DESTDIR)$(sharedlibdir) ]; then mkdir -p $(DESTDIR)$(sharedlibdir); fi + -@if [ ! -d $(DESTDIR)$(man3dir) ]; then mkdir -p $(DESTDIR)$(man3dir); fi + -@if [ ! -d $(DESTDIR)$(pkgconfigdir) ]; then mkdir -p $(DESTDIR)$(pkgconfigdir); fi + rm -f $(DESTDIR)$(libdir)/$(STATICLIB) + cp $(STATICLIB) $(DESTDIR)$(libdir) + chmod 644 $(DESTDIR)$(libdir)/$(STATICLIB) + -@($(RANLIB) $(DESTDIR)$(libdir)/libz.a || true) >/dev/null 2>&1 + -@if test -n "$(SHAREDLIBV)"; then \ + rm -f $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV); \ + cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir); \ + echo "cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)"; \ + chmod 755 $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV); \ + echo "chmod 755 $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV)"; \ + rm -f $(DESTDIR)$(sharedlibdir)/$(SHAREDLIB) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBM); \ + ln -s $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIB); \ + ln -s $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBM); \ + ($(LDCONFIG) || true) >/dev/null 2>&1; \ + fi + rm -f $(DESTDIR)$(man3dir)/zlib.3 + cp $(SRCDIR)zlib.3 $(DESTDIR)$(man3dir) + chmod 644 $(DESTDIR)$(man3dir)/zlib.3 + rm -f $(DESTDIR)$(pkgconfigdir)/zlib.pc + cp zlib.pc $(DESTDIR)$(pkgconfigdir) + chmod 644 $(DESTDIR)$(pkgconfigdir)/zlib.pc +# The ranlib in install is needed on NeXTSTEP which checks file times +# ldconfig is for Linux + +install: install-libs + -@if [ ! -d $(DESTDIR)$(includedir) ]; then mkdir -p $(DESTDIR)$(includedir); fi + rm -f $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h + cp $(SRCDIR)zlib.h zconf.h $(DESTDIR)$(includedir) + chmod 644 $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h + +uninstall: + cd $(DESTDIR)$(includedir) && rm -f zlib.h zconf.h + cd $(DESTDIR)$(libdir) && rm -f libz.a; \ + if test -n "$(SHAREDLIBV)" -a -f $(SHAREDLIBV); then \ + rm -f $(SHAREDLIBV) $(SHAREDLIB) $(SHAREDLIBM); \ + fi + cd $(DESTDIR)$(man3dir) && rm -f zlib.3 + cd $(DESTDIR)$(pkgconfigdir) && rm -f zlib.pc + +docs: zlib.3.pdf + +zlib.3.pdf: $(SRCDIR)zlib.3 + groff -mandoc -f H -T ps $(SRCDIR)zlib.3 | ps2pdf - $@ + +zconf.h.cmakein: $(SRCDIR)zconf.h.in + -@ TEMPFILE=zconfh_$$; \ + echo "/#define ZCONF_H/ a\\\\\n#cmakedefine Z_PREFIX\\\\\n#cmakedefine Z_HAVE_UNISTD_H\n" >> $$TEMPFILE &&\ + sed -f $$TEMPFILE $(SRCDIR)zconf.h.in > $@ &&\ + touch -r $(SRCDIR)zconf.h.in $@ &&\ + rm $$TEMPFILE + +zconf: $(SRCDIR)zconf.h.in + cp -p $(SRCDIR)zconf.h.in zconf.h + +mostlyclean: clean +clean: + rm -f *.o *.lo *~ \ + example$(EXE) minigzip$(EXE) examplesh$(EXE) minigzipsh$(EXE) \ + example64$(EXE) minigzip64$(EXE) \ + infcover \ + libz.* foo.gz so_locations \ + _match.s maketree contrib/infback9/*.o + rm -rf objs + rm -f *.gcda *.gcno *.gcov + rm -f contrib/infback9/*.gcda contrib/infback9/*.gcno contrib/infback9/*.gcov + +maintainer-clean: distclean +distclean: clean zconf zconf.h.cmakein docs + rm -f Makefile zlib.pc configure.log + -@rm -f .DS_Store + @if [ -f Makefile.in ]; then \ + printf 'all:\n\t-@echo "Please use ./configure first. Thank you."\n' > Makefile ; \ + printf '\ndistclean:\n\tmake -f Makefile.in distclean\n' >> Makefile ; \ + touch -r $(SRCDIR)Makefile.in Makefile ; fi + @if [ ! -f zconf.h.in ]; then rm -f zconf.h zconf.h.cmakein ; fi + @if [ ! -f zlib.3 ]; then rm -f zlib.3.pdf ; fi + +tags: + etags $(SRCDIR)*.[ch] + +adler32.o zutil.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h +gzclose.o gzlib.o gzread.o gzwrite.o: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h +compress.o example.o minigzip.o uncompr.o: $(SRCDIR)zlib.h zconf.h +crc32.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h +deflate.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h +infback.o inflate.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h $(SRCDIR)inffixed.h +inffast.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h +inftrees.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h +trees.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)trees.h + +adler32.lo zutil.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h +gzclose.lo gzlib.lo gzread.lo gzwrite.lo: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h +compress.lo example.lo minigzip.lo uncompr.lo: $(SRCDIR)zlib.h zconf.h +crc32.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h +deflate.lo: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h +infback.lo inflate.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h $(SRCDIR)inffixed.h +inffast.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h +inftrees.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h +trees.lo: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)trees.h diff --git a/externe_kniznice/zlib/README b/externe_kniznice/zlib/README new file mode 100644 index 0000000..51106de --- /dev/null +++ b/externe_kniznice/zlib/README @@ -0,0 +1,115 @@ +ZLIB DATA COMPRESSION LIBRARY + +zlib 1.2.11 is a general purpose data compression library. All the code is +thread safe. The data format used by the zlib library is described by RFCs +(Request for Comments) 1950 to 1952 in the files +http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and +rfc1952 (gzip format). + +All functions of the compression library are documented in the file zlib.h +(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example +of the library is given in the file test/example.c which also tests that +the library is working correctly. Another example is given in the file +test/minigzip.c. The compression library itself is composed of all source +files in the root directory. + +To compile all files and run the test program, follow the instructions given at +the top of Makefile.in. In short "./configure; make test", and if that goes +well, "make install" should work for most flavors of Unix. For Windows, use +one of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use +make_vms.com. + +Questions about zlib should be sent to , or to Gilles Vollant + for the Windows DLL version. The zlib home page is +http://zlib.net/ . Before reporting a problem, please check this site to +verify that you have the latest version of zlib; otherwise get the latest +version and check whether the problem still exists or not. + +PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help. + +Mark Nelson wrote an article about zlib for the Jan. 1997 +issue of Dr. Dobb's Journal; a copy of the article is available at +http://marknelson.us/1997/01/01/zlib-engine/ . + +The changes made in version 1.2.11 are documented in the file ChangeLog. + +Unsupported third party contributions are provided in directory contrib/ . + +zlib is available in Java using the java.util.zip package, documented at +http://java.sun.com/developer/technicalArticles/Programming/compression/ . + +A Perl interface to zlib written by Paul Marquess is available +at CPAN (Comprehensive Perl Archive Network) sites, including +http://search.cpan.org/~pmqs/IO-Compress-Zlib/ . + +A Python interface to zlib written by A.M. Kuchling is +available in Python 1.5 and later versions, see +http://docs.python.org/library/zlib.html . + +zlib is built into tcl: http://wiki.tcl.tk/4610 . + +An experimental package to read and write files in .zip format, written on top +of zlib by Gilles Vollant , is available in the +contrib/minizip directory of zlib. + + +Notes for some targets: + +- For Windows DLL versions, please see win32/DLL_FAQ.txt + +- For 64-bit Irix, deflate.c must be compiled without any optimization. With + -O, one libpng test fails. The test works in 32 bit mode (with the -n32 + compiler flag). The compiler bug has been reported to SGI. + +- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works + when compiled with cc. + +- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is + necessary to get gzprintf working correctly. This is done by configure. + +- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with + other compilers. Use "make test" to check your compiler. + +- gzdopen is not supported on RISCOS or BEOS. + +- For PalmOs, see http://palmzlib.sourceforge.net/ + + +Acknowledgments: + + The deflate format used by zlib was defined by Phil Katz. The deflate and + zlib specifications were written by L. Peter Deutsch. Thanks to all the + people who reported problems and suggested various improvements in zlib; they + are too numerous to cite here. + +Copyright notice: + + (C) 1995-2017 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +If you use the zlib library in a product, we would appreciate *not* receiving +lengthy legal documents to sign. The sources are provided for free but without +warranty of any kind. The library has been entirely written by Jean-loup +Gailly and Mark Adler; it does not include third-party code. + +If you redistribute modified sources, we would appreciate that you include in +the file ChangeLog history information documenting your changes. Please read +the FAQ for more information on the distribution of modified source versions. diff --git a/externe_kniznice/zlib/adler32.c b/externe_kniznice/zlib/adler32.c new file mode 100644 index 0000000..d0be438 --- /dev/null +++ b/externe_kniznice/zlib/adler32.c @@ -0,0 +1,186 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2011, 2016 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" + +local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); + +#define BASE 65521U /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +/* use NO_DIVIDE if your processor does not do division in hardware -- + try it both ways to see which is faster */ +#ifdef NO_DIVIDE +/* note that this assumes BASE is 65521, where 65536 % 65521 == 15 + (thank you to John Reiser for pointing this out) */ +# define CHOP(a) \ + do { \ + unsigned long tmp = a >> 16; \ + a &= 0xffffUL; \ + a += (tmp << 4) - tmp; \ + } while (0) +# define MOD28(a) \ + do { \ + CHOP(a); \ + if (a >= BASE) a -= BASE; \ + } while (0) +# define MOD(a) \ + do { \ + CHOP(a); \ + MOD28(a); \ + } while (0) +# define MOD63(a) \ + do { /* this assumes a is not negative */ \ + z_off64_t tmp = a >> 32; \ + a &= 0xffffffffL; \ + a += (tmp << 8) - (tmp << 5) + tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + if (a >= BASE) a -= BASE; \ + } while (0) +#else +# define MOD(a) a %= BASE +# define MOD28(a) a %= BASE +# define MOD63(a) a %= BASE +#endif + +/* ========================================================================= */ +uLong ZEXPORT adler32_z(adler, buf, len) + uLong adler; + const Bytef *buf; + z_size_t len; +{ + unsigned long sum2; + unsigned n; + + /* split Adler-32 into component sums */ + sum2 = (adler >> 16) & 0xffff; + adler &= 0xffff; + + /* in case user likes doing a byte at a time, keep it fast */ + if (len == 1) { + adler += buf[0]; + if (adler >= BASE) + adler -= BASE; + sum2 += adler; + if (sum2 >= BASE) + sum2 -= BASE; + return adler | (sum2 << 16); + } + + /* initial Adler-32 value (deferred check for len == 1 speed) */ + if (buf == Z_NULL) + return 1L; + + /* in case short lengths are provided, keep it somewhat fast */ + if (len < 16) { + while (len--) { + adler += *buf++; + sum2 += adler; + } + if (adler >= BASE) + adler -= BASE; + MOD28(sum2); /* only added so many BASE's */ + return adler | (sum2 << 16); + } + + /* do length NMAX blocks -- requires just one modulo operation */ + while (len >= NMAX) { + len -= NMAX; + n = NMAX / 16; /* NMAX is divisible by 16 */ + do { + DO16(buf); /* 16 sums unrolled */ + buf += 16; + } while (--n); + MOD(adler); + MOD(sum2); + } + + /* do remaining bytes (less than NMAX, still just one modulo) */ + if (len) { /* avoid modulos if none remaining */ + while (len >= 16) { + len -= 16; + DO16(buf); + buf += 16; + } + while (len--) { + adler += *buf++; + sum2 += adler; + } + MOD(adler); + MOD(sum2); + } + + /* return recombined sums */ + return adler | (sum2 << 16); +} + +/* ========================================================================= */ +uLong ZEXPORT adler32(adler, buf, len) + uLong adler; + const Bytef *buf; + uInt len; +{ + return adler32_z(adler, buf, len); +} + +/* ========================================================================= */ +local uLong adler32_combine_(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off64_t len2; +{ + unsigned long sum1; + unsigned long sum2; + unsigned rem; + + /* for negative len, return invalid adler32 as a clue for debugging */ + if (len2 < 0) + return 0xffffffffUL; + + /* the derivation of this formula is left as an exercise for the reader */ + MOD63(len2); /* assumes len2 >= 0 */ + rem = (unsigned)len2; + sum1 = adler1 & 0xffff; + sum2 = rem * sum1; + MOD(sum2); + sum1 += (adler2 & 0xffff) + BASE - 1; + sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; + if (sum1 >= BASE) sum1 -= BASE; + if (sum1 >= BASE) sum1 -= BASE; + if (sum2 >= ((unsigned long)BASE << 1)) sum2 -= ((unsigned long)BASE << 1); + if (sum2 >= BASE) sum2 -= BASE; + return sum1 | (sum2 << 16); +} + +/* ========================================================================= */ +uLong ZEXPORT adler32_combine(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off_t len2; +{ + return adler32_combine_(adler1, adler2, len2); +} + +uLong ZEXPORT adler32_combine64(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off64_t len2; +{ + return adler32_combine_(adler1, adler2, len2); +} diff --git a/externe_kniznice/zlib/amiga/Makefile.pup b/externe_kniznice/zlib/amiga/Makefile.pup new file mode 100644 index 0000000..8940c12 --- /dev/null +++ b/externe_kniznice/zlib/amiga/Makefile.pup @@ -0,0 +1,69 @@ +# Amiga powerUP (TM) Makefile +# makefile for libpng and SAS C V6.58/7.00 PPC compiler +# Copyright (C) 1998 by Andreas R. Kleinert + +LIBNAME = libzip.a + +CC = scppc +CFLAGS = NOSTKCHK NOSINT OPTIMIZE OPTGO OPTPEEP OPTINLOCAL OPTINL \ + OPTLOOP OPTRDEP=8 OPTDEP=8 OPTCOMP=8 NOVER +AR = ppc-amigaos-ar cr +RANLIB = ppc-amigaos-ranlib +LD = ppc-amigaos-ld -r +LDFLAGS = -o +LDLIBS = LIB:scppc.a LIB:end.o +RM = delete quiet + +OBJS = adler32.o compress.o crc32.o gzclose.o gzlib.o gzread.o gzwrite.o \ + uncompr.o deflate.o trees.o zutil.o inflate.o infback.o inftrees.o inffast.o + +TEST_OBJS = example.o minigzip.o + +all: example minigzip + +check: test +test: all + example + echo hello world | minigzip | minigzip -d + +$(LIBNAME): $(OBJS) + $(AR) $@ $(OBJS) + -$(RANLIB) $@ + +example: example.o $(LIBNAME) + $(LD) $(LDFLAGS) $@ LIB:c_ppc.o $@.o $(LIBNAME) $(LDLIBS) + +minigzip: minigzip.o $(LIBNAME) + $(LD) $(LDFLAGS) $@ LIB:c_ppc.o $@.o $(LIBNAME) $(LDLIBS) + +mostlyclean: clean +clean: + $(RM) *.o example minigzip $(LIBNAME) foo.gz + +zip: + zip -ul9 zlib README ChangeLog Makefile Make????.??? Makefile.?? \ + descrip.mms *.[ch] + +tgz: + cd ..; tar cfz zlib/zlib.tgz zlib/README zlib/ChangeLog zlib/Makefile \ + zlib/Make????.??? zlib/Makefile.?? zlib/descrip.mms zlib/*.[ch] + +# DO NOT DELETE THIS LINE -- make depend depends on it. + +adler32.o: zlib.h zconf.h +compress.o: zlib.h zconf.h +crc32.o: crc32.h zlib.h zconf.h +deflate.o: deflate.h zutil.h zlib.h zconf.h +example.o: zlib.h zconf.h +gzclose.o: zlib.h zconf.h gzguts.h +gzlib.o: zlib.h zconf.h gzguts.h +gzread.o: zlib.h zconf.h gzguts.h +gzwrite.o: zlib.h zconf.h gzguts.h +inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +inftrees.o: zutil.h zlib.h zconf.h inftrees.h +minigzip.o: zlib.h zconf.h +trees.o: deflate.h zutil.h zlib.h zconf.h trees.h +uncompr.o: zlib.h zconf.h +zutil.o: zutil.h zlib.h zconf.h diff --git a/externe_kniznice/zlib/amiga/Makefile.sas b/externe_kniznice/zlib/amiga/Makefile.sas new file mode 100644 index 0000000..749e291 --- /dev/null +++ b/externe_kniznice/zlib/amiga/Makefile.sas @@ -0,0 +1,68 @@ +# SMakefile for zlib +# Modified from the standard UNIX Makefile Copyright Jean-loup Gailly +# Osma Ahvenlampi +# Amiga, SAS/C 6.56 & Smake + +CC=sc +CFLAGS=OPT +#CFLAGS=OPT CPU=68030 +#CFLAGS=DEBUG=LINE +LDFLAGS=LIB z.lib + +SCOPTIONS=OPTSCHED OPTINLINE OPTALIAS OPTTIME OPTINLOCAL STRMERGE \ + NOICONS PARMS=BOTH NOSTACKCHECK UTILLIB NOVERSION ERRORREXX \ + DEF=POSTINC + +OBJS = adler32.o compress.o crc32.o gzclose.o gzlib.o gzread.o gzwrite.o \ + uncompr.o deflate.o trees.o zutil.o inflate.o infback.o inftrees.o inffast.o + +TEST_OBJS = example.o minigzip.o + +all: SCOPTIONS example minigzip + +check: test +test: all + example + echo hello world | minigzip | minigzip -d + +install: z.lib + copy clone zlib.h zconf.h INCLUDE: + copy clone z.lib LIB: + +z.lib: $(OBJS) + oml z.lib r $(OBJS) + +example: example.o z.lib + $(CC) $(CFLAGS) LINK TO $@ example.o $(LDFLAGS) + +minigzip: minigzip.o z.lib + $(CC) $(CFLAGS) LINK TO $@ minigzip.o $(LDFLAGS) + +mostlyclean: clean +clean: + -delete force quiet example minigzip *.o z.lib foo.gz *.lnk SCOPTIONS + +SCOPTIONS: Makefile.sas + copy to $@ (uLong)max ? max : (uInt)left; + left -= stream.avail_out; + } + if (stream.avail_in == 0) { + stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen; + sourceLen -= stream.avail_in; + } + err = deflate(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH); + } while (err == Z_OK); + + *destLen = stream.total_out; + deflateEnd(&stream); + return err == Z_STREAM_END ? Z_OK : err; +} + +/* =========================================================================== + */ +int ZEXPORT compress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); +} + +/* =========================================================================== + If the default memLevel or windowBits for deflateInit() is changed, then + this function needs to be updated. + */ +uLong ZEXPORT compressBound (sourceLen) + uLong sourceLen; +{ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13; +} diff --git a/externe_kniznice/zlib/configure b/externe_kniznice/zlib/configure new file mode 100644 index 0000000..e974d1f --- /dev/null +++ b/externe_kniznice/zlib/configure @@ -0,0 +1,921 @@ +#!/bin/sh +# configure script for zlib. +# +# Normally configure builds both a static and a shared library. +# If you want to build just a static library, use: ./configure --static +# +# To impose specific compiler or flags or install directory, use for example: +# prefix=$HOME CC=cc CFLAGS="-O4" ./configure +# or for csh/tcsh users: +# (setenv prefix $HOME; setenv CC cc; setenv CFLAGS "-O4"; ./configure) + +# Incorrect settings of CC or CFLAGS may prevent creating a shared library. +# If you have problems, try without defining CC and CFLAGS before reporting +# an error. + +# start off configure.log +echo -------------------- >> configure.log +echo $0 $* >> configure.log +date >> configure.log + +# get source directory +SRCDIR=`dirname $0` +if test $SRCDIR = "."; then + ZINC="" + ZINCOUT="-I." + SRCDIR="" +else + ZINC='-include zconf.h' + ZINCOUT='-I. -I$(SRCDIR)' + SRCDIR="$SRCDIR/" +fi + +# set command prefix for cross-compilation +if [ -n "${CHOST}" ]; then + uname="`echo "${CHOST}" | sed -e 's/^[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)-.*$/\1/'`" + CROSS_PREFIX="${CHOST}-" +fi + +# destination name for static library +STATICLIB=libz.a + +# extract zlib version numbers from zlib.h +VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < ${SRCDIR}zlib.h` +VER3=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\\.[0-9]*\).*/\1/p' < ${SRCDIR}zlib.h` +VER2=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\)\\..*/\1/p' < ${SRCDIR}zlib.h` +VER1=`sed -n -e '/VERSION "/s/.*"\([0-9]*\)\\..*/\1/p' < ${SRCDIR}zlib.h` + +# establish commands for library building +if "${CROSS_PREFIX}ar" --version >/dev/null 2>/dev/null || test $? -lt 126; then + AR=${AR-"${CROSS_PREFIX}ar"} + test -n "${CROSS_PREFIX}" && echo Using ${AR} | tee -a configure.log +else + AR=${AR-"ar"} + test -n "${CROSS_PREFIX}" && echo Using ${AR} | tee -a configure.log +fi +ARFLAGS=${ARFLAGS-"rc"} +if "${CROSS_PREFIX}ranlib" --version >/dev/null 2>/dev/null || test $? -lt 126; then + RANLIB=${RANLIB-"${CROSS_PREFIX}ranlib"} + test -n "${CROSS_PREFIX}" && echo Using ${RANLIB} | tee -a configure.log +else + RANLIB=${RANLIB-"ranlib"} +fi +if "${CROSS_PREFIX}nm" --version >/dev/null 2>/dev/null || test $? -lt 126; then + NM=${NM-"${CROSS_PREFIX}nm"} + test -n "${CROSS_PREFIX}" && echo Using ${NM} | tee -a configure.log +else + NM=${NM-"nm"} +fi + +# set defaults before processing command line options +LDCONFIG=${LDCONFIG-"ldconfig"} +LDSHAREDLIBC="${LDSHAREDLIBC--lc}" +ARCHS= +prefix=${prefix-/usr/local} +exec_prefix=${exec_prefix-'${prefix}'} +libdir=${libdir-'${exec_prefix}/lib'} +sharedlibdir=${sharedlibdir-'${libdir}'} +includedir=${includedir-'${prefix}/include'} +mandir=${mandir-'${prefix}/share/man'} +shared_ext='.so' +shared=1 +solo=0 +cover=0 +zprefix=0 +zconst=0 +build64=0 +gcc=0 +warn=0 +debug=0 +old_cc="$CC" +old_cflags="$CFLAGS" +OBJC='$(OBJZ) $(OBJG)' +PIC_OBJC='$(PIC_OBJZ) $(PIC_OBJG)' + +# leave this script, optionally in a bad way +leave() +{ + if test "$*" != "0"; then + echo "** $0 aborting." | tee -a configure.log + fi + rm -f $test.[co] $test $test$shared_ext $test.gcno ./--version + echo -------------------- >> configure.log + echo >> configure.log + echo >> configure.log + exit $1 +} + +# process command line options +while test $# -ge 1 +do +case "$1" in + -h* | --help) + echo 'usage:' | tee -a configure.log + echo ' configure [--const] [--zprefix] [--prefix=PREFIX] [--eprefix=EXPREFIX]' | tee -a configure.log + echo ' [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]' | tee -a configure.log + echo ' [--includedir=INCLUDEDIR] [--archs="-arch i386 -arch x86_64"]' | tee -a configure.log + exit 0 ;; + -p*=* | --prefix=*) prefix=`echo $1 | sed 's/.*=//'`; shift ;; + -e*=* | --eprefix=*) exec_prefix=`echo $1 | sed 's/.*=//'`; shift ;; + -l*=* | --libdir=*) libdir=`echo $1 | sed 's/.*=//'`; shift ;; + --sharedlibdir=*) sharedlibdir=`echo $1 | sed 's/.*=//'`; shift ;; + -i*=* | --includedir=*) includedir=`echo $1 | sed 's/.*=//'`;shift ;; + -u*=* | --uname=*) uname=`echo $1 | sed 's/.*=//'`;shift ;; + -p* | --prefix) prefix="$2"; shift; shift ;; + -e* | --eprefix) exec_prefix="$2"; shift; shift ;; + -l* | --libdir) libdir="$2"; shift; shift ;; + -i* | --includedir) includedir="$2"; shift; shift ;; + -s* | --shared | --enable-shared) shared=1; shift ;; + -t | --static) shared=0; shift ;; + --solo) solo=1; shift ;; + --cover) cover=1; shift ;; + -z* | --zprefix) zprefix=1; shift ;; + -6* | --64) build64=1; shift ;; + -a*=* | --archs=*) ARCHS=`echo $1 | sed 's/.*=//'`; shift ;; + --sysconfdir=*) echo "ignored option: --sysconfdir" | tee -a configure.log; shift ;; + --localstatedir=*) echo "ignored option: --localstatedir" | tee -a configure.log; shift ;; + -c* | --const) zconst=1; shift ;; + -w* | --warn) warn=1; shift ;; + -d* | --debug) debug=1; shift ;; + *) + echo "unknown option: $1" | tee -a configure.log + echo "$0 --help for help" | tee -a configure.log + leave 1;; + esac +done + +# temporary file name +test=ztest$$ + +# put arguments in log, also put test file in log if used in arguments +show() +{ + case "$*" in + *$test.c*) + echo === $test.c === >> configure.log + cat $test.c >> configure.log + echo === >> configure.log;; + esac + echo $* >> configure.log +} + +# check for gcc vs. cc and set compile and link flags based on the system identified by uname +cat > $test.c <&1` in + *gcc*) gcc=1 ;; + *clang*) gcc=1 ;; +esac + +show $cc -c $test.c +if test "$gcc" -eq 1 && ($cc -c $test.c) >> configure.log 2>&1; then + echo ... using gcc >> configure.log + CC="$cc" + CFLAGS="${CFLAGS--O3}" + SFLAGS="${CFLAGS--O3} -fPIC" + if test "$ARCHS"; then + CFLAGS="${CFLAGS} ${ARCHS}" + LDFLAGS="${LDFLAGS} ${ARCHS}" + fi + if test $build64 -eq 1; then + CFLAGS="${CFLAGS} -m64" + SFLAGS="${SFLAGS} -m64" + fi + if test "$warn" -eq 1; then + if test "$zconst" -eq 1; then + CFLAGS="${CFLAGS} -Wall -Wextra -Wcast-qual -pedantic -DZLIB_CONST" + else + CFLAGS="${CFLAGS} -Wall -Wextra -pedantic" + fi + fi + if test $debug -eq 1; then + CFLAGS="${CFLAGS} -DZLIB_DEBUG" + SFLAGS="${SFLAGS} -DZLIB_DEBUG" + fi + if test -z "$uname"; then + uname=`(uname -s || echo unknown) 2>/dev/null` + fi + case "$uname" in + Linux* | linux* | GNU | GNU/* | solaris*) + LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,${SRCDIR}zlib.map"} ;; + *BSD | *bsd* | DragonFly) + LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,${SRCDIR}zlib.map"} + LDCONFIG="ldconfig -m" ;; + CYGWIN* | Cygwin* | cygwin* | OS/2*) + EXE='.exe' ;; + MINGW* | mingw*) +# temporary bypass + rm -f $test.[co] $test $test$shared_ext + echo "Please use win32/Makefile.gcc instead." | tee -a configure.log + leave 1 + LDSHARED=${LDSHARED-"$cc -shared"} + LDSHAREDLIBC="" + EXE='.exe' ;; + QNX*) # This is for QNX6. I suppose that the QNX rule below is for QNX2,QNX4 + # (alain.bonnefoy@icbt.com) + LDSHARED=${LDSHARED-"$cc -shared -Wl,-hlibz.so.1"} ;; + HP-UX*) + LDSHARED=${LDSHARED-"$cc -shared $SFLAGS"} + case `(uname -m || echo unknown) 2>/dev/null` in + ia64) + shared_ext='.so' + SHAREDLIB='libz.so' ;; + *) + shared_ext='.sl' + SHAREDLIB='libz.sl' ;; + esac ;; + Darwin* | darwin*) + shared_ext='.dylib' + SHAREDLIB=libz$shared_ext + SHAREDLIBV=libz.$VER$shared_ext + SHAREDLIBM=libz.$VER1$shared_ext + LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER3"} + if libtool -V 2>&1 | grep Apple > /dev/null; then + AR="libtool" + else + AR="/usr/bin/libtool" + fi + ARFLAGS="-o" ;; + *) LDSHARED=${LDSHARED-"$cc -shared"} ;; + esac +else + # find system name and corresponding cc options + CC=${CC-cc} + gcc=0 + echo ... using $CC >> configure.log + if test -z "$uname"; then + uname=`(uname -sr || echo unknown) 2>/dev/null` + fi + case "$uname" in + HP-UX*) SFLAGS=${CFLAGS-"-O +z"} + CFLAGS=${CFLAGS-"-O"} +# LDSHARED=${LDSHARED-"ld -b +vnocompatwarnings"} + LDSHARED=${LDSHARED-"ld -b"} + case `(uname -m || echo unknown) 2>/dev/null` in + ia64) + shared_ext='.so' + SHAREDLIB='libz.so' ;; + *) + shared_ext='.sl' + SHAREDLIB='libz.sl' ;; + esac ;; + IRIX*) SFLAGS=${CFLAGS-"-ansi -O2 -rpath ."} + CFLAGS=${CFLAGS-"-ansi -O2"} + LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so.1"} ;; + OSF1\ V4*) SFLAGS=${CFLAGS-"-O -std1"} + CFLAGS=${CFLAGS-"-O -std1"} + LDFLAGS="${LDFLAGS} -Wl,-rpath,." + LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so -Wl,-msym -Wl,-rpath,$(libdir) -Wl,-set_version,${VER}:1.0"} ;; + OSF1*) SFLAGS=${CFLAGS-"-O -std1"} + CFLAGS=${CFLAGS-"-O -std1"} + LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so.1"} ;; + QNX*) SFLAGS=${CFLAGS-"-4 -O"} + CFLAGS=${CFLAGS-"-4 -O"} + LDSHARED=${LDSHARED-"cc"} + RANLIB=${RANLIB-"true"} + AR="cc" + ARFLAGS="-A" ;; + SCO_SV\ 3.2*) SFLAGS=${CFLAGS-"-O3 -dy -KPIC "} + CFLAGS=${CFLAGS-"-O3"} + LDSHARED=${LDSHARED-"cc -dy -KPIC -G"} ;; + SunOS\ 5* | solaris*) + LDSHARED=${LDSHARED-"cc -G -h libz$shared_ext.$VER1"} + SFLAGS=${CFLAGS-"-fast -KPIC"} + CFLAGS=${CFLAGS-"-fast"} + if test $build64 -eq 1; then + # old versions of SunPRO/Workshop/Studio don't support -m64, + # but newer ones do. Check for it. + flag64=`$CC -flags | egrep -- '^-m64'` + if test x"$flag64" != x"" ; then + CFLAGS="${CFLAGS} -m64" + SFLAGS="${SFLAGS} -m64" + else + case `(uname -m || echo unknown) 2>/dev/null` in + i86*) + SFLAGS="$SFLAGS -xarch=amd64" + CFLAGS="$CFLAGS -xarch=amd64" ;; + *) + SFLAGS="$SFLAGS -xarch=v9" + CFLAGS="$CFLAGS -xarch=v9" ;; + esac + fi + fi + if test -n "$ZINC"; then + ZINC='-I- -I. -I$(SRCDIR)' + fi + ;; + SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"} + CFLAGS=${CFLAGS-"-O2"} + LDSHARED=${LDSHARED-"ld"} ;; + SunStudio\ 9*) SFLAGS=${CFLAGS-"-fast -xcode=pic32 -xtarget=ultra3 -xarch=v9b"} + CFLAGS=${CFLAGS-"-fast -xtarget=ultra3 -xarch=v9b"} + LDSHARED=${LDSHARED-"cc -xarch=v9b"} ;; + UNIX_System_V\ 4.2.0) + SFLAGS=${CFLAGS-"-KPIC -O"} + CFLAGS=${CFLAGS-"-O"} + LDSHARED=${LDSHARED-"cc -G"} ;; + UNIX_SV\ 4.2MP) + SFLAGS=${CFLAGS-"-Kconform_pic -O"} + CFLAGS=${CFLAGS-"-O"} + LDSHARED=${LDSHARED-"cc -G"} ;; + OpenUNIX\ 5) + SFLAGS=${CFLAGS-"-KPIC -O"} + CFLAGS=${CFLAGS-"-O"} + LDSHARED=${LDSHARED-"cc -G"} ;; + AIX*) # Courtesy of dbakker@arrayasolutions.com + SFLAGS=${CFLAGS-"-O -qmaxmem=8192"} + CFLAGS=${CFLAGS-"-O -qmaxmem=8192"} + LDSHARED=${LDSHARED-"xlc -G"} ;; + # send working options for other systems to zlib@gzip.org + *) SFLAGS=${CFLAGS-"-O"} + CFLAGS=${CFLAGS-"-O"} + LDSHARED=${LDSHARED-"cc -shared"} ;; + esac +fi + +# destination names for shared library if not defined above +SHAREDLIB=${SHAREDLIB-"libz$shared_ext"} +SHAREDLIBV=${SHAREDLIBV-"libz$shared_ext.$VER"} +SHAREDLIBM=${SHAREDLIBM-"libz$shared_ext.$VER1"} + +echo >> configure.log + +# define functions for testing compiler and library characteristics and logging the results + +cat > $test.c </dev/null; then + try() + { + show $* + test "`( $* ) 2>&1 | tee -a configure.log`" = "" + } + echo - using any output from compiler to indicate an error >> configure.log +else + try() + { + show $* + ( $* ) >> configure.log 2>&1 + ret=$? + if test $ret -ne 0; then + echo "(exit code "$ret")" >> configure.log + fi + return $ret + } +fi + +tryboth() +{ + show $* + got=`( $* ) 2>&1` + ret=$? + printf %s "$got" >> configure.log + if test $ret -ne 0; then + return $ret + fi + test "$got" = "" +} + +cat > $test.c << EOF +int foo() { return 0; } +EOF +echo "Checking for obsessive-compulsive compiler options..." >> configure.log +if try $CC -c $CFLAGS $test.c; then + : +else + echo "Compiler error reporting is too harsh for $0 (perhaps remove -Werror)." | tee -a configure.log + leave 1 +fi + +echo >> configure.log + +# see if shared library build supported +cat > $test.c <> configure.log + show "$NM $test.o | grep _hello" + if test "`$NM $test.o | grep _hello | tee -a configure.log`" = ""; then + CPP="$CPP -DNO_UNDERLINE" + echo Checking for underline in external names... No. | tee -a configure.log + else + echo Checking for underline in external names... Yes. | tee -a configure.log + fi ;; +esac + +echo >> configure.log + +# check for size_t +cat > $test.c < +#include +size_t dummy = 0; +EOF +if try $CC -c $CFLAGS $test.c; then + echo "Checking for size_t... Yes." | tee -a configure.log + need_sizet=0 +else + echo "Checking for size_t... No." | tee -a configure.log + need_sizet=1 +fi + +echo >> configure.log + +# find the size_t integer type, if needed +if test $need_sizet -eq 1; then + cat > $test.c < $test.c < +int main(void) { + if (sizeof(void *) <= sizeof(int)) puts("int"); + else if (sizeof(void *) <= sizeof(long)) puts("long"); + else puts("z_longlong"); + return 0; +} +EOF + else + echo "Checking for long long... No." | tee -a configure.log + cat > $test.c < +int main(void) { + if (sizeof(void *) <= sizeof(int)) puts("int"); + else puts("long"); + return 0; +} +EOF + fi + if try $CC $CFLAGS -o $test $test.c; then + sizet=`./$test` + echo "Checking for a pointer-size integer type..." $sizet"." | tee -a configure.log + else + echo "Failed to find a pointer-size integer type." | tee -a configure.log + leave 1 + fi +fi + +if test $need_sizet -eq 1; then + CFLAGS="${CFLAGS} -DNO_SIZE_T=${sizet}" + SFLAGS="${SFLAGS} -DNO_SIZE_T=${sizet}" +fi + +echo >> configure.log + +# check for large file support, and if none, check for fseeko() +cat > $test.c < +off64_t dummy = 0; +EOF +if try $CC -c $CFLAGS -D_LARGEFILE64_SOURCE=1 $test.c; then + CFLAGS="${CFLAGS} -D_LARGEFILE64_SOURCE=1" + SFLAGS="${SFLAGS} -D_LARGEFILE64_SOURCE=1" + ALL="${ALL} all64" + TEST="${TEST} test64" + echo "Checking for off64_t... Yes." | tee -a configure.log + echo "Checking for fseeko... Yes." | tee -a configure.log +else + echo "Checking for off64_t... No." | tee -a configure.log + echo >> configure.log + cat > $test.c < +int main(void) { + fseeko(NULL, 0, 0); + return 0; +} +EOF + if try $CC $CFLAGS -o $test $test.c; then + echo "Checking for fseeko... Yes." | tee -a configure.log + else + CFLAGS="${CFLAGS} -DNO_FSEEKO" + SFLAGS="${SFLAGS} -DNO_FSEEKO" + echo "Checking for fseeko... No." | tee -a configure.log + fi +fi + +echo >> configure.log + +# check for strerror() for use by gz* functions +cat > $test.c < +#include +int main() { return strlen(strerror(errno)); } +EOF +if try $CC $CFLAGS -o $test $test.c; then + echo "Checking for strerror... Yes." | tee -a configure.log +else + CFLAGS="${CFLAGS} -DNO_STRERROR" + SFLAGS="${SFLAGS} -DNO_STRERROR" + echo "Checking for strerror... No." | tee -a configure.log +fi + +# copy clean zconf.h for subsequent edits +cp -p ${SRCDIR}zconf.h.in zconf.h + +echo >> configure.log + +# check for unistd.h and save result in zconf.h +cat > $test.c < +int main() { return 0; } +EOF +if try $CC -c $CFLAGS $test.c; then + sed < zconf.h "/^#ifdef HAVE_UNISTD_H.* may be/s/def HAVE_UNISTD_H\(.*\) may be/ 1\1 was/" > zconf.temp.h + mv zconf.temp.h zconf.h + echo "Checking for unistd.h... Yes." | tee -a configure.log +else + echo "Checking for unistd.h... No." | tee -a configure.log +fi + +echo >> configure.log + +# check for stdarg.h and save result in zconf.h +cat > $test.c < +int main() { return 0; } +EOF +if try $CC -c $CFLAGS $test.c; then + sed < zconf.h "/^#ifdef HAVE_STDARG_H.* may be/s/def HAVE_STDARG_H\(.*\) may be/ 1\1 was/" > zconf.temp.h + mv zconf.temp.h zconf.h + echo "Checking for stdarg.h... Yes." | tee -a configure.log +else + echo "Checking for stdarg.h... No." | tee -a configure.log +fi + +# if the z_ prefix was requested, save that in zconf.h +if test $zprefix -eq 1; then + sed < zconf.h "/#ifdef Z_PREFIX.* may be/s/def Z_PREFIX\(.*\) may be/ 1\1 was/" > zconf.temp.h + mv zconf.temp.h zconf.h + echo >> configure.log + echo "Using z_ prefix on all symbols." | tee -a configure.log +fi + +# if --solo compilation was requested, save that in zconf.h and remove gz stuff from object lists +if test $solo -eq 1; then + sed '/#define ZCONF_H/a\ +#define Z_SOLO + +' < zconf.h > zconf.temp.h + mv zconf.temp.h zconf.h +OBJC='$(OBJZ)' +PIC_OBJC='$(PIC_OBJZ)' +fi + +# if code coverage testing was requested, use older gcc if defined, e.g. "gcc-4.2" on Mac OS X +if test $cover -eq 1; then + CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage" + if test -n "$GCC_CLASSIC"; then + CC=$GCC_CLASSIC + fi +fi + +echo >> configure.log + +# conduct a series of tests to resolve eight possible cases of using "vs" or "s" printf functions +# (using stdarg or not), with or without "n" (proving size of buffer), and with or without a +# return value. The most secure result is vsnprintf() with a return value. snprintf() with a +# return value is secure as well, but then gzprintf() will be limited to 20 arguments. +cat > $test.c < +#include +#include "zconf.h" +int main() +{ +#ifndef STDC + choke me +#endif + return 0; +} +EOF +if try $CC -c $CFLAGS $test.c; then + echo "Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf()." | tee -a configure.log + + echo >> configure.log + cat > $test.c < +#include +int mytest(const char *fmt, ...) +{ + char buf[20]; + va_list ap; + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + return 0; +} +int main() +{ + return (mytest("Hello%d\n", 1)); +} +EOF + if try $CC $CFLAGS -o $test $test.c; then + echo "Checking for vsnprintf() in stdio.h... Yes." | tee -a configure.log + + echo >> configure.log + cat >$test.c < +#include +int mytest(const char *fmt, ...) +{ + int n; + char buf[20]; + va_list ap; + va_start(ap, fmt); + n = vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + return n; +} +int main() +{ + return (mytest("Hello%d\n", 1)); +} +EOF + + if try $CC -c $CFLAGS $test.c; then + echo "Checking for return value of vsnprintf()... Yes." | tee -a configure.log + else + CFLAGS="$CFLAGS -DHAS_vsnprintf_void" + SFLAGS="$SFLAGS -DHAS_vsnprintf_void" + echo "Checking for return value of vsnprintf()... No." | tee -a configure.log + echo " WARNING: apparently vsnprintf() does not return a value. zlib" | tee -a configure.log + echo " can build but will be open to possible string-format security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log + fi + else + CFLAGS="$CFLAGS -DNO_vsnprintf" + SFLAGS="$SFLAGS -DNO_vsnprintf" + echo "Checking for vsnprintf() in stdio.h... No." | tee -a configure.log + echo " WARNING: vsnprintf() not found, falling back to vsprintf(). zlib" | tee -a configure.log + echo " can build but will be open to possible buffer-overflow security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log + + echo >> configure.log + cat >$test.c < +#include +int mytest(const char *fmt, ...) +{ + int n; + char buf[20]; + va_list ap; + va_start(ap, fmt); + n = vsprintf(buf, fmt, ap); + va_end(ap); + return n; +} +int main() +{ + return (mytest("Hello%d\n", 1)); +} +EOF + + if try $CC -c $CFLAGS $test.c; then + echo "Checking for return value of vsprintf()... Yes." | tee -a configure.log + else + CFLAGS="$CFLAGS -DHAS_vsprintf_void" + SFLAGS="$SFLAGS -DHAS_vsprintf_void" + echo "Checking for return value of vsprintf()... No." | tee -a configure.log + echo " WARNING: apparently vsprintf() does not return a value. zlib" | tee -a configure.log + echo " can build but will be open to possible string-format security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log + fi + fi +else + echo "Checking whether to use vs[n]printf() or s[n]printf()... using s[n]printf()." | tee -a configure.log + + echo >> configure.log + cat >$test.c < +int mytest() +{ + char buf[20]; + snprintf(buf, sizeof(buf), "%s", "foo"); + return 0; +} +int main() +{ + return (mytest()); +} +EOF + + if try $CC $CFLAGS -o $test $test.c; then + echo "Checking for snprintf() in stdio.h... Yes." | tee -a configure.log + + echo >> configure.log + cat >$test.c < +int mytest() +{ + char buf[20]; + return snprintf(buf, sizeof(buf), "%s", "foo"); +} +int main() +{ + return (mytest()); +} +EOF + + if try $CC -c $CFLAGS $test.c; then + echo "Checking for return value of snprintf()... Yes." | tee -a configure.log + else + CFLAGS="$CFLAGS -DHAS_snprintf_void" + SFLAGS="$SFLAGS -DHAS_snprintf_void" + echo "Checking for return value of snprintf()... No." | tee -a configure.log + echo " WARNING: apparently snprintf() does not return a value. zlib" | tee -a configure.log + echo " can build but will be open to possible string-format security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log + fi + else + CFLAGS="$CFLAGS -DNO_snprintf" + SFLAGS="$SFLAGS -DNO_snprintf" + echo "Checking for snprintf() in stdio.h... No." | tee -a configure.log + echo " WARNING: snprintf() not found, falling back to sprintf(). zlib" | tee -a configure.log + echo " can build but will be open to possible buffer-overflow security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log + + echo >> configure.log + cat >$test.c < +int mytest() +{ + char buf[20]; + return sprintf(buf, "%s", "foo"); +} +int main() +{ + return (mytest()); +} +EOF + + if try $CC -c $CFLAGS $test.c; then + echo "Checking for return value of sprintf()... Yes." | tee -a configure.log + else + CFLAGS="$CFLAGS -DHAS_sprintf_void" + SFLAGS="$SFLAGS -DHAS_sprintf_void" + echo "Checking for return value of sprintf()... No." | tee -a configure.log + echo " WARNING: apparently sprintf() does not return a value. zlib" | tee -a configure.log + echo " can build but will be open to possible string-format security" | tee -a configure.log + echo " vulnerabilities." | tee -a configure.log + fi + fi +fi + +# see if we can hide zlib internal symbols that are linked between separate source files +if test "$gcc" -eq 1; then + echo >> configure.log + cat > $test.c <> configure.log +echo ALL = $ALL >> configure.log +echo AR = $AR >> configure.log +echo ARFLAGS = $ARFLAGS >> configure.log +echo CC = $CC >> configure.log +echo CFLAGS = $CFLAGS >> configure.log +echo CPP = $CPP >> configure.log +echo EXE = $EXE >> configure.log +echo LDCONFIG = $LDCONFIG >> configure.log +echo LDFLAGS = $LDFLAGS >> configure.log +echo LDSHARED = $LDSHARED >> configure.log +echo LDSHAREDLIBC = $LDSHAREDLIBC >> configure.log +echo OBJC = $OBJC >> configure.log +echo PIC_OBJC = $PIC_OBJC >> configure.log +echo RANLIB = $RANLIB >> configure.log +echo SFLAGS = $SFLAGS >> configure.log +echo SHAREDLIB = $SHAREDLIB >> configure.log +echo SHAREDLIBM = $SHAREDLIBM >> configure.log +echo SHAREDLIBV = $SHAREDLIBV >> configure.log +echo STATICLIB = $STATICLIB >> configure.log +echo TEST = $TEST >> configure.log +echo VER = $VER >> configure.log +echo Z_U4 = $Z_U4 >> configure.log +echo SRCDIR = $SRCDIR >> configure.log +echo exec_prefix = $exec_prefix >> configure.log +echo includedir = $includedir >> configure.log +echo libdir = $libdir >> configure.log +echo mandir = $mandir >> configure.log +echo prefix = $prefix >> configure.log +echo sharedlibdir = $sharedlibdir >> configure.log +echo uname = $uname >> configure.log + +# udpate Makefile with the configure results +sed < ${SRCDIR}Makefile.in " +/^CC *=/s#=.*#=$CC# +/^CFLAGS *=/s#=.*#=$CFLAGS# +/^SFLAGS *=/s#=.*#=$SFLAGS# +/^LDFLAGS *=/s#=.*#=$LDFLAGS# +/^LDSHARED *=/s#=.*#=$LDSHARED# +/^CPP *=/s#=.*#=$CPP# +/^STATICLIB *=/s#=.*#=$STATICLIB# +/^SHAREDLIB *=/s#=.*#=$SHAREDLIB# +/^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV# +/^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM# +/^AR *=/s#=.*#=$AR# +/^ARFLAGS *=/s#=.*#=$ARFLAGS# +/^RANLIB *=/s#=.*#=$RANLIB# +/^LDCONFIG *=/s#=.*#=$LDCONFIG# +/^LDSHAREDLIBC *=/s#=.*#=$LDSHAREDLIBC# +/^EXE *=/s#=.*#=$EXE# +/^SRCDIR *=/s#=.*#=$SRCDIR# +/^ZINC *=/s#=.*#=$ZINC# +/^ZINCOUT *=/s#=.*#=$ZINCOUT# +/^prefix *=/s#=.*#=$prefix# +/^exec_prefix *=/s#=.*#=$exec_prefix# +/^libdir *=/s#=.*#=$libdir# +/^sharedlibdir *=/s#=.*#=$sharedlibdir# +/^includedir *=/s#=.*#=$includedir# +/^mandir *=/s#=.*#=$mandir# +/^OBJC *=/s#=.*#= $OBJC# +/^PIC_OBJC *=/s#=.*#= $PIC_OBJC# +/^all: */s#:.*#: $ALL# +/^test: */s#:.*#: $TEST# +" > Makefile + +# create zlib.pc with the configure results +sed < ${SRCDIR}zlib.pc.in " +/^CC *=/s#=.*#=$CC# +/^CFLAGS *=/s#=.*#=$CFLAGS# +/^CPP *=/s#=.*#=$CPP# +/^LDSHARED *=/s#=.*#=$LDSHARED# +/^STATICLIB *=/s#=.*#=$STATICLIB# +/^SHAREDLIB *=/s#=.*#=$SHAREDLIB# +/^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV# +/^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM# +/^AR *=/s#=.*#=$AR# +/^ARFLAGS *=/s#=.*#=$ARFLAGS# +/^RANLIB *=/s#=.*#=$RANLIB# +/^EXE *=/s#=.*#=$EXE# +/^prefix *=/s#=.*#=$prefix# +/^exec_prefix *=/s#=.*#=$exec_prefix# +/^libdir *=/s#=.*#=$libdir# +/^sharedlibdir *=/s#=.*#=$sharedlibdir# +/^includedir *=/s#=.*#=$includedir# +/^mandir *=/s#=.*#=$mandir# +/^LDFLAGS *=/s#=.*#=$LDFLAGS# +" | sed -e " +s/\@VERSION\@/$VER/g; +" > zlib.pc + +# done +leave 0 diff --git a/externe_kniznice/zlib/contrib/README.contrib b/externe_kniznice/zlib/contrib/README.contrib new file mode 100644 index 0000000..a411d5c --- /dev/null +++ b/externe_kniznice/zlib/contrib/README.contrib @@ -0,0 +1,78 @@ +All files under this contrib directory are UNSUPPORTED. There were +provided by users of zlib and were not tested by the authors of zlib. +Use at your own risk. Please contact the authors of the contributions +for help about these, not the zlib authors. Thanks. + + +ada/ by Dmitriy Anisimkov + Support for Ada + See http://zlib-ada.sourceforge.net/ + +amd64/ by Mikhail Teterin + asm code for AMD64 + See patch at http://www.freebsd.org/cgi/query-pr.cgi?pr=bin/96393 + +asm686/ by Brian Raiter + asm code for Pentium and PPro/PII, using the AT&T (GNU as) syntax + See http://www.muppetlabs.com/~breadbox/software/assembly.html + +blast/ by Mark Adler + Decompressor for output of PKWare Data Compression Library (DCL) + +delphi/ by Cosmin Truta + Support for Delphi and C++ Builder + +dotzlib/ by Henrik Ravn + Support for Microsoft .Net and Visual C++ .Net + +gcc_gvmat64/by Gilles Vollant + GCC Version of x86 64-bit (AMD64 and Intel EM64t) code for x64 + assembler to replace longest_match() and inflate_fast() + +infback9/ by Mark Adler + Unsupported diffs to infback to decode the deflate64 format + +inflate86/ by Chris Anderson + Tuned x86 gcc asm code to replace inflate_fast() + +iostream/ by Kevin Ruland + A C++ I/O streams interface to the zlib gz* functions + +iostream2/ by Tyge Løvset + Another C++ I/O streams interface + +iostream3/ by Ludwig Schwardt + and Kevin Ruland + Yet another C++ I/O streams interface + +masmx64/ by Gilles Vollant + x86 64-bit (AMD64 and Intel EM64t) code for x64 assembler to + replace longest_match() and inflate_fast(), also masm x86 + 64-bits translation of Chris Anderson inflate_fast() + +masmx86/ by Gilles Vollant + x86 asm code to replace longest_match() and inflate_fast(), + for Visual C++ and MASM (32 bits). + Based on Brian Raiter (asm686) and Chris Anderson (inflate86) + +minizip/ by Gilles Vollant + Mini zip and unzip based on zlib + Includes Zip64 support by Mathias Svensson + See http://www.winimage.com/zLibDll/minizip.html + +pascal/ by Bob Dellaca et al. + Support for Pascal + +puff/ by Mark Adler + Small, low memory usage inflate. Also serves to provide an + unambiguous description of the deflate format. + +testzlib/ by Gilles Vollant + Example of the use of zlib + +untgz/ by Pedro A. Aranda Gutierrez + A very simple tar.gz file extractor using zlib + +vstudio/ by Gilles Vollant + Building a minizip-enhanced zlib with Microsoft Visual Studio + Includes vc11 from kreuzerkrieg and vc12 from davispuh diff --git a/externe_kniznice/zlib/contrib/ada/buffer_demo.adb b/externe_kniznice/zlib/contrib/ada/buffer_demo.adb new file mode 100644 index 0000000..46b8638 --- /dev/null +++ b/externe_kniznice/zlib/contrib/ada/buffer_demo.adb @@ -0,0 +1,106 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2004 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- +-- +-- $Id: buffer_demo.adb,v 1.3 2004/09/06 06:55:35 vagul Exp $ + +-- This demo program provided by Dr Steve Sangwine +-- +-- Demonstration of a problem with Zlib-Ada (already fixed) when a buffer +-- of exactly the correct size is used for decompressed data, and the last +-- few bytes passed in to Zlib are checksum bytes. + +-- This program compresses a string of text, and then decompresses the +-- compressed text into a buffer of the same size as the original text. + +with Ada.Streams; use Ada.Streams; +with Ada.Text_IO; + +with ZLib; use ZLib; + +procedure Buffer_Demo is + EOL : Character renames ASCII.LF; + Text : constant String + := "Four score and seven years ago our fathers brought forth," & EOL & + "upon this continent, a new nation, conceived in liberty," & EOL & + "and dedicated to the proposition that `all men are created equal'."; + + Source : Stream_Element_Array (1 .. Text'Length); + for Source'Address use Text'Address; + +begin + Ada.Text_IO.Put (Text); + Ada.Text_IO.New_Line; + Ada.Text_IO.Put_Line + ("Uncompressed size : " & Positive'Image (Text'Length) & " bytes"); + + declare + Compressed_Data : Stream_Element_Array (1 .. Text'Length); + L : Stream_Element_Offset; + begin + Compress : declare + Compressor : Filter_Type; + I : Stream_Element_Offset; + begin + Deflate_Init (Compressor); + + -- Compress the whole of T at once. + + Translate (Compressor, Source, I, Compressed_Data, L, Finish); + pragma Assert (I = Source'Last); + + Close (Compressor); + + Ada.Text_IO.Put_Line + ("Compressed size : " + & Stream_Element_Offset'Image (L) & " bytes"); + end Compress; + + -- Now we decompress the data, passing short blocks of data to Zlib + -- (because this demonstrates the problem - the last block passed will + -- contain checksum information and there will be no output, only a + -- check inside Zlib that the checksum is correct). + + Decompress : declare + Decompressor : Filter_Type; + + Uncompressed_Data : Stream_Element_Array (1 .. Text'Length); + + Block_Size : constant := 4; + -- This makes sure that the last block contains + -- only Adler checksum data. + + P : Stream_Element_Offset := Compressed_Data'First - 1; + O : Stream_Element_Offset; + begin + Inflate_Init (Decompressor); + + loop + Translate + (Decompressor, + Compressed_Data + (P + 1 .. Stream_Element_Offset'Min (P + Block_Size, L)), + P, + Uncompressed_Data + (Total_Out (Decompressor) + 1 .. Uncompressed_Data'Last), + O, + No_Flush); + + Ada.Text_IO.Put_Line + ("Total in : " & Count'Image (Total_In (Decompressor)) & + ", out : " & Count'Image (Total_Out (Decompressor))); + + exit when P = L; + end loop; + + Ada.Text_IO.New_Line; + Ada.Text_IO.Put_Line + ("Decompressed text matches original text : " + & Boolean'Image (Uncompressed_Data = Source)); + end Decompress; + end; +end Buffer_Demo; diff --git a/externe_kniznice/zlib/contrib/ada/mtest.adb b/externe_kniznice/zlib/contrib/ada/mtest.adb new file mode 100644 index 0000000..c4dfd08 --- /dev/null +++ b/externe_kniznice/zlib/contrib/ada/mtest.adb @@ -0,0 +1,156 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- +-- Continuous test for ZLib multithreading. If the test would fail +-- we should provide thread safe allocation routines for the Z_Stream. +-- +-- $Id: mtest.adb,v 1.4 2004/07/23 07:49:54 vagul Exp $ + +with ZLib; +with Ada.Streams; +with Ada.Numerics.Discrete_Random; +with Ada.Text_IO; +with Ada.Exceptions; +with Ada.Task_Identification; + +procedure MTest is + use Ada.Streams; + use ZLib; + + Stop : Boolean := False; + + pragma Atomic (Stop); + + subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#; + + package Random_Elements is + new Ada.Numerics.Discrete_Random (Visible_Symbols); + + task type Test_Task; + + task body Test_Task is + Buffer : Stream_Element_Array (1 .. 100_000); + Gen : Random_Elements.Generator; + + Buffer_First : Stream_Element_Offset; + Compare_First : Stream_Element_Offset; + + Deflate : Filter_Type; + Inflate : Filter_Type; + + procedure Further (Item : in Stream_Element_Array); + + procedure Read_Buffer + (Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset); + + ------------- + -- Further -- + ------------- + + procedure Further (Item : in Stream_Element_Array) is + + procedure Compare (Item : in Stream_Element_Array); + + ------------- + -- Compare -- + ------------- + + procedure Compare (Item : in Stream_Element_Array) is + Next_First : Stream_Element_Offset := Compare_First + Item'Length; + begin + if Buffer (Compare_First .. Next_First - 1) /= Item then + raise Program_Error; + end if; + + Compare_First := Next_First; + end Compare; + + procedure Compare_Write is new ZLib.Write (Write => Compare); + begin + Compare_Write (Inflate, Item, No_Flush); + end Further; + + ----------------- + -- Read_Buffer -- + ----------------- + + procedure Read_Buffer + (Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset) + is + Buff_Diff : Stream_Element_Offset := Buffer'Last - Buffer_First; + Next_First : Stream_Element_Offset; + begin + if Item'Length <= Buff_Diff then + Last := Item'Last; + + Next_First := Buffer_First + Item'Length; + + Item := Buffer (Buffer_First .. Next_First - 1); + + Buffer_First := Next_First; + else + Last := Item'First + Buff_Diff; + Item (Item'First .. Last) := Buffer (Buffer_First .. Buffer'Last); + Buffer_First := Buffer'Last + 1; + end if; + end Read_Buffer; + + procedure Translate is new Generic_Translate + (Data_In => Read_Buffer, + Data_Out => Further); + + begin + Random_Elements.Reset (Gen); + + Buffer := (others => 20); + + Main : loop + for J in Buffer'Range loop + Buffer (J) := Random_Elements.Random (Gen); + + Deflate_Init (Deflate); + Inflate_Init (Inflate); + + Buffer_First := Buffer'First; + Compare_First := Buffer'First; + + Translate (Deflate); + + if Compare_First /= Buffer'Last + 1 then + raise Program_Error; + end if; + + Ada.Text_IO.Put_Line + (Ada.Task_Identification.Image + (Ada.Task_Identification.Current_Task) + & Stream_Element_Offset'Image (J) + & ZLib.Count'Image (Total_Out (Deflate))); + + Close (Deflate); + Close (Inflate); + + exit Main when Stop; + end loop; + end loop Main; + exception + when E : others => + Ada.Text_IO.Put_Line (Ada.Exceptions.Exception_Information (E)); + Stop := True; + end Test_Task; + + Test : array (1 .. 4) of Test_Task; + + pragma Unreferenced (Test); + + Dummy : Character; + +begin + Ada.Text_IO.Get_Immediate (Dummy); + Stop := True; +end MTest; diff --git a/externe_kniznice/zlib/contrib/ada/read.adb b/externe_kniznice/zlib/contrib/ada/read.adb new file mode 100644 index 0000000..1f2efbf --- /dev/null +++ b/externe_kniznice/zlib/contrib/ada/read.adb @@ -0,0 +1,156 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: read.adb,v 1.8 2004/05/31 10:53:40 vagul Exp $ + +-- Test/demo program for the generic read interface. + +with Ada.Numerics.Discrete_Random; +with Ada.Streams; +with Ada.Text_IO; + +with ZLib; + +procedure Read is + + use Ada.Streams; + + ------------------------------------ + -- Test configuration parameters -- + ------------------------------------ + + File_Size : Stream_Element_Offset := 100_000; + + Continuous : constant Boolean := False; + -- If this constant is True, the test would be repeated again and again, + -- with increment File_Size for every iteration. + + Header : constant ZLib.Header_Type := ZLib.Default; + -- Do not use Header other than Default in ZLib versions 1.1.4 and older. + + Init_Random : constant := 8; + -- We are using the same random sequence, in case of we catch bug, + -- so we would be able to reproduce it. + + -- End -- + + Pack_Size : Stream_Element_Offset; + Offset : Stream_Element_Offset; + + Filter : ZLib.Filter_Type; + + subtype Visible_Symbols + is Stream_Element range 16#20# .. 16#7E#; + + package Random_Elements is new + Ada.Numerics.Discrete_Random (Visible_Symbols); + + Gen : Random_Elements.Generator; + Period : constant Stream_Element_Offset := 200; + -- Period constant variable for random generator not to be very random. + -- Bigger period, harder random. + + Read_Buffer : Stream_Element_Array (1 .. 2048); + Read_First : Stream_Element_Offset; + Read_Last : Stream_Element_Offset; + + procedure Reset; + + procedure Read + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset); + -- this procedure is for generic instantiation of + -- ZLib.Read + -- reading data from the File_In. + + procedure Read is new ZLib.Read + (Read, + Read_Buffer, + Rest_First => Read_First, + Rest_Last => Read_Last); + + ---------- + -- Read -- + ---------- + + procedure Read + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset) is + begin + Last := Stream_Element_Offset'Min + (Item'Last, + Item'First + File_Size - Offset); + + for J in Item'First .. Last loop + if J < Item'First + Period then + Item (J) := Random_Elements.Random (Gen); + else + Item (J) := Item (J - Period); + end if; + + Offset := Offset + 1; + end loop; + end Read; + + ----------- + -- Reset -- + ----------- + + procedure Reset is + begin + Random_Elements.Reset (Gen, Init_Random); + Pack_Size := 0; + Offset := 1; + Read_First := Read_Buffer'Last + 1; + Read_Last := Read_Buffer'Last; + end Reset; + +begin + Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version); + + loop + for Level in ZLib.Compression_Level'Range loop + + Ada.Text_IO.Put ("Level =" + & ZLib.Compression_Level'Image (Level)); + + -- Deflate using generic instantiation. + + ZLib.Deflate_Init + (Filter, + Level, + Header => Header); + + Reset; + + Ada.Text_IO.Put + (Stream_Element_Offset'Image (File_Size) & " ->"); + + loop + declare + Buffer : Stream_Element_Array (1 .. 1024); + Last : Stream_Element_Offset; + begin + Read (Filter, Buffer, Last); + + Pack_Size := Pack_Size + Last - Buffer'First + 1; + + exit when Last < Buffer'Last; + end; + end loop; + + Ada.Text_IO.Put_Line (Stream_Element_Offset'Image (Pack_Size)); + + ZLib.Close (Filter); + end loop; + + exit when not Continuous; + + File_Size := File_Size + 1; + end loop; +end Read; diff --git a/externe_kniznice/zlib/contrib/ada/readme.txt b/externe_kniznice/zlib/contrib/ada/readme.txt new file mode 100644 index 0000000..ce4d2ca --- /dev/null +++ b/externe_kniznice/zlib/contrib/ada/readme.txt @@ -0,0 +1,65 @@ + ZLib for Ada thick binding (ZLib.Ada) + Release 1.3 + +ZLib.Ada is a thick binding interface to the popular ZLib data +compression library, available at http://www.gzip.org/zlib/. +It provides Ada-style access to the ZLib C library. + + + Here are the main changes since ZLib.Ada 1.2: + +- Attension: ZLib.Read generic routine have a initialization requirement + for Read_Last parameter now. It is a bit incompartible with previous version, + but extends functionality, we could use new parameters Allow_Read_Some and + Flush now. + +- Added Is_Open routines to ZLib and ZLib.Streams packages. + +- Add pragma Assert to check Stream_Element is 8 bit. + +- Fix extraction to buffer with exact known decompressed size. Error reported by + Steve Sangwine. + +- Fix definition of ULong (changed to unsigned_long), fix regression on 64 bits + computers. Patch provided by Pascal Obry. + +- Add Status_Error exception definition. + +- Add pragma Assertion that Ada.Streams.Stream_Element size is 8 bit. + + + How to build ZLib.Ada under GNAT + +You should have the ZLib library already build on your computer, before +building ZLib.Ada. Make the directory of ZLib.Ada sources current and +issue the command: + + gnatmake test -largs -L -lz + +Or use the GNAT project file build for GNAT 3.15 or later: + + gnatmake -Pzlib.gpr -L + + + How to build ZLib.Ada under Aonix ObjectAda for Win32 7.2.2 + +1. Make a project with all *.ads and *.adb files from the distribution. +2. Build the libz.a library from the ZLib C sources. +3. Rename libz.a to z.lib. +4. Add the library z.lib to the project. +5. Add the libc.lib library from the ObjectAda distribution to the project. +6. Build the executable using test.adb as a main procedure. + + + How to use ZLib.Ada + +The source files test.adb and read.adb are small demo programs that show +the main functionality of ZLib.Ada. + +The routines from the package specifications are commented. + + +Homepage: http://zlib-ada.sourceforge.net/ +Author: Dmitriy Anisimkov + +Contributors: Pascal Obry , Steve Sangwine diff --git a/externe_kniznice/zlib/contrib/ada/test.adb b/externe_kniznice/zlib/contrib/ada/test.adb new file mode 100644 index 0000000..90773ac --- /dev/null +++ b/externe_kniznice/zlib/contrib/ada/test.adb @@ -0,0 +1,463 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: test.adb,v 1.17 2003/08/12 12:13:30 vagul Exp $ + +-- The program has a few aims. +-- 1. Test ZLib.Ada95 thick binding functionality. +-- 2. Show the example of use main functionality of the ZLib.Ada95 binding. +-- 3. Build this program automatically compile all ZLib.Ada95 packages under +-- GNAT Ada95 compiler. + +with ZLib.Streams; +with Ada.Streams.Stream_IO; +with Ada.Numerics.Discrete_Random; + +with Ada.Text_IO; + +with Ada.Calendar; + +procedure Test is + + use Ada.Streams; + use Stream_IO; + + ------------------------------------ + -- Test configuration parameters -- + ------------------------------------ + + File_Size : Count := 100_000; + Continuous : constant Boolean := False; + + Header : constant ZLib.Header_Type := ZLib.Default; + -- ZLib.None; + -- ZLib.Auto; + -- ZLib.GZip; + -- Do not use Header other then Default in ZLib versions 1.1.4 + -- and older. + + Strategy : constant ZLib.Strategy_Type := ZLib.Default_Strategy; + Init_Random : constant := 10; + + -- End -- + + In_File_Name : constant String := "testzlib.in"; + -- Name of the input file + + Z_File_Name : constant String := "testzlib.zlb"; + -- Name of the compressed file. + + Out_File_Name : constant String := "testzlib.out"; + -- Name of the decompressed file. + + File_In : File_Type; + File_Out : File_Type; + File_Back : File_Type; + File_Z : ZLib.Streams.Stream_Type; + + Filter : ZLib.Filter_Type; + + Time_Stamp : Ada.Calendar.Time; + + procedure Generate_File; + -- Generate file of spetsified size with some random data. + -- The random data is repeatable, for the good compression. + + procedure Compare_Streams + (Left, Right : in out Root_Stream_Type'Class); + -- The procedure compearing data in 2 streams. + -- It is for compare data before and after compression/decompression. + + procedure Compare_Files (Left, Right : String); + -- Compare files. Based on the Compare_Streams. + + procedure Copy_Streams + (Source, Target : in out Root_Stream_Type'Class; + Buffer_Size : in Stream_Element_Offset := 1024); + -- Copying data from one stream to another. It is for test stream + -- interface of the library. + + procedure Data_In + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset); + -- this procedure is for generic instantiation of + -- ZLib.Generic_Translate. + -- reading data from the File_In. + + procedure Data_Out (Item : in Stream_Element_Array); + -- this procedure is for generic instantiation of + -- ZLib.Generic_Translate. + -- writing data to the File_Out. + + procedure Stamp; + -- Store the timestamp to the local variable. + + procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count); + -- Print the time statistic with the message. + + procedure Translate is new ZLib.Generic_Translate + (Data_In => Data_In, + Data_Out => Data_Out); + -- This procedure is moving data from File_In to File_Out + -- with compression or decompression, depend on initialization of + -- Filter parameter. + + ------------------- + -- Compare_Files -- + ------------------- + + procedure Compare_Files (Left, Right : String) is + Left_File, Right_File : File_Type; + begin + Open (Left_File, In_File, Left); + Open (Right_File, In_File, Right); + Compare_Streams (Stream (Left_File).all, Stream (Right_File).all); + Close (Left_File); + Close (Right_File); + end Compare_Files; + + --------------------- + -- Compare_Streams -- + --------------------- + + procedure Compare_Streams + (Left, Right : in out Ada.Streams.Root_Stream_Type'Class) + is + Left_Buffer, Right_Buffer : Stream_Element_Array (0 .. 16#FFF#); + Left_Last, Right_Last : Stream_Element_Offset; + begin + loop + Read (Left, Left_Buffer, Left_Last); + Read (Right, Right_Buffer, Right_Last); + + if Left_Last /= Right_Last then + Ada.Text_IO.Put_Line ("Compare error :" + & Stream_Element_Offset'Image (Left_Last) + & " /= " + & Stream_Element_Offset'Image (Right_Last)); + + raise Constraint_Error; + + elsif Left_Buffer (0 .. Left_Last) + /= Right_Buffer (0 .. Right_Last) + then + Ada.Text_IO.Put_Line ("ERROR: IN and OUT files is not equal."); + raise Constraint_Error; + + end if; + + exit when Left_Last < Left_Buffer'Last; + end loop; + end Compare_Streams; + + ------------------ + -- Copy_Streams -- + ------------------ + + procedure Copy_Streams + (Source, Target : in out Ada.Streams.Root_Stream_Type'Class; + Buffer_Size : in Stream_Element_Offset := 1024) + is + Buffer : Stream_Element_Array (1 .. Buffer_Size); + Last : Stream_Element_Offset; + begin + loop + Read (Source, Buffer, Last); + Write (Target, Buffer (1 .. Last)); + + exit when Last < Buffer'Last; + end loop; + end Copy_Streams; + + ------------- + -- Data_In -- + ------------- + + procedure Data_In + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset) is + begin + Read (File_In, Item, Last); + end Data_In; + + -------------- + -- Data_Out -- + -------------- + + procedure Data_Out (Item : in Stream_Element_Array) is + begin + Write (File_Out, Item); + end Data_Out; + + ------------------- + -- Generate_File -- + ------------------- + + procedure Generate_File is + subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#; + + package Random_Elements is + new Ada.Numerics.Discrete_Random (Visible_Symbols); + + Gen : Random_Elements.Generator; + Buffer : Stream_Element_Array := (1 .. 77 => 16#20#) & 10; + + Buffer_Count : constant Count := File_Size / Buffer'Length; + -- Number of same buffers in the packet. + + Density : constant Count := 30; -- from 0 to Buffer'Length - 2; + + procedure Fill_Buffer (J, D : in Count); + -- Change the part of the buffer. + + ----------------- + -- Fill_Buffer -- + ----------------- + + procedure Fill_Buffer (J, D : in Count) is + begin + for K in 0 .. D loop + Buffer + (Stream_Element_Offset ((J + K) mod (Buffer'Length - 1) + 1)) + := Random_Elements.Random (Gen); + + end loop; + end Fill_Buffer; + + begin + Random_Elements.Reset (Gen, Init_Random); + + Create (File_In, Out_File, In_File_Name); + + Fill_Buffer (1, Buffer'Length - 2); + + for J in 1 .. Buffer_Count loop + Write (File_In, Buffer); + + Fill_Buffer (J, Density); + end loop; + + -- fill remain size. + + Write + (File_In, + Buffer + (1 .. Stream_Element_Offset + (File_Size - Buffer'Length * Buffer_Count))); + + Flush (File_In); + Close (File_In); + end Generate_File; + + --------------------- + -- Print_Statistic -- + --------------------- + + procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count) is + use Ada.Calendar; + use Ada.Text_IO; + + package Count_IO is new Integer_IO (ZLib.Count); + + Curr_Dur : Duration := Clock - Time_Stamp; + begin + Put (Msg); + + Set_Col (20); + Ada.Text_IO.Put ("size ="); + + Count_IO.Put + (Data_Size, + Width => Stream_IO.Count'Image (File_Size)'Length); + + Put_Line (" duration =" & Duration'Image (Curr_Dur)); + end Print_Statistic; + + ----------- + -- Stamp -- + ----------- + + procedure Stamp is + begin + Time_Stamp := Ada.Calendar.Clock; + end Stamp; + +begin + Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version); + + loop + Generate_File; + + for Level in ZLib.Compression_Level'Range loop + + Ada.Text_IO.Put_Line ("Level =" + & ZLib.Compression_Level'Image (Level)); + + -- Test generic interface. + Open (File_In, In_File, In_File_Name); + Create (File_Out, Out_File, Z_File_Name); + + Stamp; + + -- Deflate using generic instantiation. + + ZLib.Deflate_Init + (Filter => Filter, + Level => Level, + Strategy => Strategy, + Header => Header); + + Translate (Filter); + Print_Statistic ("Generic compress", ZLib.Total_Out (Filter)); + ZLib.Close (Filter); + + Close (File_In); + Close (File_Out); + + Open (File_In, In_File, Z_File_Name); + Create (File_Out, Out_File, Out_File_Name); + + Stamp; + + -- Inflate using generic instantiation. + + ZLib.Inflate_Init (Filter, Header => Header); + + Translate (Filter); + Print_Statistic ("Generic decompress", ZLib.Total_Out (Filter)); + + ZLib.Close (Filter); + + Close (File_In); + Close (File_Out); + + Compare_Files (In_File_Name, Out_File_Name); + + -- Test stream interface. + + -- Compress to the back stream. + + Open (File_In, In_File, In_File_Name); + Create (File_Back, Out_File, Z_File_Name); + + Stamp; + + ZLib.Streams.Create + (Stream => File_Z, + Mode => ZLib.Streams.Out_Stream, + Back => ZLib.Streams.Stream_Access + (Stream (File_Back)), + Back_Compressed => True, + Level => Level, + Strategy => Strategy, + Header => Header); + + Copy_Streams + (Source => Stream (File_In).all, + Target => File_Z); + + -- Flushing internal buffers to the back stream. + + ZLib.Streams.Flush (File_Z, ZLib.Finish); + + Print_Statistic ("Write compress", + ZLib.Streams.Write_Total_Out (File_Z)); + + ZLib.Streams.Close (File_Z); + + Close (File_In); + Close (File_Back); + + -- Compare reading from original file and from + -- decompression stream. + + Open (File_In, In_File, In_File_Name); + Open (File_Back, In_File, Z_File_Name); + + ZLib.Streams.Create + (Stream => File_Z, + Mode => ZLib.Streams.In_Stream, + Back => ZLib.Streams.Stream_Access + (Stream (File_Back)), + Back_Compressed => True, + Header => Header); + + Stamp; + Compare_Streams (Stream (File_In).all, File_Z); + + Print_Statistic ("Read decompress", + ZLib.Streams.Read_Total_Out (File_Z)); + + ZLib.Streams.Close (File_Z); + Close (File_In); + Close (File_Back); + + -- Compress by reading from compression stream. + + Open (File_Back, In_File, In_File_Name); + Create (File_Out, Out_File, Z_File_Name); + + ZLib.Streams.Create + (Stream => File_Z, + Mode => ZLib.Streams.In_Stream, + Back => ZLib.Streams.Stream_Access + (Stream (File_Back)), + Back_Compressed => False, + Level => Level, + Strategy => Strategy, + Header => Header); + + Stamp; + Copy_Streams + (Source => File_Z, + Target => Stream (File_Out).all); + + Print_Statistic ("Read compress", + ZLib.Streams.Read_Total_Out (File_Z)); + + ZLib.Streams.Close (File_Z); + + Close (File_Out); + Close (File_Back); + + -- Decompress to decompression stream. + + Open (File_In, In_File, Z_File_Name); + Create (File_Back, Out_File, Out_File_Name); + + ZLib.Streams.Create + (Stream => File_Z, + Mode => ZLib.Streams.Out_Stream, + Back => ZLib.Streams.Stream_Access + (Stream (File_Back)), + Back_Compressed => False, + Header => Header); + + Stamp; + + Copy_Streams + (Source => Stream (File_In).all, + Target => File_Z); + + Print_Statistic ("Write decompress", + ZLib.Streams.Write_Total_Out (File_Z)); + + ZLib.Streams.Close (File_Z); + Close (File_In); + Close (File_Back); + + Compare_Files (In_File_Name, Out_File_Name); + end loop; + + Ada.Text_IO.Put_Line (Count'Image (File_Size) & " Ok."); + + exit when not Continuous; + + File_Size := File_Size + 1; + end loop; +end Test; diff --git a/externe_kniznice/zlib/contrib/ada/zlib-streams.adb b/externe_kniznice/zlib/contrib/ada/zlib-streams.adb new file mode 100644 index 0000000..b6497ba --- /dev/null +++ b/externe_kniznice/zlib/contrib/ada/zlib-streams.adb @@ -0,0 +1,225 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: zlib-streams.adb,v 1.10 2004/05/31 10:53:40 vagul Exp $ + +with Ada.Unchecked_Deallocation; + +package body ZLib.Streams is + + ----------- + -- Close -- + ----------- + + procedure Close (Stream : in out Stream_Type) is + procedure Free is new Ada.Unchecked_Deallocation + (Stream_Element_Array, Buffer_Access); + begin + if Stream.Mode = Out_Stream or Stream.Mode = Duplex then + -- We should flush the data written by the writer. + + Flush (Stream, Finish); + + Close (Stream.Writer); + end if; + + if Stream.Mode = In_Stream or Stream.Mode = Duplex then + Close (Stream.Reader); + Free (Stream.Buffer); + end if; + end Close; + + ------------ + -- Create -- + ------------ + + procedure Create + (Stream : out Stream_Type; + Mode : in Stream_Mode; + Back : in Stream_Access; + Back_Compressed : in Boolean; + Level : in Compression_Level := Default_Compression; + Strategy : in Strategy_Type := Default_Strategy; + Header : in Header_Type := Default; + Read_Buffer_Size : in Ada.Streams.Stream_Element_Offset + := Default_Buffer_Size; + Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset + := Default_Buffer_Size) + is + + subtype Buffer_Subtype is Stream_Element_Array (1 .. Read_Buffer_Size); + + procedure Init_Filter + (Filter : in out Filter_Type; + Compress : in Boolean); + + ----------------- + -- Init_Filter -- + ----------------- + + procedure Init_Filter + (Filter : in out Filter_Type; + Compress : in Boolean) is + begin + if Compress then + Deflate_Init + (Filter, Level, Strategy, Header => Header); + else + Inflate_Init (Filter, Header => Header); + end if; + end Init_Filter; + + begin + Stream.Back := Back; + Stream.Mode := Mode; + + if Mode = Out_Stream or Mode = Duplex then + Init_Filter (Stream.Writer, Back_Compressed); + Stream.Buffer_Size := Write_Buffer_Size; + else + Stream.Buffer_Size := 0; + end if; + + if Mode = In_Stream or Mode = Duplex then + Init_Filter (Stream.Reader, not Back_Compressed); + + Stream.Buffer := new Buffer_Subtype; + Stream.Rest_First := Stream.Buffer'Last + 1; + Stream.Rest_Last := Stream.Buffer'Last; + end if; + end Create; + + ----------- + -- Flush -- + ----------- + + procedure Flush + (Stream : in out Stream_Type; + Mode : in Flush_Mode := Sync_Flush) + is + Buffer : Stream_Element_Array (1 .. Stream.Buffer_Size); + Last : Stream_Element_Offset; + begin + loop + Flush (Stream.Writer, Buffer, Last, Mode); + + Ada.Streams.Write (Stream.Back.all, Buffer (1 .. Last)); + + exit when Last < Buffer'Last; + end loop; + end Flush; + + ------------- + -- Is_Open -- + ------------- + + function Is_Open (Stream : Stream_Type) return Boolean is + begin + return Is_Open (Stream.Reader) or else Is_Open (Stream.Writer); + end Is_Open; + + ---------- + -- Read -- + ---------- + + procedure Read + (Stream : in out Stream_Type; + Item : out Stream_Element_Array; + Last : out Stream_Element_Offset) + is + + procedure Read + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset); + + ---------- + -- Read -- + ---------- + + procedure Read + (Item : out Stream_Element_Array; + Last : out Stream_Element_Offset) is + begin + Ada.Streams.Read (Stream.Back.all, Item, Last); + end Read; + + procedure Read is new ZLib.Read + (Read => Read, + Buffer => Stream.Buffer.all, + Rest_First => Stream.Rest_First, + Rest_Last => Stream.Rest_Last); + + begin + Read (Stream.Reader, Item, Last); + end Read; + + ------------------- + -- Read_Total_In -- + ------------------- + + function Read_Total_In (Stream : in Stream_Type) return Count is + begin + return Total_In (Stream.Reader); + end Read_Total_In; + + -------------------- + -- Read_Total_Out -- + -------------------- + + function Read_Total_Out (Stream : in Stream_Type) return Count is + begin + return Total_Out (Stream.Reader); + end Read_Total_Out; + + ----------- + -- Write -- + ----------- + + procedure Write + (Stream : in out Stream_Type; + Item : in Stream_Element_Array) + is + + procedure Write (Item : in Stream_Element_Array); + + ----------- + -- Write -- + ----------- + + procedure Write (Item : in Stream_Element_Array) is + begin + Ada.Streams.Write (Stream.Back.all, Item); + end Write; + + procedure Write is new ZLib.Write + (Write => Write, + Buffer_Size => Stream.Buffer_Size); + + begin + Write (Stream.Writer, Item, No_Flush); + end Write; + + -------------------- + -- Write_Total_In -- + -------------------- + + function Write_Total_In (Stream : in Stream_Type) return Count is + begin + return Total_In (Stream.Writer); + end Write_Total_In; + + --------------------- + -- Write_Total_Out -- + --------------------- + + function Write_Total_Out (Stream : in Stream_Type) return Count is + begin + return Total_Out (Stream.Writer); + end Write_Total_Out; + +end ZLib.Streams; diff --git a/externe_kniznice/zlib/contrib/ada/zlib-streams.ads b/externe_kniznice/zlib/contrib/ada/zlib-streams.ads new file mode 100644 index 0000000..8e26cd4 --- /dev/null +++ b/externe_kniznice/zlib/contrib/ada/zlib-streams.ads @@ -0,0 +1,114 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: zlib-streams.ads,v 1.12 2004/05/31 10:53:40 vagul Exp $ + +package ZLib.Streams is + + type Stream_Mode is (In_Stream, Out_Stream, Duplex); + + type Stream_Access is access all Ada.Streams.Root_Stream_Type'Class; + + type Stream_Type is + new Ada.Streams.Root_Stream_Type with private; + + procedure Read + (Stream : in out Stream_Type; + Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset); + + procedure Write + (Stream : in out Stream_Type; + Item : in Ada.Streams.Stream_Element_Array); + + procedure Flush + (Stream : in out Stream_Type; + Mode : in Flush_Mode := Sync_Flush); + -- Flush the written data to the back stream, + -- all data placed to the compressor is flushing to the Back stream. + -- Should not be used until necessary, because it is decreasing + -- compression. + + function Read_Total_In (Stream : in Stream_Type) return Count; + pragma Inline (Read_Total_In); + -- Return total number of bytes read from back stream so far. + + function Read_Total_Out (Stream : in Stream_Type) return Count; + pragma Inline (Read_Total_Out); + -- Return total number of bytes read so far. + + function Write_Total_In (Stream : in Stream_Type) return Count; + pragma Inline (Write_Total_In); + -- Return total number of bytes written so far. + + function Write_Total_Out (Stream : in Stream_Type) return Count; + pragma Inline (Write_Total_Out); + -- Return total number of bytes written to the back stream. + + procedure Create + (Stream : out Stream_Type; + Mode : in Stream_Mode; + Back : in Stream_Access; + Back_Compressed : in Boolean; + Level : in Compression_Level := Default_Compression; + Strategy : in Strategy_Type := Default_Strategy; + Header : in Header_Type := Default; + Read_Buffer_Size : in Ada.Streams.Stream_Element_Offset + := Default_Buffer_Size; + Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset + := Default_Buffer_Size); + -- Create the Comression/Decompression stream. + -- If mode is In_Stream then Write operation is disabled. + -- If mode is Out_Stream then Read operation is disabled. + + -- If Back_Compressed is true then + -- Data written to the Stream is compressing to the Back stream + -- and data read from the Stream is decompressed data from the Back stream. + + -- If Back_Compressed is false then + -- Data written to the Stream is decompressing to the Back stream + -- and data read from the Stream is compressed data from the Back stream. + + -- !!! When the Need_Header is False ZLib-Ada is using undocumented + -- ZLib 1.1.4 functionality to do not create/wait for ZLib headers. + + function Is_Open (Stream : Stream_Type) return Boolean; + + procedure Close (Stream : in out Stream_Type); + +private + + use Ada.Streams; + + type Buffer_Access is access all Stream_Element_Array; + + type Stream_Type + is new Root_Stream_Type with + record + Mode : Stream_Mode; + + Buffer : Buffer_Access; + Rest_First : Stream_Element_Offset; + Rest_Last : Stream_Element_Offset; + -- Buffer for Read operation. + -- We need to have this buffer in the record + -- because not all read data from back stream + -- could be processed during the read operation. + + Buffer_Size : Stream_Element_Offset; + -- Buffer size for write operation. + -- We do not need to have this buffer + -- in the record because all data could be + -- processed in the write operation. + + Back : Stream_Access; + Reader : Filter_Type; + Writer : Filter_Type; + end record; + +end ZLib.Streams; diff --git a/externe_kniznice/zlib/contrib/ada/zlib-thin.adb b/externe_kniznice/zlib/contrib/ada/zlib-thin.adb new file mode 100644 index 0000000..0ca4a71 --- /dev/null +++ b/externe_kniznice/zlib/contrib/ada/zlib-thin.adb @@ -0,0 +1,141 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: zlib-thin.adb,v 1.8 2003/12/14 18:27:31 vagul Exp $ + +package body ZLib.Thin is + + ZLIB_VERSION : constant Chars_Ptr := zlibVersion; + + Z_Stream_Size : constant Int := Z_Stream'Size / System.Storage_Unit; + + -------------- + -- Avail_In -- + -------------- + + function Avail_In (Strm : in Z_Stream) return UInt is + begin + return Strm.Avail_In; + end Avail_In; + + --------------- + -- Avail_Out -- + --------------- + + function Avail_Out (Strm : in Z_Stream) return UInt is + begin + return Strm.Avail_Out; + end Avail_Out; + + ------------------ + -- Deflate_Init -- + ------------------ + + function Deflate_Init + (strm : Z_Streamp; + level : Int; + method : Int; + windowBits : Int; + memLevel : Int; + strategy : Int) + return Int is + begin + return deflateInit2 + (strm, + level, + method, + windowBits, + memLevel, + strategy, + ZLIB_VERSION, + Z_Stream_Size); + end Deflate_Init; + + ------------------ + -- Inflate_Init -- + ------------------ + + function Inflate_Init (strm : Z_Streamp; windowBits : Int) return Int is + begin + return inflateInit2 (strm, windowBits, ZLIB_VERSION, Z_Stream_Size); + end Inflate_Init; + + ------------------------ + -- Last_Error_Message -- + ------------------------ + + function Last_Error_Message (Strm : in Z_Stream) return String is + use Interfaces.C.Strings; + begin + if Strm.msg = Null_Ptr then + return ""; + else + return Value (Strm.msg); + end if; + end Last_Error_Message; + + ------------ + -- Set_In -- + ------------ + + procedure Set_In + (Strm : in out Z_Stream; + Buffer : in Voidp; + Size : in UInt) is + begin + Strm.Next_In := Buffer; + Strm.Avail_In := Size; + end Set_In; + + ------------------ + -- Set_Mem_Func -- + ------------------ + + procedure Set_Mem_Func + (Strm : in out Z_Stream; + Opaque : in Voidp; + Alloc : in alloc_func; + Free : in free_func) is + begin + Strm.opaque := Opaque; + Strm.zalloc := Alloc; + Strm.zfree := Free; + end Set_Mem_Func; + + ------------- + -- Set_Out -- + ------------- + + procedure Set_Out + (Strm : in out Z_Stream; + Buffer : in Voidp; + Size : in UInt) is + begin + Strm.Next_Out := Buffer; + Strm.Avail_Out := Size; + end Set_Out; + + -------------- + -- Total_In -- + -------------- + + function Total_In (Strm : in Z_Stream) return ULong is + begin + return Strm.Total_In; + end Total_In; + + --------------- + -- Total_Out -- + --------------- + + function Total_Out (Strm : in Z_Stream) return ULong is + begin + return Strm.Total_Out; + end Total_Out; + +end ZLib.Thin; diff --git a/externe_kniznice/zlib/contrib/ada/zlib-thin.ads b/externe_kniznice/zlib/contrib/ada/zlib-thin.ads new file mode 100644 index 0000000..810173c --- /dev/null +++ b/externe_kniznice/zlib/contrib/ada/zlib-thin.ads @@ -0,0 +1,450 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2003 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: zlib-thin.ads,v 1.11 2004/07/23 06:33:11 vagul Exp $ + +with Interfaces.C.Strings; + +with System; + +private package ZLib.Thin is + + -- From zconf.h + + MAX_MEM_LEVEL : constant := 9; -- zconf.h:105 + -- zconf.h:105 + MAX_WBITS : constant := 15; -- zconf.h:115 + -- 32K LZ77 window + -- zconf.h:115 + SEEK_SET : constant := 8#0000#; -- zconf.h:244 + -- Seek from beginning of file. + -- zconf.h:244 + SEEK_CUR : constant := 1; -- zconf.h:245 + -- Seek from current position. + -- zconf.h:245 + SEEK_END : constant := 2; -- zconf.h:246 + -- Set file pointer to EOF plus "offset" + -- zconf.h:246 + + type Byte is new Interfaces.C.unsigned_char; -- 8 bits + -- zconf.h:214 + type UInt is new Interfaces.C.unsigned; -- 16 bits or more + -- zconf.h:216 + type Int is new Interfaces.C.int; + + type ULong is new Interfaces.C.unsigned_long; -- 32 bits or more + -- zconf.h:217 + subtype Chars_Ptr is Interfaces.C.Strings.chars_ptr; + + type ULong_Access is access ULong; + type Int_Access is access Int; + + subtype Voidp is System.Address; -- zconf.h:232 + + subtype Byte_Access is Voidp; + + Nul : constant Voidp := System.Null_Address; + -- end from zconf + + Z_NO_FLUSH : constant := 8#0000#; -- zlib.h:125 + -- zlib.h:125 + Z_PARTIAL_FLUSH : constant := 1; -- zlib.h:126 + -- will be removed, use + -- Z_SYNC_FLUSH instead + -- zlib.h:126 + Z_SYNC_FLUSH : constant := 2; -- zlib.h:127 + -- zlib.h:127 + Z_FULL_FLUSH : constant := 3; -- zlib.h:128 + -- zlib.h:128 + Z_FINISH : constant := 4; -- zlib.h:129 + -- zlib.h:129 + Z_OK : constant := 8#0000#; -- zlib.h:132 + -- zlib.h:132 + Z_STREAM_END : constant := 1; -- zlib.h:133 + -- zlib.h:133 + Z_NEED_DICT : constant := 2; -- zlib.h:134 + -- zlib.h:134 + Z_ERRNO : constant := -1; -- zlib.h:135 + -- zlib.h:135 + Z_STREAM_ERROR : constant := -2; -- zlib.h:136 + -- zlib.h:136 + Z_DATA_ERROR : constant := -3; -- zlib.h:137 + -- zlib.h:137 + Z_MEM_ERROR : constant := -4; -- zlib.h:138 + -- zlib.h:138 + Z_BUF_ERROR : constant := -5; -- zlib.h:139 + -- zlib.h:139 + Z_VERSION_ERROR : constant := -6; -- zlib.h:140 + -- zlib.h:140 + Z_NO_COMPRESSION : constant := 8#0000#; -- zlib.h:145 + -- zlib.h:145 + Z_BEST_SPEED : constant := 1; -- zlib.h:146 + -- zlib.h:146 + Z_BEST_COMPRESSION : constant := 9; -- zlib.h:147 + -- zlib.h:147 + Z_DEFAULT_COMPRESSION : constant := -1; -- zlib.h:148 + -- zlib.h:148 + Z_FILTERED : constant := 1; -- zlib.h:151 + -- zlib.h:151 + Z_HUFFMAN_ONLY : constant := 2; -- zlib.h:152 + -- zlib.h:152 + Z_DEFAULT_STRATEGY : constant := 8#0000#; -- zlib.h:153 + -- zlib.h:153 + Z_BINARY : constant := 8#0000#; -- zlib.h:156 + -- zlib.h:156 + Z_ASCII : constant := 1; -- zlib.h:157 + -- zlib.h:157 + Z_UNKNOWN : constant := 2; -- zlib.h:158 + -- zlib.h:158 + Z_DEFLATED : constant := 8; -- zlib.h:161 + -- zlib.h:161 + Z_NULL : constant := 8#0000#; -- zlib.h:164 + -- for initializing zalloc, zfree, opaque + -- zlib.h:164 + type gzFile is new Voidp; -- zlib.h:646 + + type Z_Stream is private; + + type Z_Streamp is access all Z_Stream; -- zlib.h:89 + + type alloc_func is access function + (Opaque : Voidp; + Items : UInt; + Size : UInt) + return Voidp; -- zlib.h:63 + + type free_func is access procedure (opaque : Voidp; address : Voidp); + + function zlibVersion return Chars_Ptr; + + function Deflate (strm : Z_Streamp; flush : Int) return Int; + + function DeflateEnd (strm : Z_Streamp) return Int; + + function Inflate (strm : Z_Streamp; flush : Int) return Int; + + function InflateEnd (strm : Z_Streamp) return Int; + + function deflateSetDictionary + (strm : Z_Streamp; + dictionary : Byte_Access; + dictLength : UInt) + return Int; + + function deflateCopy (dest : Z_Streamp; source : Z_Streamp) return Int; + -- zlib.h:478 + + function deflateReset (strm : Z_Streamp) return Int; -- zlib.h:495 + + function deflateParams + (strm : Z_Streamp; + level : Int; + strategy : Int) + return Int; -- zlib.h:506 + + function inflateSetDictionary + (strm : Z_Streamp; + dictionary : Byte_Access; + dictLength : UInt) + return Int; -- zlib.h:548 + + function inflateSync (strm : Z_Streamp) return Int; -- zlib.h:565 + + function inflateReset (strm : Z_Streamp) return Int; -- zlib.h:580 + + function compress + (dest : Byte_Access; + destLen : ULong_Access; + source : Byte_Access; + sourceLen : ULong) + return Int; -- zlib.h:601 + + function compress2 + (dest : Byte_Access; + destLen : ULong_Access; + source : Byte_Access; + sourceLen : ULong; + level : Int) + return Int; -- zlib.h:615 + + function uncompress + (dest : Byte_Access; + destLen : ULong_Access; + source : Byte_Access; + sourceLen : ULong) + return Int; + + function gzopen (path : Chars_Ptr; mode : Chars_Ptr) return gzFile; + + function gzdopen (fd : Int; mode : Chars_Ptr) return gzFile; + + function gzsetparams + (file : gzFile; + level : Int; + strategy : Int) + return Int; + + function gzread + (file : gzFile; + buf : Voidp; + len : UInt) + return Int; + + function gzwrite + (file : in gzFile; + buf : in Voidp; + len : in UInt) + return Int; + + function gzprintf (file : in gzFile; format : in Chars_Ptr) return Int; + + function gzputs (file : in gzFile; s : in Chars_Ptr) return Int; + + function gzgets + (file : gzFile; + buf : Chars_Ptr; + len : Int) + return Chars_Ptr; + + function gzputc (file : gzFile; char : Int) return Int; + + function gzgetc (file : gzFile) return Int; + + function gzflush (file : gzFile; flush : Int) return Int; + + function gzseek + (file : gzFile; + offset : Int; + whence : Int) + return Int; + + function gzrewind (file : gzFile) return Int; + + function gztell (file : gzFile) return Int; + + function gzeof (file : gzFile) return Int; + + function gzclose (file : gzFile) return Int; + + function gzerror (file : gzFile; errnum : Int_Access) return Chars_Ptr; + + function adler32 + (adler : ULong; + buf : Byte_Access; + len : UInt) + return ULong; + + function crc32 + (crc : ULong; + buf : Byte_Access; + len : UInt) + return ULong; + + function deflateInit + (strm : Z_Streamp; + level : Int; + version : Chars_Ptr; + stream_size : Int) + return Int; + + function deflateInit2 + (strm : Z_Streamp; + level : Int; + method : Int; + windowBits : Int; + memLevel : Int; + strategy : Int; + version : Chars_Ptr; + stream_size : Int) + return Int; + + function Deflate_Init + (strm : Z_Streamp; + level : Int; + method : Int; + windowBits : Int; + memLevel : Int; + strategy : Int) + return Int; + pragma Inline (Deflate_Init); + + function inflateInit + (strm : Z_Streamp; + version : Chars_Ptr; + stream_size : Int) + return Int; + + function inflateInit2 + (strm : in Z_Streamp; + windowBits : in Int; + version : in Chars_Ptr; + stream_size : in Int) + return Int; + + function inflateBackInit + (strm : in Z_Streamp; + windowBits : in Int; + window : in Byte_Access; + version : in Chars_Ptr; + stream_size : in Int) + return Int; + -- Size of window have to be 2**windowBits. + + function Inflate_Init (strm : Z_Streamp; windowBits : Int) return Int; + pragma Inline (Inflate_Init); + + function zError (err : Int) return Chars_Ptr; + + function inflateSyncPoint (z : Z_Streamp) return Int; + + function get_crc_table return ULong_Access; + + -- Interface to the available fields of the z_stream structure. + -- The application must update next_in and avail_in when avail_in has + -- dropped to zero. It must update next_out and avail_out when avail_out + -- has dropped to zero. The application must initialize zalloc, zfree and + -- opaque before calling the init function. + + procedure Set_In + (Strm : in out Z_Stream; + Buffer : in Voidp; + Size : in UInt); + pragma Inline (Set_In); + + procedure Set_Out + (Strm : in out Z_Stream; + Buffer : in Voidp; + Size : in UInt); + pragma Inline (Set_Out); + + procedure Set_Mem_Func + (Strm : in out Z_Stream; + Opaque : in Voidp; + Alloc : in alloc_func; + Free : in free_func); + pragma Inline (Set_Mem_Func); + + function Last_Error_Message (Strm : in Z_Stream) return String; + pragma Inline (Last_Error_Message); + + function Avail_Out (Strm : in Z_Stream) return UInt; + pragma Inline (Avail_Out); + + function Avail_In (Strm : in Z_Stream) return UInt; + pragma Inline (Avail_In); + + function Total_In (Strm : in Z_Stream) return ULong; + pragma Inline (Total_In); + + function Total_Out (Strm : in Z_Stream) return ULong; + pragma Inline (Total_Out); + + function inflateCopy + (dest : in Z_Streamp; + Source : in Z_Streamp) + return Int; + + function compressBound (Source_Len : in ULong) return ULong; + + function deflateBound + (Strm : in Z_Streamp; + Source_Len : in ULong) + return ULong; + + function gzungetc (C : in Int; File : in gzFile) return Int; + + function zlibCompileFlags return ULong; + +private + + type Z_Stream is record -- zlib.h:68 + Next_In : Voidp := Nul; -- next input byte + Avail_In : UInt := 0; -- number of bytes available at next_in + Total_In : ULong := 0; -- total nb of input bytes read so far + Next_Out : Voidp := Nul; -- next output byte should be put there + Avail_Out : UInt := 0; -- remaining free space at next_out + Total_Out : ULong := 0; -- total nb of bytes output so far + msg : Chars_Ptr; -- last error message, NULL if no error + state : Voidp; -- not visible by applications + zalloc : alloc_func := null; -- used to allocate the internal state + zfree : free_func := null; -- used to free the internal state + opaque : Voidp; -- private data object passed to + -- zalloc and zfree + data_type : Int; -- best guess about the data type: + -- ascii or binary + adler : ULong; -- adler32 value of the uncompressed + -- data + reserved : ULong; -- reserved for future use + end record; + + pragma Convention (C, Z_Stream); + + pragma Import (C, zlibVersion, "zlibVersion"); + pragma Import (C, Deflate, "deflate"); + pragma Import (C, DeflateEnd, "deflateEnd"); + pragma Import (C, Inflate, "inflate"); + pragma Import (C, InflateEnd, "inflateEnd"); + pragma Import (C, deflateSetDictionary, "deflateSetDictionary"); + pragma Import (C, deflateCopy, "deflateCopy"); + pragma Import (C, deflateReset, "deflateReset"); + pragma Import (C, deflateParams, "deflateParams"); + pragma Import (C, inflateSetDictionary, "inflateSetDictionary"); + pragma Import (C, inflateSync, "inflateSync"); + pragma Import (C, inflateReset, "inflateReset"); + pragma Import (C, compress, "compress"); + pragma Import (C, compress2, "compress2"); + pragma Import (C, uncompress, "uncompress"); + pragma Import (C, gzopen, "gzopen"); + pragma Import (C, gzdopen, "gzdopen"); + pragma Import (C, gzsetparams, "gzsetparams"); + pragma Import (C, gzread, "gzread"); + pragma Import (C, gzwrite, "gzwrite"); + pragma Import (C, gzprintf, "gzprintf"); + pragma Import (C, gzputs, "gzputs"); + pragma Import (C, gzgets, "gzgets"); + pragma Import (C, gzputc, "gzputc"); + pragma Import (C, gzgetc, "gzgetc"); + pragma Import (C, gzflush, "gzflush"); + pragma Import (C, gzseek, "gzseek"); + pragma Import (C, gzrewind, "gzrewind"); + pragma Import (C, gztell, "gztell"); + pragma Import (C, gzeof, "gzeof"); + pragma Import (C, gzclose, "gzclose"); + pragma Import (C, gzerror, "gzerror"); + pragma Import (C, adler32, "adler32"); + pragma Import (C, crc32, "crc32"); + pragma Import (C, deflateInit, "deflateInit_"); + pragma Import (C, inflateInit, "inflateInit_"); + pragma Import (C, deflateInit2, "deflateInit2_"); + pragma Import (C, inflateInit2, "inflateInit2_"); + pragma Import (C, zError, "zError"); + pragma Import (C, inflateSyncPoint, "inflateSyncPoint"); + pragma Import (C, get_crc_table, "get_crc_table"); + + -- since zlib 1.2.0: + + pragma Import (C, inflateCopy, "inflateCopy"); + pragma Import (C, compressBound, "compressBound"); + pragma Import (C, deflateBound, "deflateBound"); + pragma Import (C, gzungetc, "gzungetc"); + pragma Import (C, zlibCompileFlags, "zlibCompileFlags"); + + pragma Import (C, inflateBackInit, "inflateBackInit_"); + + -- I stopped binding the inflateBack routines, because realize that + -- it does not support zlib and gzip headers for now, and have no + -- symmetric deflateBack routines. + -- ZLib-Ada is symmetric regarding deflate/inflate data transformation + -- and has a similar generic callback interface for the + -- deflate/inflate transformation based on the regular Deflate/Inflate + -- routines. + + -- pragma Import (C, inflateBack, "inflateBack"); + -- pragma Import (C, inflateBackEnd, "inflateBackEnd"); + +end ZLib.Thin; diff --git a/externe_kniznice/zlib/contrib/ada/zlib.adb b/externe_kniznice/zlib/contrib/ada/zlib.adb new file mode 100644 index 0000000..8b6fd68 --- /dev/null +++ b/externe_kniznice/zlib/contrib/ada/zlib.adb @@ -0,0 +1,701 @@ +---------------------------------------------------------------- +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2004 Dmitriy Anisimkov -- +-- -- +-- Open source license information is in the zlib.ads file. -- +---------------------------------------------------------------- + +-- $Id: zlib.adb,v 1.31 2004/09/06 06:53:19 vagul Exp $ + +with Ada.Exceptions; +with Ada.Unchecked_Conversion; +with Ada.Unchecked_Deallocation; + +with Interfaces.C.Strings; + +with ZLib.Thin; + +package body ZLib is + + use type Thin.Int; + + type Z_Stream is new Thin.Z_Stream; + + type Return_Code_Enum is + (OK, + STREAM_END, + NEED_DICT, + ERRNO, + STREAM_ERROR, + DATA_ERROR, + MEM_ERROR, + BUF_ERROR, + VERSION_ERROR); + + type Flate_Step_Function is access + function (Strm : in Thin.Z_Streamp; Flush : in Thin.Int) return Thin.Int; + pragma Convention (C, Flate_Step_Function); + + type Flate_End_Function is access + function (Ctrm : in Thin.Z_Streamp) return Thin.Int; + pragma Convention (C, Flate_End_Function); + + type Flate_Type is record + Step : Flate_Step_Function; + Done : Flate_End_Function; + end record; + + subtype Footer_Array is Stream_Element_Array (1 .. 8); + + Simple_GZip_Header : constant Stream_Element_Array (1 .. 10) + := (16#1f#, 16#8b#, -- Magic header + 16#08#, -- Z_DEFLATED + 16#00#, -- Flags + 16#00#, 16#00#, 16#00#, 16#00#, -- Time + 16#00#, -- XFlags + 16#03# -- OS code + ); + -- The simplest gzip header is not for informational, but just for + -- gzip format compatibility. + -- Note that some code below is using assumption + -- Simple_GZip_Header'Last > Footer_Array'Last, so do not make + -- Simple_GZip_Header'Last <= Footer_Array'Last. + + Return_Code : constant array (Thin.Int range <>) of Return_Code_Enum + := (0 => OK, + 1 => STREAM_END, + 2 => NEED_DICT, + -1 => ERRNO, + -2 => STREAM_ERROR, + -3 => DATA_ERROR, + -4 => MEM_ERROR, + -5 => BUF_ERROR, + -6 => VERSION_ERROR); + + Flate : constant array (Boolean) of Flate_Type + := (True => (Step => Thin.Deflate'Access, + Done => Thin.DeflateEnd'Access), + False => (Step => Thin.Inflate'Access, + Done => Thin.InflateEnd'Access)); + + Flush_Finish : constant array (Boolean) of Flush_Mode + := (True => Finish, False => No_Flush); + + procedure Raise_Error (Stream : in Z_Stream); + pragma Inline (Raise_Error); + + procedure Raise_Error (Message : in String); + pragma Inline (Raise_Error); + + procedure Check_Error (Stream : in Z_Stream; Code : in Thin.Int); + + procedure Free is new Ada.Unchecked_Deallocation + (Z_Stream, Z_Stream_Access); + + function To_Thin_Access is new Ada.Unchecked_Conversion + (Z_Stream_Access, Thin.Z_Streamp); + + procedure Translate_GZip + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode); + -- Separate translate routine for make gzip header. + + procedure Translate_Auto + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode); + -- translate routine without additional headers. + + ----------------- + -- Check_Error -- + ----------------- + + procedure Check_Error (Stream : in Z_Stream; Code : in Thin.Int) is + use type Thin.Int; + begin + if Code /= Thin.Z_OK then + Raise_Error + (Return_Code_Enum'Image (Return_Code (Code)) + & ": " & Last_Error_Message (Stream)); + end if; + end Check_Error; + + ----------- + -- Close -- + ----------- + + procedure Close + (Filter : in out Filter_Type; + Ignore_Error : in Boolean := False) + is + Code : Thin.Int; + begin + if not Ignore_Error and then not Is_Open (Filter) then + raise Status_Error; + end if; + + Code := Flate (Filter.Compression).Done (To_Thin_Access (Filter.Strm)); + + if Ignore_Error or else Code = Thin.Z_OK then + Free (Filter.Strm); + else + declare + Error_Message : constant String + := Last_Error_Message (Filter.Strm.all); + begin + Free (Filter.Strm); + Ada.Exceptions.Raise_Exception + (ZLib_Error'Identity, + Return_Code_Enum'Image (Return_Code (Code)) + & ": " & Error_Message); + end; + end if; + end Close; + + ----------- + -- CRC32 -- + ----------- + + function CRC32 + (CRC : in Unsigned_32; + Data : in Ada.Streams.Stream_Element_Array) + return Unsigned_32 + is + use Thin; + begin + return Unsigned_32 (crc32 (ULong (CRC), + Data'Address, + Data'Length)); + end CRC32; + + procedure CRC32 + (CRC : in out Unsigned_32; + Data : in Ada.Streams.Stream_Element_Array) is + begin + CRC := CRC32 (CRC, Data); + end CRC32; + + ------------------ + -- Deflate_Init -- + ------------------ + + procedure Deflate_Init + (Filter : in out Filter_Type; + Level : in Compression_Level := Default_Compression; + Strategy : in Strategy_Type := Default_Strategy; + Method : in Compression_Method := Deflated; + Window_Bits : in Window_Bits_Type := Default_Window_Bits; + Memory_Level : in Memory_Level_Type := Default_Memory_Level; + Header : in Header_Type := Default) + is + use type Thin.Int; + Win_Bits : Thin.Int := Thin.Int (Window_Bits); + begin + if Is_Open (Filter) then + raise Status_Error; + end if; + + -- We allow ZLib to make header only in case of default header type. + -- Otherwise we would either do header by ourselfs, or do not do + -- header at all. + + if Header = None or else Header = GZip then + Win_Bits := -Win_Bits; + end if; + + -- For the GZip CRC calculation and make headers. + + if Header = GZip then + Filter.CRC := 0; + Filter.Offset := Simple_GZip_Header'First; + else + Filter.Offset := Simple_GZip_Header'Last + 1; + end if; + + Filter.Strm := new Z_Stream; + Filter.Compression := True; + Filter.Stream_End := False; + Filter.Header := Header; + + if Thin.Deflate_Init + (To_Thin_Access (Filter.Strm), + Level => Thin.Int (Level), + method => Thin.Int (Method), + windowBits => Win_Bits, + memLevel => Thin.Int (Memory_Level), + strategy => Thin.Int (Strategy)) /= Thin.Z_OK + then + Raise_Error (Filter.Strm.all); + end if; + end Deflate_Init; + + ----------- + -- Flush -- + ----------- + + procedure Flush + (Filter : in out Filter_Type; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode) + is + No_Data : Stream_Element_Array := (1 .. 0 => 0); + Last : Stream_Element_Offset; + begin + Translate (Filter, No_Data, Last, Out_Data, Out_Last, Flush); + end Flush; + + ----------------------- + -- Generic_Translate -- + ----------------------- + + procedure Generic_Translate + (Filter : in out ZLib.Filter_Type; + In_Buffer_Size : in Integer := Default_Buffer_Size; + Out_Buffer_Size : in Integer := Default_Buffer_Size) + is + In_Buffer : Stream_Element_Array + (1 .. Stream_Element_Offset (In_Buffer_Size)); + Out_Buffer : Stream_Element_Array + (1 .. Stream_Element_Offset (Out_Buffer_Size)); + Last : Stream_Element_Offset; + In_Last : Stream_Element_Offset; + In_First : Stream_Element_Offset; + Out_Last : Stream_Element_Offset; + begin + Main : loop + Data_In (In_Buffer, Last); + + In_First := In_Buffer'First; + + loop + Translate + (Filter => Filter, + In_Data => In_Buffer (In_First .. Last), + In_Last => In_Last, + Out_Data => Out_Buffer, + Out_Last => Out_Last, + Flush => Flush_Finish (Last < In_Buffer'First)); + + if Out_Buffer'First <= Out_Last then + Data_Out (Out_Buffer (Out_Buffer'First .. Out_Last)); + end if; + + exit Main when Stream_End (Filter); + + -- The end of in buffer. + + exit when In_Last = Last; + + In_First := In_Last + 1; + end loop; + end loop Main; + + end Generic_Translate; + + ------------------ + -- Inflate_Init -- + ------------------ + + procedure Inflate_Init + (Filter : in out Filter_Type; + Window_Bits : in Window_Bits_Type := Default_Window_Bits; + Header : in Header_Type := Default) + is + use type Thin.Int; + Win_Bits : Thin.Int := Thin.Int (Window_Bits); + + procedure Check_Version; + -- Check the latest header types compatibility. + + procedure Check_Version is + begin + if Version <= "1.1.4" then + Raise_Error + ("Inflate header type " & Header_Type'Image (Header) + & " incompatible with ZLib version " & Version); + end if; + end Check_Version; + + begin + if Is_Open (Filter) then + raise Status_Error; + end if; + + case Header is + when None => + Check_Version; + + -- Inflate data without headers determined + -- by negative Win_Bits. + + Win_Bits := -Win_Bits; + when GZip => + Check_Version; + + -- Inflate gzip data defined by flag 16. + + Win_Bits := Win_Bits + 16; + when Auto => + Check_Version; + + -- Inflate with automatic detection + -- of gzip or native header defined by flag 32. + + Win_Bits := Win_Bits + 32; + when Default => null; + end case; + + Filter.Strm := new Z_Stream; + Filter.Compression := False; + Filter.Stream_End := False; + Filter.Header := Header; + + if Thin.Inflate_Init + (To_Thin_Access (Filter.Strm), Win_Bits) /= Thin.Z_OK + then + Raise_Error (Filter.Strm.all); + end if; + end Inflate_Init; + + ------------- + -- Is_Open -- + ------------- + + function Is_Open (Filter : in Filter_Type) return Boolean is + begin + return Filter.Strm /= null; + end Is_Open; + + ----------------- + -- Raise_Error -- + ----------------- + + procedure Raise_Error (Message : in String) is + begin + Ada.Exceptions.Raise_Exception (ZLib_Error'Identity, Message); + end Raise_Error; + + procedure Raise_Error (Stream : in Z_Stream) is + begin + Raise_Error (Last_Error_Message (Stream)); + end Raise_Error; + + ---------- + -- Read -- + ---------- + + procedure Read + (Filter : in out Filter_Type; + Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode := No_Flush) + is + In_Last : Stream_Element_Offset; + Item_First : Ada.Streams.Stream_Element_Offset := Item'First; + V_Flush : Flush_Mode := Flush; + + begin + pragma Assert (Rest_First in Buffer'First .. Buffer'Last + 1); + pragma Assert (Rest_Last in Buffer'First - 1 .. Buffer'Last); + + loop + if Rest_Last = Buffer'First - 1 then + V_Flush := Finish; + + elsif Rest_First > Rest_Last then + Read (Buffer, Rest_Last); + Rest_First := Buffer'First; + + if Rest_Last < Buffer'First then + V_Flush := Finish; + end if; + end if; + + Translate + (Filter => Filter, + In_Data => Buffer (Rest_First .. Rest_Last), + In_Last => In_Last, + Out_Data => Item (Item_First .. Item'Last), + Out_Last => Last, + Flush => V_Flush); + + Rest_First := In_Last + 1; + + exit when Stream_End (Filter) + or else Last = Item'Last + or else (Last >= Item'First and then Allow_Read_Some); + + Item_First := Last + 1; + end loop; + end Read; + + ---------------- + -- Stream_End -- + ---------------- + + function Stream_End (Filter : in Filter_Type) return Boolean is + begin + if Filter.Header = GZip and Filter.Compression then + return Filter.Stream_End + and then Filter.Offset = Footer_Array'Last + 1; + else + return Filter.Stream_End; + end if; + end Stream_End; + + -------------- + -- Total_In -- + -------------- + + function Total_In (Filter : in Filter_Type) return Count is + begin + return Count (Thin.Total_In (To_Thin_Access (Filter.Strm).all)); + end Total_In; + + --------------- + -- Total_Out -- + --------------- + + function Total_Out (Filter : in Filter_Type) return Count is + begin + return Count (Thin.Total_Out (To_Thin_Access (Filter.Strm).all)); + end Total_Out; + + --------------- + -- Translate -- + --------------- + + procedure Translate + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode) is + begin + if Filter.Header = GZip and then Filter.Compression then + Translate_GZip + (Filter => Filter, + In_Data => In_Data, + In_Last => In_Last, + Out_Data => Out_Data, + Out_Last => Out_Last, + Flush => Flush); + else + Translate_Auto + (Filter => Filter, + In_Data => In_Data, + In_Last => In_Last, + Out_Data => Out_Data, + Out_Last => Out_Last, + Flush => Flush); + end if; + end Translate; + + -------------------- + -- Translate_Auto -- + -------------------- + + procedure Translate_Auto + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode) + is + use type Thin.Int; + Code : Thin.Int; + + begin + if not Is_Open (Filter) then + raise Status_Error; + end if; + + if Out_Data'Length = 0 and then In_Data'Length = 0 then + raise Constraint_Error; + end if; + + Set_Out (Filter.Strm.all, Out_Data'Address, Out_Data'Length); + Set_In (Filter.Strm.all, In_Data'Address, In_Data'Length); + + Code := Flate (Filter.Compression).Step + (To_Thin_Access (Filter.Strm), + Thin.Int (Flush)); + + if Code = Thin.Z_STREAM_END then + Filter.Stream_End := True; + else + Check_Error (Filter.Strm.all, Code); + end if; + + In_Last := In_Data'Last + - Stream_Element_Offset (Avail_In (Filter.Strm.all)); + Out_Last := Out_Data'Last + - Stream_Element_Offset (Avail_Out (Filter.Strm.all)); + end Translate_Auto; + + -------------------- + -- Translate_GZip -- + -------------------- + + procedure Translate_GZip + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode) + is + Out_First : Stream_Element_Offset; + + procedure Add_Data (Data : in Stream_Element_Array); + -- Add data to stream from the Filter.Offset till necessary, + -- used for add gzip headr/footer. + + procedure Put_32 + (Item : in out Stream_Element_Array; + Data : in Unsigned_32); + pragma Inline (Put_32); + + -------------- + -- Add_Data -- + -------------- + + procedure Add_Data (Data : in Stream_Element_Array) is + Data_First : Stream_Element_Offset renames Filter.Offset; + Data_Last : Stream_Element_Offset; + Data_Len : Stream_Element_Offset; -- -1 + Out_Len : Stream_Element_Offset; -- -1 + begin + Out_First := Out_Last + 1; + + if Data_First > Data'Last then + return; + end if; + + Data_Len := Data'Last - Data_First; + Out_Len := Out_Data'Last - Out_First; + + if Data_Len <= Out_Len then + Out_Last := Out_First + Data_Len; + Data_Last := Data'Last; + else + Out_Last := Out_Data'Last; + Data_Last := Data_First + Out_Len; + end if; + + Out_Data (Out_First .. Out_Last) := Data (Data_First .. Data_Last); + + Data_First := Data_Last + 1; + Out_First := Out_Last + 1; + end Add_Data; + + ------------ + -- Put_32 -- + ------------ + + procedure Put_32 + (Item : in out Stream_Element_Array; + Data : in Unsigned_32) + is + D : Unsigned_32 := Data; + begin + for J in Item'First .. Item'First + 3 loop + Item (J) := Stream_Element (D and 16#FF#); + D := Shift_Right (D, 8); + end loop; + end Put_32; + + begin + Out_Last := Out_Data'First - 1; + + if not Filter.Stream_End then + Add_Data (Simple_GZip_Header); + + Translate_Auto + (Filter => Filter, + In_Data => In_Data, + In_Last => In_Last, + Out_Data => Out_Data (Out_First .. Out_Data'Last), + Out_Last => Out_Last, + Flush => Flush); + + CRC32 (Filter.CRC, In_Data (In_Data'First .. In_Last)); + end if; + + if Filter.Stream_End and then Out_Last <= Out_Data'Last then + -- This detection method would work only when + -- Simple_GZip_Header'Last > Footer_Array'Last + + if Filter.Offset = Simple_GZip_Header'Last + 1 then + Filter.Offset := Footer_Array'First; + end if; + + declare + Footer : Footer_Array; + begin + Put_32 (Footer, Filter.CRC); + Put_32 (Footer (Footer'First + 4 .. Footer'Last), + Unsigned_32 (Total_In (Filter))); + Add_Data (Footer); + end; + end if; + end Translate_GZip; + + ------------- + -- Version -- + ------------- + + function Version return String is + begin + return Interfaces.C.Strings.Value (Thin.zlibVersion); + end Version; + + ----------- + -- Write -- + ----------- + + procedure Write + (Filter : in out Filter_Type; + Item : in Ada.Streams.Stream_Element_Array; + Flush : in Flush_Mode := No_Flush) + is + Buffer : Stream_Element_Array (1 .. Buffer_Size); + In_Last : Stream_Element_Offset; + Out_Last : Stream_Element_Offset; + In_First : Stream_Element_Offset := Item'First; + begin + if Item'Length = 0 and Flush = No_Flush then + return; + end if; + + loop + Translate + (Filter => Filter, + In_Data => Item (In_First .. Item'Last), + In_Last => In_Last, + Out_Data => Buffer, + Out_Last => Out_Last, + Flush => Flush); + + if Out_Last >= Buffer'First then + Write (Buffer (1 .. Out_Last)); + end if; + + exit when In_Last = Item'Last or Stream_End (Filter); + + In_First := In_Last + 1; + end loop; + end Write; + +end ZLib; diff --git a/externe_kniznice/zlib/contrib/ada/zlib.ads b/externe_kniznice/zlib/contrib/ada/zlib.ads new file mode 100644 index 0000000..79ffc40 --- /dev/null +++ b/externe_kniznice/zlib/contrib/ada/zlib.ads @@ -0,0 +1,328 @@ +------------------------------------------------------------------------------ +-- ZLib for Ada thick binding. -- +-- -- +-- Copyright (C) 2002-2004 Dmitriy Anisimkov -- +-- -- +-- This library is free software; you can redistribute it and/or modify -- +-- it under the terms of the GNU General Public License as published by -- +-- the Free Software Foundation; either version 2 of the License, or (at -- +-- your option) any later version. -- +-- -- +-- This library 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. See the GNU -- +-- General Public License for more details. -- +-- -- +-- You should have received a copy of the GNU General Public License -- +-- along with this library; if not, write to the Free Software Foundation, -- +-- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -- +-- -- +-- As a special exception, if other files instantiate generics from this -- +-- unit, or you link this unit with other files to produce an executable, -- +-- this unit does not by itself cause the resulting executable to be -- +-- covered by the GNU General Public License. This exception does not -- +-- however invalidate any other reasons why the executable file might be -- +-- covered by the GNU Public License. -- +------------------------------------------------------------------------------ + +-- $Id: zlib.ads,v 1.26 2004/09/06 06:53:19 vagul Exp $ + +with Ada.Streams; + +with Interfaces; + +package ZLib is + + ZLib_Error : exception; + Status_Error : exception; + + type Compression_Level is new Integer range -1 .. 9; + + type Flush_Mode is private; + + type Compression_Method is private; + + type Window_Bits_Type is new Integer range 8 .. 15; + + type Memory_Level_Type is new Integer range 1 .. 9; + + type Unsigned_32 is new Interfaces.Unsigned_32; + + type Strategy_Type is private; + + type Header_Type is (None, Auto, Default, GZip); + -- Header type usage have a some limitation for inflate. + -- See comment for Inflate_Init. + + subtype Count is Ada.Streams.Stream_Element_Count; + + Default_Memory_Level : constant Memory_Level_Type := 8; + Default_Window_Bits : constant Window_Bits_Type := 15; + + ---------------------------------- + -- Compression method constants -- + ---------------------------------- + + Deflated : constant Compression_Method; + -- Only one method allowed in this ZLib version + + --------------------------------- + -- Compression level constants -- + --------------------------------- + + No_Compression : constant Compression_Level := 0; + Best_Speed : constant Compression_Level := 1; + Best_Compression : constant Compression_Level := 9; + Default_Compression : constant Compression_Level := -1; + + -------------------------- + -- Flush mode constants -- + -------------------------- + + No_Flush : constant Flush_Mode; + -- Regular way for compression, no flush + + Partial_Flush : constant Flush_Mode; + -- Will be removed, use Z_SYNC_FLUSH instead + + Sync_Flush : constant Flush_Mode; + -- All pending output is flushed to the output buffer and the output + -- is aligned on a byte boundary, so that the decompressor can get all + -- input data available so far. (In particular avail_in is zero after the + -- call if enough output space has been provided before the call.) + -- Flushing may degrade compression for some compression algorithms and so + -- it should be used only when necessary. + + Block_Flush : constant Flush_Mode; + -- Z_BLOCK requests that inflate() stop + -- if and when it get to the next deflate block boundary. When decoding the + -- zlib or gzip format, this will cause inflate() to return immediately + -- after the header and before the first block. When doing a raw inflate, + -- inflate() will go ahead and process the first block, and will return + -- when it gets to the end of that block, or when it runs out of data. + + Full_Flush : constant Flush_Mode; + -- All output is flushed as with SYNC_FLUSH, and the compression state + -- is reset so that decompression can restart from this point if previous + -- compressed data has been damaged or if random access is desired. Using + -- Full_Flush too often can seriously degrade the compression. + + Finish : constant Flush_Mode; + -- Just for tell the compressor that input data is complete. + + ------------------------------------ + -- Compression strategy constants -- + ------------------------------------ + + -- RLE stategy could be used only in version 1.2.0 and later. + + Filtered : constant Strategy_Type; + Huffman_Only : constant Strategy_Type; + RLE : constant Strategy_Type; + Default_Strategy : constant Strategy_Type; + + Default_Buffer_Size : constant := 4096; + + type Filter_Type is tagged limited private; + -- The filter is for compression and for decompression. + -- The usage of the type is depend of its initialization. + + function Version return String; + pragma Inline (Version); + -- Return string representation of the ZLib version. + + procedure Deflate_Init + (Filter : in out Filter_Type; + Level : in Compression_Level := Default_Compression; + Strategy : in Strategy_Type := Default_Strategy; + Method : in Compression_Method := Deflated; + Window_Bits : in Window_Bits_Type := Default_Window_Bits; + Memory_Level : in Memory_Level_Type := Default_Memory_Level; + Header : in Header_Type := Default); + -- Compressor initialization. + -- When Header parameter is Auto or Default, then default zlib header + -- would be provided for compressed data. + -- When Header is GZip, then gzip header would be set instead of + -- default header. + -- When Header is None, no header would be set for compressed data. + + procedure Inflate_Init + (Filter : in out Filter_Type; + Window_Bits : in Window_Bits_Type := Default_Window_Bits; + Header : in Header_Type := Default); + -- Decompressor initialization. + -- Default header type mean that ZLib default header is expecting in the + -- input compressed stream. + -- Header type None mean that no header is expecting in the input stream. + -- GZip header type mean that GZip header is expecting in the + -- input compressed stream. + -- Auto header type mean that header type (GZip or Native) would be + -- detected automatically in the input stream. + -- Note that header types parameter values None, GZip and Auto are + -- supported for inflate routine only in ZLib versions 1.2.0.2 and later. + -- Deflate_Init is supporting all header types. + + function Is_Open (Filter : in Filter_Type) return Boolean; + pragma Inline (Is_Open); + -- Is the filter opened for compression or decompression. + + procedure Close + (Filter : in out Filter_Type; + Ignore_Error : in Boolean := False); + -- Closing the compression or decompressor. + -- If stream is closing before the complete and Ignore_Error is False, + -- The exception would be raised. + + generic + with procedure Data_In + (Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset); + with procedure Data_Out + (Item : in Ada.Streams.Stream_Element_Array); + procedure Generic_Translate + (Filter : in out Filter_Type; + In_Buffer_Size : in Integer := Default_Buffer_Size; + Out_Buffer_Size : in Integer := Default_Buffer_Size); + -- Compress/decompress data fetch from Data_In routine and pass the result + -- to the Data_Out routine. User should provide Data_In and Data_Out + -- for compression/decompression data flow. + -- Compression or decompression depend on Filter initialization. + + function Total_In (Filter : in Filter_Type) return Count; + pragma Inline (Total_In); + -- Returns total number of input bytes read so far + + function Total_Out (Filter : in Filter_Type) return Count; + pragma Inline (Total_Out); + -- Returns total number of bytes output so far + + function CRC32 + (CRC : in Unsigned_32; + Data : in Ada.Streams.Stream_Element_Array) + return Unsigned_32; + pragma Inline (CRC32); + -- Compute CRC32, it could be necessary for make gzip format + + procedure CRC32 + (CRC : in out Unsigned_32; + Data : in Ada.Streams.Stream_Element_Array); + pragma Inline (CRC32); + -- Compute CRC32, it could be necessary for make gzip format + + ------------------------------------------------- + -- Below is more complex low level routines. -- + ------------------------------------------------- + + procedure Translate + (Filter : in out Filter_Type; + In_Data : in Ada.Streams.Stream_Element_Array; + In_Last : out Ada.Streams.Stream_Element_Offset; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode); + -- Compress/decompress the In_Data buffer and place the result into + -- Out_Data. In_Last is the index of last element from In_Data accepted by + -- the Filter. Out_Last is the last element of the received data from + -- Filter. To tell the filter that incoming data are complete put the + -- Flush parameter to Finish. + + function Stream_End (Filter : in Filter_Type) return Boolean; + pragma Inline (Stream_End); + -- Return the true when the stream is complete. + + procedure Flush + (Filter : in out Filter_Type; + Out_Data : out Ada.Streams.Stream_Element_Array; + Out_Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode); + pragma Inline (Flush); + -- Flushing the data from the compressor. + + generic + with procedure Write + (Item : in Ada.Streams.Stream_Element_Array); + -- User should provide this routine for accept + -- compressed/decompressed data. + + Buffer_Size : in Ada.Streams.Stream_Element_Offset + := Default_Buffer_Size; + -- Buffer size for Write user routine. + + procedure Write + (Filter : in out Filter_Type; + Item : in Ada.Streams.Stream_Element_Array; + Flush : in Flush_Mode := No_Flush); + -- Compress/Decompress data from Item to the generic parameter procedure + -- Write. Output buffer size could be set in Buffer_Size generic parameter. + + generic + with procedure Read + (Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset); + -- User should provide data for compression/decompression + -- thru this routine. + + Buffer : in out Ada.Streams.Stream_Element_Array; + -- Buffer for keep remaining data from the previous + -- back read. + + Rest_First, Rest_Last : in out Ada.Streams.Stream_Element_Offset; + -- Rest_First have to be initialized to Buffer'Last + 1 + -- Rest_Last have to be initialized to Buffer'Last + -- before usage. + + Allow_Read_Some : in Boolean := False; + -- Is it allowed to return Last < Item'Last before end of data. + + procedure Read + (Filter : in out Filter_Type; + Item : out Ada.Streams.Stream_Element_Array; + Last : out Ada.Streams.Stream_Element_Offset; + Flush : in Flush_Mode := No_Flush); + -- Compress/Decompress data from generic parameter procedure Read to the + -- Item. User should provide Buffer and initialized Rest_First, Rest_Last + -- indicators. If Allow_Read_Some is True, Read routines could return + -- Last < Item'Last only at end of stream. + +private + + use Ada.Streams; + + pragma Assert (Ada.Streams.Stream_Element'Size = 8); + pragma Assert (Ada.Streams.Stream_Element'Modulus = 2**8); + + type Flush_Mode is new Integer range 0 .. 5; + + type Compression_Method is new Integer range 8 .. 8; + + type Strategy_Type is new Integer range 0 .. 3; + + No_Flush : constant Flush_Mode := 0; + Partial_Flush : constant Flush_Mode := 1; + Sync_Flush : constant Flush_Mode := 2; + Full_Flush : constant Flush_Mode := 3; + Finish : constant Flush_Mode := 4; + Block_Flush : constant Flush_Mode := 5; + + Filtered : constant Strategy_Type := 1; + Huffman_Only : constant Strategy_Type := 2; + RLE : constant Strategy_Type := 3; + Default_Strategy : constant Strategy_Type := 0; + + Deflated : constant Compression_Method := 8; + + type Z_Stream; + + type Z_Stream_Access is access all Z_Stream; + + type Filter_Type is tagged limited record + Strm : Z_Stream_Access; + Compression : Boolean; + Stream_End : Boolean; + Header : Header_Type; + CRC : Unsigned_32; + Offset : Stream_Element_Offset; + -- Offset for gzip header/footer output. + end record; + +end ZLib; diff --git a/externe_kniznice/zlib/contrib/ada/zlib.gpr b/externe_kniznice/zlib/contrib/ada/zlib.gpr new file mode 100644 index 0000000..296b22a --- /dev/null +++ b/externe_kniznice/zlib/contrib/ada/zlib.gpr @@ -0,0 +1,20 @@ +project Zlib is + + for Languages use ("Ada"); + for Source_Dirs use ("."); + for Object_Dir use "."; + for Main use ("test.adb", "mtest.adb", "read.adb", "buffer_demo"); + + package Compiler is + for Default_Switches ("ada") use ("-gnatwcfilopru", "-gnatVcdfimorst", "-gnatyabcefhiklmnoprst"); + end Compiler; + + package Linker is + for Default_Switches ("ada") use ("-lz"); + end Linker; + + package Builder is + for Default_Switches ("ada") use ("-s", "-gnatQ"); + end Builder; + +end Zlib; diff --git a/externe_kniznice/zlib/contrib/amd64/amd64-match.S b/externe_kniznice/zlib/contrib/amd64/amd64-match.S new file mode 100644 index 0000000..81d4a1c --- /dev/null +++ b/externe_kniznice/zlib/contrib/amd64/amd64-match.S @@ -0,0 +1,452 @@ +/* + * match.S -- optimized version of longest_match() + * based on the similar work by Gilles Vollant, and Brian Raiter, written 1998 + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the BSD License. Use by owners of Che Guevarra + * parafernalia is prohibited, where possible, and highly discouraged + * elsewhere. + */ + +#ifndef NO_UNDERLINE +# define match_init _match_init +# define longest_match _longest_match +#endif + +#define scanend ebx +#define scanendw bx +#define chainlenwmask edx /* high word: current chain len low word: s->wmask */ +#define curmatch rsi +#define curmatchd esi +#define windowbestlen r8 +#define scanalign r9 +#define scanalignd r9d +#define window r10 +#define bestlen r11 +#define bestlend r11d +#define scanstart r12d +#define scanstartw r12w +#define scan r13 +#define nicematch r14d +#define limit r15 +#define limitd r15d +#define prev rcx + +/* + * The 258 is a "magic number, not a parameter -- changing it + * breaks the hell loose + */ +#define MAX_MATCH (258) +#define MIN_MATCH (3) +#define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1) +#define MAX_MATCH_8 ((MAX_MATCH + 7) & ~7) + +/* stack frame offsets */ +#define LocalVarsSize (112) +#define _chainlenwmask ( 8-LocalVarsSize)(%rsp) +#define _windowbestlen (16-LocalVarsSize)(%rsp) +#define save_r14 (24-LocalVarsSize)(%rsp) +#define save_rsi (32-LocalVarsSize)(%rsp) +#define save_rbx (40-LocalVarsSize)(%rsp) +#define save_r12 (56-LocalVarsSize)(%rsp) +#define save_r13 (64-LocalVarsSize)(%rsp) +#define save_r15 (80-LocalVarsSize)(%rsp) + + +.globl match_init, longest_match + +/* + * On AMD64 the first argument of a function (in our case -- the pointer to + * deflate_state structure) is passed in %rdi, hence our offsets below are + * all off of that. + */ + +/* you can check the structure offset by running + +#include +#include +#include "deflate.h" + +void print_depl() +{ +deflate_state ds; +deflate_state *s=&ds; +printf("size pointer=%u\n",(int)sizeof(void*)); + +printf("#define dsWSize (%3u)(%%rdi)\n",(int)(((char*)&(s->w_size))-((char*)s))); +printf("#define dsWMask (%3u)(%%rdi)\n",(int)(((char*)&(s->w_mask))-((char*)s))); +printf("#define dsWindow (%3u)(%%rdi)\n",(int)(((char*)&(s->window))-((char*)s))); +printf("#define dsPrev (%3u)(%%rdi)\n",(int)(((char*)&(s->prev))-((char*)s))); +printf("#define dsMatchLen (%3u)(%%rdi)\n",(int)(((char*)&(s->match_length))-((char*)s))); +printf("#define dsPrevMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->prev_match))-((char*)s))); +printf("#define dsStrStart (%3u)(%%rdi)\n",(int)(((char*)&(s->strstart))-((char*)s))); +printf("#define dsMatchStart (%3u)(%%rdi)\n",(int)(((char*)&(s->match_start))-((char*)s))); +printf("#define dsLookahead (%3u)(%%rdi)\n",(int)(((char*)&(s->lookahead))-((char*)s))); +printf("#define dsPrevLen (%3u)(%%rdi)\n",(int)(((char*)&(s->prev_length))-((char*)s))); +printf("#define dsMaxChainLen (%3u)(%%rdi)\n",(int)(((char*)&(s->max_chain_length))-((char*)s))); +printf("#define dsGoodMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->good_match))-((char*)s))); +printf("#define dsNiceMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->nice_match))-((char*)s))); +} + +*/ + + +/* + to compile for XCode 3.2 on MacOSX x86_64 + - run "gcc -g -c -DXCODE_MAC_X64_STRUCTURE amd64-match.S" + */ + + +#ifndef CURRENT_LINX_XCODE_MAC_X64_STRUCTURE +#define dsWSize ( 68)(%rdi) +#define dsWMask ( 76)(%rdi) +#define dsWindow ( 80)(%rdi) +#define dsPrev ( 96)(%rdi) +#define dsMatchLen (144)(%rdi) +#define dsPrevMatch (148)(%rdi) +#define dsStrStart (156)(%rdi) +#define dsMatchStart (160)(%rdi) +#define dsLookahead (164)(%rdi) +#define dsPrevLen (168)(%rdi) +#define dsMaxChainLen (172)(%rdi) +#define dsGoodMatch (188)(%rdi) +#define dsNiceMatch (192)(%rdi) + +#else + +#ifndef STRUCT_OFFSET +# define STRUCT_OFFSET (0) +#endif + + +#define dsWSize ( 56 + STRUCT_OFFSET)(%rdi) +#define dsWMask ( 64 + STRUCT_OFFSET)(%rdi) +#define dsWindow ( 72 + STRUCT_OFFSET)(%rdi) +#define dsPrev ( 88 + STRUCT_OFFSET)(%rdi) +#define dsMatchLen (136 + STRUCT_OFFSET)(%rdi) +#define dsPrevMatch (140 + STRUCT_OFFSET)(%rdi) +#define dsStrStart (148 + STRUCT_OFFSET)(%rdi) +#define dsMatchStart (152 + STRUCT_OFFSET)(%rdi) +#define dsLookahead (156 + STRUCT_OFFSET)(%rdi) +#define dsPrevLen (160 + STRUCT_OFFSET)(%rdi) +#define dsMaxChainLen (164 + STRUCT_OFFSET)(%rdi) +#define dsGoodMatch (180 + STRUCT_OFFSET)(%rdi) +#define dsNiceMatch (184 + STRUCT_OFFSET)(%rdi) + +#endif + + + + +.text + +/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */ + +longest_match: +/* + * Retrieve the function arguments. %curmatch will hold cur_match + * throughout the entire function (passed via rsi on amd64). + * rdi will hold the pointer to the deflate_state (first arg on amd64) + */ + mov %rsi, save_rsi + mov %rbx, save_rbx + mov %r12, save_r12 + mov %r13, save_r13 + mov %r14, save_r14 + mov %r15, save_r15 + +/* uInt wmask = s->w_mask; */ +/* unsigned chain_length = s->max_chain_length; */ +/* if (s->prev_length >= s->good_match) { */ +/* chain_length >>= 2; */ +/* } */ + + movl dsPrevLen, %eax + movl dsGoodMatch, %ebx + cmpl %ebx, %eax + movl dsWMask, %eax + movl dsMaxChainLen, %chainlenwmask + jl LastMatchGood + shrl $2, %chainlenwmask +LastMatchGood: + +/* chainlen is decremented once beforehand so that the function can */ +/* use the sign flag instead of the zero flag for the exit test. */ +/* It is then shifted into the high word, to make room for the wmask */ +/* value, which it will always accompany. */ + + decl %chainlenwmask + shll $16, %chainlenwmask + orl %eax, %chainlenwmask + +/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; */ + + movl dsNiceMatch, %eax + movl dsLookahead, %ebx + cmpl %eax, %ebx + jl LookaheadLess + movl %eax, %ebx +LookaheadLess: movl %ebx, %nicematch + +/* register Bytef *scan = s->window + s->strstart; */ + + mov dsWindow, %window + movl dsStrStart, %limitd + lea (%limit, %window), %scan + +/* Determine how many bytes the scan ptr is off from being */ +/* dword-aligned. */ + + mov %scan, %scanalign + negl %scanalignd + andl $3, %scanalignd + +/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */ +/* s->strstart - (IPos)MAX_DIST(s) : NIL; */ + + movl dsWSize, %eax + subl $MIN_LOOKAHEAD, %eax + xorl %ecx, %ecx + subl %eax, %limitd + cmovng %ecx, %limitd + +/* int best_len = s->prev_length; */ + + movl dsPrevLen, %bestlend + +/* Store the sum of s->window + best_len in %windowbestlen locally, and in memory. */ + + lea (%window, %bestlen), %windowbestlen + mov %windowbestlen, _windowbestlen + +/* register ush scan_start = *(ushf*)scan; */ +/* register ush scan_end = *(ushf*)(scan+best_len-1); */ +/* Posf *prev = s->prev; */ + + movzwl (%scan), %scanstart + movzwl -1(%scan, %bestlen), %scanend + mov dsPrev, %prev + +/* Jump into the main loop. */ + + movl %chainlenwmask, _chainlenwmask + jmp LoopEntry + +.balign 16 + +/* do { + * match = s->window + cur_match; + * if (*(ushf*)(match+best_len-1) != scan_end || + * *(ushf*)match != scan_start) continue; + * [...] + * } while ((cur_match = prev[cur_match & wmask]) > limit + * && --chain_length != 0); + * + * Here is the inner loop of the function. The function will spend the + * majority of its time in this loop, and majority of that time will + * be spent in the first ten instructions. + */ +LookupLoop: + andl %chainlenwmask, %curmatchd + movzwl (%prev, %curmatch, 2), %curmatchd + cmpl %limitd, %curmatchd + jbe LeaveNow + subl $0x00010000, %chainlenwmask + js LeaveNow +LoopEntry: cmpw -1(%windowbestlen, %curmatch), %scanendw + jne LookupLoop + cmpw %scanstartw, (%window, %curmatch) + jne LookupLoop + +/* Store the current value of chainlen. */ + movl %chainlenwmask, _chainlenwmask + +/* %scan is the string under scrutiny, and %prev to the string we */ +/* are hoping to match it up with. In actuality, %esi and %edi are */ +/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */ +/* initialized to -(MAX_MATCH_8 - scanalign). */ + + mov $(-MAX_MATCH_8), %rdx + lea (%curmatch, %window), %windowbestlen + lea MAX_MATCH_8(%windowbestlen, %scanalign), %windowbestlen + lea MAX_MATCH_8(%scan, %scanalign), %prev + +/* the prefetching below makes very little difference... */ + prefetcht1 (%windowbestlen, %rdx) + prefetcht1 (%prev, %rdx) + +/* + * Test the strings for equality, 8 bytes at a time. At the end, + * adjust %rdx so that it is offset to the exact byte that mismatched. + * + * It should be confessed that this loop usually does not represent + * much of the total running time. Replacing it with a more + * straightforward "rep cmpsb" would not drastically degrade + * performance -- unrolling it, for example, makes no difference. + */ + +#undef USE_SSE /* works, but is 6-7% slower, than non-SSE... */ + +LoopCmps: +#ifdef USE_SSE + /* Preload the SSE registers */ + movdqu (%windowbestlen, %rdx), %xmm1 + movdqu (%prev, %rdx), %xmm2 + pcmpeqb %xmm2, %xmm1 + movdqu 16(%windowbestlen, %rdx), %xmm3 + movdqu 16(%prev, %rdx), %xmm4 + pcmpeqb %xmm4, %xmm3 + movdqu 32(%windowbestlen, %rdx), %xmm5 + movdqu 32(%prev, %rdx), %xmm6 + pcmpeqb %xmm6, %xmm5 + movdqu 48(%windowbestlen, %rdx), %xmm7 + movdqu 48(%prev, %rdx), %xmm8 + pcmpeqb %xmm8, %xmm7 + + /* Check the comparisions' results */ + pmovmskb %xmm1, %rax + notw %ax + bsfw %ax, %ax + jnz LeaveLoopCmps + + /* this is the only iteration of the loop with a possibility of having + incremented rdx by 0x108 (each loop iteration add 16*4 = 0x40 + and (0x40*4)+8=0x108 */ + add $8, %rdx + jz LenMaximum + add $8, %rdx + + + pmovmskb %xmm3, %rax + notw %ax + bsfw %ax, %ax + jnz LeaveLoopCmps + + + add $16, %rdx + + + pmovmskb %xmm5, %rax + notw %ax + bsfw %ax, %ax + jnz LeaveLoopCmps + + add $16, %rdx + + + pmovmskb %xmm7, %rax + notw %ax + bsfw %ax, %ax + jnz LeaveLoopCmps + + add $16, %rdx + + jmp LoopCmps +LeaveLoopCmps: add %rax, %rdx +#else + mov (%windowbestlen, %rdx), %rax + xor (%prev, %rdx), %rax + jnz LeaveLoopCmps + + mov 8(%windowbestlen, %rdx), %rax + xor 8(%prev, %rdx), %rax + jnz LeaveLoopCmps8 + + mov 16(%windowbestlen, %rdx), %rax + xor 16(%prev, %rdx), %rax + jnz LeaveLoopCmps16 + + add $24, %rdx + jnz LoopCmps + jmp LenMaximum +# if 0 +/* + * This three-liner is tantalizingly simple, but bsf is a slow instruction, + * and the complicated alternative down below is quite a bit faster. Sad... + */ + +LeaveLoopCmps: bsf %rax, %rax /* find the first non-zero bit */ + shrl $3, %eax /* divide by 8 to get the byte */ + add %rax, %rdx +# else +LeaveLoopCmps16: + add $8, %rdx +LeaveLoopCmps8: + add $8, %rdx +LeaveLoopCmps: testl $0xFFFFFFFF, %eax /* Check the first 4 bytes */ + jnz Check16 + add $4, %rdx + shr $32, %rax +Check16: testw $0xFFFF, %ax + jnz LenLower + add $2, %rdx + shrl $16, %eax +LenLower: subb $1, %al + adc $0, %rdx +# endif +#endif + +/* Calculate the length of the match. If it is longer than MAX_MATCH, */ +/* then automatically accept it as the best possible match and leave. */ + + lea (%prev, %rdx), %rax + sub %scan, %rax + cmpl $MAX_MATCH, %eax + jge LenMaximum + +/* If the length of the match is not longer than the best match we */ +/* have so far, then forget it and return to the lookup loop. */ + + cmpl %bestlend, %eax + jg LongerMatch + mov _windowbestlen, %windowbestlen + mov dsPrev, %prev + movl _chainlenwmask, %edx + jmp LookupLoop + +/* s->match_start = cur_match; */ +/* best_len = len; */ +/* if (len >= nice_match) break; */ +/* scan_end = *(ushf*)(scan+best_len-1); */ + +LongerMatch: + movl %eax, %bestlend + movl %curmatchd, dsMatchStart + cmpl %nicematch, %eax + jge LeaveNow + + lea (%window, %bestlen), %windowbestlen + mov %windowbestlen, _windowbestlen + + movzwl -1(%scan, %rax), %scanend + mov dsPrev, %prev + movl _chainlenwmask, %chainlenwmask + jmp LookupLoop + +/* Accept the current string, with the maximum possible length. */ + +LenMaximum: + movl $MAX_MATCH, %bestlend + movl %curmatchd, dsMatchStart + +/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */ +/* return s->lookahead; */ + +LeaveNow: + movl dsLookahead, %eax + cmpl %eax, %bestlend + cmovngl %bestlend, %eax +LookaheadRet: + +/* Restore the registers and return from whence we came. */ + + mov save_rsi, %rsi + mov save_rbx, %rbx + mov save_r12, %r12 + mov save_r13, %r13 + mov save_r14, %r14 + mov save_r15, %r15 + + ret + +match_init: ret diff --git a/externe_kniznice/zlib/contrib/asm686/README.686 b/externe_kniznice/zlib/contrib/asm686/README.686 new file mode 100644 index 0000000..a0bf3be --- /dev/null +++ b/externe_kniznice/zlib/contrib/asm686/README.686 @@ -0,0 +1,51 @@ +This is a patched version of zlib, modified to use +Pentium-Pro-optimized assembly code in the deflation algorithm. The +files changed/added by this patch are: + +README.686 +match.S + +The speedup that this patch provides varies, depending on whether the +compiler used to build the original version of zlib falls afoul of the +PPro's speed traps. My own tests show a speedup of around 10-20% at +the default compression level, and 20-30% using -9, against a version +compiled using gcc 2.7.2.3. Your mileage may vary. + +Note that this code has been tailored for the PPro/PII in particular, +and will not perform particuarly well on a Pentium. + +If you are using an assembler other than GNU as, you will have to +translate match.S to use your assembler's syntax. (Have fun.) + +Brian Raiter +breadbox@muppetlabs.com +April, 1998 + + +Added for zlib 1.1.3: + +The patches come from +http://www.muppetlabs.com/~breadbox/software/assembly.html + +To compile zlib with this asm file, copy match.S to the zlib directory +then do: + +CFLAGS="-O3 -DASMV" ./configure +make OBJA=match.o + + +Update: + +I've been ignoring these assembly routines for years, believing that +gcc's generated code had caught up with it sometime around gcc 2.95 +and the major rearchitecting of the Pentium 4. However, I recently +learned that, despite what I believed, this code still has some life +in it. On the Pentium 4 and AMD64 chips, it continues to run about 8% +faster than the code produced by gcc 4.1. + +In acknowledgement of its continuing usefulness, I've altered the +license to match that of the rest of zlib. Share and Enjoy! + +Brian Raiter +breadbox@muppetlabs.com +April, 2007 diff --git a/externe_kniznice/zlib/contrib/asm686/match.S b/externe_kniznice/zlib/contrib/asm686/match.S new file mode 100644 index 0000000..fa42109 --- /dev/null +++ b/externe_kniznice/zlib/contrib/asm686/match.S @@ -0,0 +1,357 @@ +/* match.S -- x86 assembly version of the zlib longest_match() function. + * Optimized for the Intel 686 chips (PPro and later). + * + * Copyright (C) 1998, 2007 Brian Raiter + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the author be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + */ + +#ifndef NO_UNDERLINE +#define match_init _match_init +#define longest_match _longest_match +#endif + +#define MAX_MATCH (258) +#define MIN_MATCH (3) +#define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1) +#define MAX_MATCH_8 ((MAX_MATCH + 7) & ~7) + +/* stack frame offsets */ + +#define chainlenwmask 0 /* high word: current chain len */ + /* low word: s->wmask */ +#define window 4 /* local copy of s->window */ +#define windowbestlen 8 /* s->window + bestlen */ +#define scanstart 16 /* first two bytes of string */ +#define scanend 12 /* last two bytes of string */ +#define scanalign 20 /* dword-misalignment of string */ +#define nicematch 24 /* a good enough match size */ +#define bestlen 28 /* size of best match so far */ +#define scan 32 /* ptr to string wanting match */ + +#define LocalVarsSize (36) +/* saved ebx 36 */ +/* saved edi 40 */ +/* saved esi 44 */ +/* saved ebp 48 */ +/* return address 52 */ +#define deflatestate 56 /* the function arguments */ +#define curmatch 60 + +/* All the +zlib1222add offsets are due to the addition of fields + * in zlib in the deflate_state structure since the asm code was first written + * (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). + * (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). + * if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). + */ + +#define zlib1222add (8) + +#define dsWSize (36+zlib1222add) +#define dsWMask (44+zlib1222add) +#define dsWindow (48+zlib1222add) +#define dsPrev (56+zlib1222add) +#define dsMatchLen (88+zlib1222add) +#define dsPrevMatch (92+zlib1222add) +#define dsStrStart (100+zlib1222add) +#define dsMatchStart (104+zlib1222add) +#define dsLookahead (108+zlib1222add) +#define dsPrevLen (112+zlib1222add) +#define dsMaxChainLen (116+zlib1222add) +#define dsGoodMatch (132+zlib1222add) +#define dsNiceMatch (136+zlib1222add) + + +.file "match.S" + +.globl match_init, longest_match + +.text + +/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */ +.cfi_sections .debug_frame + +longest_match: + +.cfi_startproc +/* Save registers that the compiler may be using, and adjust %esp to */ +/* make room for our stack frame. */ + + pushl %ebp + .cfi_def_cfa_offset 8 + .cfi_offset ebp, -8 + pushl %edi + .cfi_def_cfa_offset 12 + pushl %esi + .cfi_def_cfa_offset 16 + pushl %ebx + .cfi_def_cfa_offset 20 + subl $LocalVarsSize, %esp + .cfi_def_cfa_offset LocalVarsSize+20 + +/* Retrieve the function arguments. %ecx will hold cur_match */ +/* throughout the entire function. %edx will hold the pointer to the */ +/* deflate_state structure during the function's setup (before */ +/* entering the main loop). */ + + movl deflatestate(%esp), %edx + movl curmatch(%esp), %ecx + +/* uInt wmask = s->w_mask; */ +/* unsigned chain_length = s->max_chain_length; */ +/* if (s->prev_length >= s->good_match) { */ +/* chain_length >>= 2; */ +/* } */ + + movl dsPrevLen(%edx), %eax + movl dsGoodMatch(%edx), %ebx + cmpl %ebx, %eax + movl dsWMask(%edx), %eax + movl dsMaxChainLen(%edx), %ebx + jl LastMatchGood + shrl $2, %ebx +LastMatchGood: + +/* chainlen is decremented once beforehand so that the function can */ +/* use the sign flag instead of the zero flag for the exit test. */ +/* It is then shifted into the high word, to make room for the wmask */ +/* value, which it will always accompany. */ + + decl %ebx + shll $16, %ebx + orl %eax, %ebx + movl %ebx, chainlenwmask(%esp) + +/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; */ + + movl dsNiceMatch(%edx), %eax + movl dsLookahead(%edx), %ebx + cmpl %eax, %ebx + jl LookaheadLess + movl %eax, %ebx +LookaheadLess: movl %ebx, nicematch(%esp) + +/* register Bytef *scan = s->window + s->strstart; */ + + movl dsWindow(%edx), %esi + movl %esi, window(%esp) + movl dsStrStart(%edx), %ebp + lea (%esi,%ebp), %edi + movl %edi, scan(%esp) + +/* Determine how many bytes the scan ptr is off from being */ +/* dword-aligned. */ + + movl %edi, %eax + negl %eax + andl $3, %eax + movl %eax, scanalign(%esp) + +/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */ +/* s->strstart - (IPos)MAX_DIST(s) : NIL; */ + + movl dsWSize(%edx), %eax + subl $MIN_LOOKAHEAD, %eax + subl %eax, %ebp + jg LimitPositive + xorl %ebp, %ebp +LimitPositive: + +/* int best_len = s->prev_length; */ + + movl dsPrevLen(%edx), %eax + movl %eax, bestlen(%esp) + +/* Store the sum of s->window + best_len in %esi locally, and in %esi. */ + + addl %eax, %esi + movl %esi, windowbestlen(%esp) + +/* register ush scan_start = *(ushf*)scan; */ +/* register ush scan_end = *(ushf*)(scan+best_len-1); */ +/* Posf *prev = s->prev; */ + + movzwl (%edi), %ebx + movl %ebx, scanstart(%esp) + movzwl -1(%edi,%eax), %ebx + movl %ebx, scanend(%esp) + movl dsPrev(%edx), %edi + +/* Jump into the main loop. */ + + movl chainlenwmask(%esp), %edx + jmp LoopEntry + +.balign 16 + +/* do { + * match = s->window + cur_match; + * if (*(ushf*)(match+best_len-1) != scan_end || + * *(ushf*)match != scan_start) continue; + * [...] + * } while ((cur_match = prev[cur_match & wmask]) > limit + * && --chain_length != 0); + * + * Here is the inner loop of the function. The function will spend the + * majority of its time in this loop, and majority of that time will + * be spent in the first ten instructions. + * + * Within this loop: + * %ebx = scanend + * %ecx = curmatch + * %edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) + * %esi = windowbestlen - i.e., (window + bestlen) + * %edi = prev + * %ebp = limit + */ +LookupLoop: + andl %edx, %ecx + movzwl (%edi,%ecx,2), %ecx + cmpl %ebp, %ecx + jbe LeaveNow + subl $0x00010000, %edx + js LeaveNow +LoopEntry: movzwl -1(%esi,%ecx), %eax + cmpl %ebx, %eax + jnz LookupLoop + movl window(%esp), %eax + movzwl (%eax,%ecx), %eax + cmpl scanstart(%esp), %eax + jnz LookupLoop + +/* Store the current value of chainlen. */ + + movl %edx, chainlenwmask(%esp) + +/* Point %edi to the string under scrutiny, and %esi to the string we */ +/* are hoping to match it up with. In actuality, %esi and %edi are */ +/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */ +/* initialized to -(MAX_MATCH_8 - scanalign). */ + + movl window(%esp), %esi + movl scan(%esp), %edi + addl %ecx, %esi + movl scanalign(%esp), %eax + movl $(-MAX_MATCH_8), %edx + lea MAX_MATCH_8(%edi,%eax), %edi + lea MAX_MATCH_8(%esi,%eax), %esi + +/* Test the strings for equality, 8 bytes at a time. At the end, + * adjust %edx so that it is offset to the exact byte that mismatched. + * + * We already know at this point that the first three bytes of the + * strings match each other, and they can be safely passed over before + * starting the compare loop. So what this code does is skip over 0-3 + * bytes, as much as necessary in order to dword-align the %edi + * pointer. (%esi will still be misaligned three times out of four.) + * + * It should be confessed that this loop usually does not represent + * much of the total running time. Replacing it with a more + * straightforward "rep cmpsb" would not drastically degrade + * performance. + */ +LoopCmps: + movl (%esi,%edx), %eax + xorl (%edi,%edx), %eax + jnz LeaveLoopCmps + movl 4(%esi,%edx), %eax + xorl 4(%edi,%edx), %eax + jnz LeaveLoopCmps4 + addl $8, %edx + jnz LoopCmps + jmp LenMaximum +LeaveLoopCmps4: addl $4, %edx +LeaveLoopCmps: testl $0x0000FFFF, %eax + jnz LenLower + addl $2, %edx + shrl $16, %eax +LenLower: subb $1, %al + adcl $0, %edx + +/* Calculate the length of the match. If it is longer than MAX_MATCH, */ +/* then automatically accept it as the best possible match and leave. */ + + lea (%edi,%edx), %eax + movl scan(%esp), %edi + subl %edi, %eax + cmpl $MAX_MATCH, %eax + jge LenMaximum + +/* If the length of the match is not longer than the best match we */ +/* have so far, then forget it and return to the lookup loop. */ + + movl deflatestate(%esp), %edx + movl bestlen(%esp), %ebx + cmpl %ebx, %eax + jg LongerMatch + movl windowbestlen(%esp), %esi + movl dsPrev(%edx), %edi + movl scanend(%esp), %ebx + movl chainlenwmask(%esp), %edx + jmp LookupLoop + +/* s->match_start = cur_match; */ +/* best_len = len; */ +/* if (len >= nice_match) break; */ +/* scan_end = *(ushf*)(scan+best_len-1); */ + +LongerMatch: movl nicematch(%esp), %ebx + movl %eax, bestlen(%esp) + movl %ecx, dsMatchStart(%edx) + cmpl %ebx, %eax + jge LeaveNow + movl window(%esp), %esi + addl %eax, %esi + movl %esi, windowbestlen(%esp) + movzwl -1(%edi,%eax), %ebx + movl dsPrev(%edx), %edi + movl %ebx, scanend(%esp) + movl chainlenwmask(%esp), %edx + jmp LookupLoop + +/* Accept the current string, with the maximum possible length. */ + +LenMaximum: movl deflatestate(%esp), %edx + movl $MAX_MATCH, bestlen(%esp) + movl %ecx, dsMatchStart(%edx) + +/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */ +/* return s->lookahead; */ + +LeaveNow: + movl deflatestate(%esp), %edx + movl bestlen(%esp), %ebx + movl dsLookahead(%edx), %eax + cmpl %eax, %ebx + jg LookaheadRet + movl %ebx, %eax +LookaheadRet: + +/* Restore the stack and return from whence we came. */ + + addl $LocalVarsSize, %esp + .cfi_def_cfa_offset 20 + popl %ebx + .cfi_def_cfa_offset 16 + popl %esi + .cfi_def_cfa_offset 12 + popl %edi + .cfi_def_cfa_offset 8 + popl %ebp + .cfi_def_cfa_offset 4 +.cfi_endproc +match_init: ret diff --git a/externe_kniznice/zlib/contrib/blast/Makefile b/externe_kniznice/zlib/contrib/blast/Makefile new file mode 100644 index 0000000..9be80ba --- /dev/null +++ b/externe_kniznice/zlib/contrib/blast/Makefile @@ -0,0 +1,8 @@ +blast: blast.c blast.h + cc -DTEST -o blast blast.c + +test: blast + blast < test.pk | cmp - test.txt + +clean: + rm -f blast blast.o diff --git a/externe_kniznice/zlib/contrib/blast/README b/externe_kniznice/zlib/contrib/blast/README new file mode 100644 index 0000000..e3a60b3 --- /dev/null +++ b/externe_kniznice/zlib/contrib/blast/README @@ -0,0 +1,4 @@ +Read blast.h for purpose and usage. + +Mark Adler +madler@alumni.caltech.edu diff --git a/externe_kniznice/zlib/contrib/blast/blast.c b/externe_kniznice/zlib/contrib/blast/blast.c new file mode 100644 index 0000000..e6e6590 --- /dev/null +++ b/externe_kniznice/zlib/contrib/blast/blast.c @@ -0,0 +1,466 @@ +/* blast.c + * Copyright (C) 2003, 2012, 2013 Mark Adler + * For conditions of distribution and use, see copyright notice in blast.h + * version 1.3, 24 Aug 2013 + * + * blast.c decompresses data compressed by the PKWare Compression Library. + * This function provides functionality similar to the explode() function of + * the PKWare library, hence the name "blast". + * + * This decompressor is based on the excellent format description provided by + * Ben Rudiak-Gould in comp.compression on August 13, 2001. Interestingly, the + * example Ben provided in the post is incorrect. The distance 110001 should + * instead be 111000. When corrected, the example byte stream becomes: + * + * 00 04 82 24 25 8f 80 7f + * + * which decompresses to "AIAIAIAIAIAIA" (without the quotes). + */ + +/* + * Change history: + * + * 1.0 12 Feb 2003 - First version + * 1.1 16 Feb 2003 - Fixed distance check for > 4 GB uncompressed data + * 1.2 24 Oct 2012 - Add note about using binary mode in stdio + * - Fix comparisons of differently signed integers + * 1.3 24 Aug 2013 - Return unused input from blast() + * - Fix test code to correctly report unused input + * - Enable the provision of initial input to blast() + */ + +#include /* for NULL */ +#include /* for setjmp(), longjmp(), and jmp_buf */ +#include "blast.h" /* prototype for blast() */ + +#define local static /* for local function definitions */ +#define MAXBITS 13 /* maximum code length */ +#define MAXWIN 4096 /* maximum window size */ + +/* input and output state */ +struct state { + /* input state */ + blast_in infun; /* input function provided by user */ + void *inhow; /* opaque information passed to infun() */ + unsigned char *in; /* next input location */ + unsigned left; /* available input at in */ + int bitbuf; /* bit buffer */ + int bitcnt; /* number of bits in bit buffer */ + + /* input limit error return state for bits() and decode() */ + jmp_buf env; + + /* output state */ + blast_out outfun; /* output function provided by user */ + void *outhow; /* opaque information passed to outfun() */ + unsigned next; /* index of next write location in out[] */ + int first; /* true to check distances (for first 4K) */ + unsigned char out[MAXWIN]; /* output buffer and sliding window */ +}; + +/* + * Return need bits from the input stream. This always leaves less than + * eight bits in the buffer. bits() works properly for need == 0. + * + * Format notes: + * + * - Bits are stored in bytes from the least significant bit to the most + * significant bit. Therefore bits are dropped from the bottom of the bit + * buffer, using shift right, and new bytes are appended to the top of the + * bit buffer, using shift left. + */ +local int bits(struct state *s, int need) +{ + int val; /* bit accumulator */ + + /* load at least need bits into val */ + val = s->bitbuf; + while (s->bitcnt < need) { + if (s->left == 0) { + s->left = s->infun(s->inhow, &(s->in)); + if (s->left == 0) longjmp(s->env, 1); /* out of input */ + } + val |= (int)(*(s->in)++) << s->bitcnt; /* load eight bits */ + s->left--; + s->bitcnt += 8; + } + + /* drop need bits and update buffer, always zero to seven bits left */ + s->bitbuf = val >> need; + s->bitcnt -= need; + + /* return need bits, zeroing the bits above that */ + return val & ((1 << need) - 1); +} + +/* + * Huffman code decoding tables. count[1..MAXBITS] is the number of symbols of + * each length, which for a canonical code are stepped through in order. + * symbol[] are the symbol values in canonical order, where the number of + * entries is the sum of the counts in count[]. The decoding process can be + * seen in the function decode() below. + */ +struct huffman { + short *count; /* number of symbols of each length */ + short *symbol; /* canonically ordered symbols */ +}; + +/* + * Decode a code from the stream s using huffman table h. Return the symbol or + * a negative value if there is an error. If all of the lengths are zero, i.e. + * an empty code, or if the code is incomplete and an invalid code is received, + * then -9 is returned after reading MAXBITS bits. + * + * Format notes: + * + * - The codes as stored in the compressed data are bit-reversed relative to + * a simple integer ordering of codes of the same lengths. Hence below the + * bits are pulled from the compressed data one at a time and used to + * build the code value reversed from what is in the stream in order to + * permit simple integer comparisons for decoding. + * + * - The first code for the shortest length is all ones. Subsequent codes of + * the same length are simply integer decrements of the previous code. When + * moving up a length, a one bit is appended to the code. For a complete + * code, the last code of the longest length will be all zeros. To support + * this ordering, the bits pulled during decoding are inverted to apply the + * more "natural" ordering starting with all zeros and incrementing. + */ +local int decode(struct state *s, struct huffman *h) +{ + int len; /* current number of bits in code */ + int code; /* len bits being decoded */ + int first; /* first code of length len */ + int count; /* number of codes of length len */ + int index; /* index of first code of length len in symbol table */ + int bitbuf; /* bits from stream */ + int left; /* bits left in next or left to process */ + short *next; /* next number of codes */ + + bitbuf = s->bitbuf; + left = s->bitcnt; + code = first = index = 0; + len = 1; + next = h->count + 1; + while (1) { + while (left--) { + code |= (bitbuf & 1) ^ 1; /* invert code */ + bitbuf >>= 1; + count = *next++; + if (code < first + count) { /* if length len, return symbol */ + s->bitbuf = bitbuf; + s->bitcnt = (s->bitcnt - len) & 7; + return h->symbol[index + (code - first)]; + } + index += count; /* else update for next length */ + first += count; + first <<= 1; + code <<= 1; + len++; + } + left = (MAXBITS+1) - len; + if (left == 0) break; + if (s->left == 0) { + s->left = s->infun(s->inhow, &(s->in)); + if (s->left == 0) longjmp(s->env, 1); /* out of input */ + } + bitbuf = *(s->in)++; + s->left--; + if (left > 8) left = 8; + } + return -9; /* ran out of codes */ +} + +/* + * Given a list of repeated code lengths rep[0..n-1], where each byte is a + * count (high four bits + 1) and a code length (low four bits), generate the + * list of code lengths. This compaction reduces the size of the object code. + * Then given the list of code lengths length[0..n-1] representing a canonical + * Huffman code for n symbols, construct the tables required to decode those + * codes. Those tables are the number of codes of each length, and the symbols + * sorted by length, retaining their original order within each length. The + * return value is zero for a complete code set, negative for an over- + * subscribed code set, and positive for an incomplete code set. The tables + * can be used if the return value is zero or positive, but they cannot be used + * if the return value is negative. If the return value is zero, it is not + * possible for decode() using that table to return an error--any stream of + * enough bits will resolve to a symbol. If the return value is positive, then + * it is possible for decode() using that table to return an error for received + * codes past the end of the incomplete lengths. + */ +local int construct(struct huffman *h, const unsigned char *rep, int n) +{ + int symbol; /* current symbol when stepping through length[] */ + int len; /* current length when stepping through h->count[] */ + int left; /* number of possible codes left of current length */ + short offs[MAXBITS+1]; /* offsets in symbol table for each length */ + short length[256]; /* code lengths */ + + /* convert compact repeat counts into symbol bit length list */ + symbol = 0; + do { + len = *rep++; + left = (len >> 4) + 1; + len &= 15; + do { + length[symbol++] = len; + } while (--left); + } while (--n); + n = symbol; + + /* count number of codes of each length */ + for (len = 0; len <= MAXBITS; len++) + h->count[len] = 0; + for (symbol = 0; symbol < n; symbol++) + (h->count[length[symbol]])++; /* assumes lengths are within bounds */ + if (h->count[0] == n) /* no codes! */ + return 0; /* complete, but decode() will fail */ + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; /* one possible code of zero length */ + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; /* one more bit, double codes left */ + left -= h->count[len]; /* deduct count from possible codes */ + if (left < 0) return left; /* over-subscribed--return negative */ + } /* left > 0 means incomplete */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + h->count[len]; + + /* + * put symbols in table sorted by length, by symbol order within each + * length + */ + for (symbol = 0; symbol < n; symbol++) + if (length[symbol] != 0) + h->symbol[offs[length[symbol]]++] = symbol; + + /* return zero for complete set, positive for incomplete set */ + return left; +} + +/* + * Decode PKWare Compression Library stream. + * + * Format notes: + * + * - First byte is 0 if literals are uncoded or 1 if they are coded. Second + * byte is 4, 5, or 6 for the number of extra bits in the distance code. + * This is the base-2 logarithm of the dictionary size minus six. + * + * - Compressed data is a combination of literals and length/distance pairs + * terminated by an end code. Literals are either Huffman coded or + * uncoded bytes. A length/distance pair is a coded length followed by a + * coded distance to represent a string that occurs earlier in the + * uncompressed data that occurs again at the current location. + * + * - A bit preceding a literal or length/distance pair indicates which comes + * next, 0 for literals, 1 for length/distance. + * + * - If literals are uncoded, then the next eight bits are the literal, in the + * normal bit order in the stream, i.e. no bit-reversal is needed. Similarly, + * no bit reversal is needed for either the length extra bits or the distance + * extra bits. + * + * - Literal bytes are simply written to the output. A length/distance pair is + * an instruction to copy previously uncompressed bytes to the output. The + * copy is from distance bytes back in the output stream, copying for length + * bytes. + * + * - Distances pointing before the beginning of the output data are not + * permitted. + * + * - Overlapped copies, where the length is greater than the distance, are + * allowed and common. For example, a distance of one and a length of 518 + * simply copies the last byte 518 times. A distance of four and a length of + * twelve copies the last four bytes three times. A simple forward copy + * ignoring whether the length is greater than the distance or not implements + * this correctly. + */ +local int decomp(struct state *s) +{ + int lit; /* true if literals are coded */ + int dict; /* log2(dictionary size) - 6 */ + int symbol; /* decoded symbol, extra bits for distance */ + int len; /* length for copy */ + unsigned dist; /* distance for copy */ + int copy; /* copy counter */ + unsigned char *from, *to; /* copy pointers */ + static int virgin = 1; /* build tables once */ + static short litcnt[MAXBITS+1], litsym[256]; /* litcode memory */ + static short lencnt[MAXBITS+1], lensym[16]; /* lencode memory */ + static short distcnt[MAXBITS+1], distsym[64]; /* distcode memory */ + static struct huffman litcode = {litcnt, litsym}; /* length code */ + static struct huffman lencode = {lencnt, lensym}; /* length code */ + static struct huffman distcode = {distcnt, distsym};/* distance code */ + /* bit lengths of literal codes */ + static const unsigned char litlen[] = { + 11, 124, 8, 7, 28, 7, 188, 13, 76, 4, 10, 8, 12, 10, 12, 10, 8, 23, 8, + 9, 7, 6, 7, 8, 7, 6, 55, 8, 23, 24, 12, 11, 7, 9, 11, 12, 6, 7, 22, 5, + 7, 24, 6, 11, 9, 6, 7, 22, 7, 11, 38, 7, 9, 8, 25, 11, 8, 11, 9, 12, + 8, 12, 5, 38, 5, 38, 5, 11, 7, 5, 6, 21, 6, 10, 53, 8, 7, 24, 10, 27, + 44, 253, 253, 253, 252, 252, 252, 13, 12, 45, 12, 45, 12, 61, 12, 45, + 44, 173}; + /* bit lengths of length codes 0..15 */ + static const unsigned char lenlen[] = {2, 35, 36, 53, 38, 23}; + /* bit lengths of distance codes 0..63 */ + static const unsigned char distlen[] = {2, 20, 53, 230, 247, 151, 248}; + static const short base[16] = { /* base for length codes */ + 3, 2, 4, 5, 6, 7, 8, 9, 10, 12, 16, 24, 40, 72, 136, 264}; + static const char extra[16] = { /* extra bits for length codes */ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8}; + + /* set up decoding tables (once--might not be thread-safe) */ + if (virgin) { + construct(&litcode, litlen, sizeof(litlen)); + construct(&lencode, lenlen, sizeof(lenlen)); + construct(&distcode, distlen, sizeof(distlen)); + virgin = 0; + } + + /* read header */ + lit = bits(s, 8); + if (lit > 1) return -1; + dict = bits(s, 8); + if (dict < 4 || dict > 6) return -2; + + /* decode literals and length/distance pairs */ + do { + if (bits(s, 1)) { + /* get length */ + symbol = decode(s, &lencode); + len = base[symbol] + bits(s, extra[symbol]); + if (len == 519) break; /* end code */ + + /* get distance */ + symbol = len == 2 ? 2 : dict; + dist = decode(s, &distcode) << symbol; + dist += bits(s, symbol); + dist++; + if (s->first && dist > s->next) + return -3; /* distance too far back */ + + /* copy length bytes from distance bytes back */ + do { + to = s->out + s->next; + from = to - dist; + copy = MAXWIN; + if (s->next < dist) { + from += copy; + copy = dist; + } + copy -= s->next; + if (copy > len) copy = len; + len -= copy; + s->next += copy; + do { + *to++ = *from++; + } while (--copy); + if (s->next == MAXWIN) { + if (s->outfun(s->outhow, s->out, s->next)) return 1; + s->next = 0; + s->first = 0; + } + } while (len != 0); + } + else { + /* get literal and write it */ + symbol = lit ? decode(s, &litcode) : bits(s, 8); + s->out[s->next++] = symbol; + if (s->next == MAXWIN) { + if (s->outfun(s->outhow, s->out, s->next)) return 1; + s->next = 0; + s->first = 0; + } + } + } while (1); + return 0; +} + +/* See comments in blast.h */ +int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow, + unsigned *left, unsigned char **in) +{ + struct state s; /* input/output state */ + int err; /* return value */ + + /* initialize input state */ + s.infun = infun; + s.inhow = inhow; + if (left != NULL && *left) { + s.left = *left; + s.in = *in; + } + else + s.left = 0; + s.bitbuf = 0; + s.bitcnt = 0; + + /* initialize output state */ + s.outfun = outfun; + s.outhow = outhow; + s.next = 0; + s.first = 1; + + /* return if bits() or decode() tries to read past available input */ + if (setjmp(s.env) != 0) /* if came back here via longjmp(), */ + err = 2; /* then skip decomp(), return error */ + else + err = decomp(&s); /* decompress */ + + /* return unused input */ + if (left != NULL) + *left = s.left; + if (in != NULL) + *in = s.left ? s.in : NULL; + + /* write any leftover output and update the error code if needed */ + if (err != 1 && s.next && s.outfun(s.outhow, s.out, s.next) && err == 0) + err = 1; + return err; +} + +#ifdef TEST +/* Example of how to use blast() */ +#include +#include + +#define CHUNK 16384 + +local unsigned inf(void *how, unsigned char **buf) +{ + static unsigned char hold[CHUNK]; + + *buf = hold; + return fread(hold, 1, CHUNK, (FILE *)how); +} + +local int outf(void *how, unsigned char *buf, unsigned len) +{ + return fwrite(buf, 1, len, (FILE *)how) != len; +} + +/* Decompress a PKWare Compression Library stream from stdin to stdout */ +int main(void) +{ + int ret; + unsigned left; + + /* decompress to stdout */ + left = 0; + ret = blast(inf, stdin, outf, stdout, &left, NULL); + if (ret != 0) + fprintf(stderr, "blast error: %d\n", ret); + + /* count any leftover bytes */ + while (getchar() != EOF) + left++; + if (left) + fprintf(stderr, "blast warning: %u unused bytes of input\n", left); + + /* return blast() error code */ + return ret; +} +#endif diff --git a/externe_kniznice/zlib/contrib/blast/blast.h b/externe_kniznice/zlib/contrib/blast/blast.h new file mode 100644 index 0000000..6cf65ed --- /dev/null +++ b/externe_kniznice/zlib/contrib/blast/blast.h @@ -0,0 +1,83 @@ +/* blast.h -- interface for blast.c + Copyright (C) 2003, 2012, 2013 Mark Adler + version 1.3, 24 Aug 2013 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + + +/* + * blast() decompresses the PKWare Data Compression Library (DCL) compressed + * format. It provides the same functionality as the explode() function in + * that library. (Note: PKWare overused the "implode" verb, and the format + * used by their library implode() function is completely different and + * incompatible with the implode compression method supported by PKZIP.) + * + * The binary mode for stdio functions should be used to assure that the + * compressed data is not corrupted when read or written. For example: + * fopen(..., "rb") and fopen(..., "wb"). + */ + + +typedef unsigned (*blast_in)(void *how, unsigned char **buf); +typedef int (*blast_out)(void *how, unsigned char *buf, unsigned len); +/* Definitions for input/output functions passed to blast(). See below for + * what the provided functions need to do. + */ + + +int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow, + unsigned *left, unsigned char **in); +/* Decompress input to output using the provided infun() and outfun() calls. + * On success, the return value of blast() is zero. If there is an error in + * the source data, i.e. it is not in the proper format, then a negative value + * is returned. If there is not enough input available or there is not enough + * output space, then a positive error is returned. + * + * The input function is invoked: len = infun(how, &buf), where buf is set by + * infun() to point to the input buffer, and infun() returns the number of + * available bytes there. If infun() returns zero, then blast() returns with + * an input error. (blast() only asks for input if it needs it.) inhow is for + * use by the application to pass an input descriptor to infun(), if desired. + * + * If left and in are not NULL and *left is not zero when blast() is called, + * then the *left bytes are *in are consumed for input before infun() is used. + * + * The output function is invoked: err = outfun(how, buf, len), where the bytes + * to be written are buf[0..len-1]. If err is not zero, then blast() returns + * with an output error. outfun() is always called with len <= 4096. outhow + * is for use by the application to pass an output descriptor to outfun(), if + * desired. + * + * If there is any unused input, *left is set to the number of bytes that were + * read and *in points to them. Otherwise *left is set to zero and *in is set + * to NULL. If left or in are NULL, then they are not set. + * + * The return codes are: + * + * 2: ran out of input before completing decompression + * 1: output error before completing decompression + * 0: successful decompression + * -1: literal flag not zero or one + * -2: dictionary size not in 4..6 + * -3: distance is too far back + * + * At the bottom of blast.c is an example program that uses blast() that can be + * compiled to produce a command-line decompression filter by defining TEST. + */ diff --git a/externe_kniznice/zlib/contrib/blast/test.pk b/externe_kniznice/zlib/contrib/blast/test.pk new file mode 100644 index 0000000000000000000000000000000000000000..be10b2bbb251759ffdf6da49fadd1a3f137a54c1 GIT binary patch literal 8 PcmZQzX;M+`Z>R?V2c!aC literal 0 HcmV?d00001 diff --git a/externe_kniznice/zlib/contrib/blast/test.txt b/externe_kniznice/zlib/contrib/blast/test.txt new file mode 100644 index 0000000..bfdf1c5 --- /dev/null +++ b/externe_kniznice/zlib/contrib/blast/test.txt @@ -0,0 +1 @@ +AIAIAIAIAIAIA \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/delphi/ZLib.pas b/externe_kniznice/zlib/contrib/delphi/ZLib.pas new file mode 100644 index 0000000..060e199 --- /dev/null +++ b/externe_kniznice/zlib/contrib/delphi/ZLib.pas @@ -0,0 +1,557 @@ +{*******************************************************} +{ } +{ Borland Delphi Supplemental Components } +{ ZLIB Data Compression Interface Unit } +{ } +{ Copyright (c) 1997,99 Borland Corporation } +{ } +{*******************************************************} + +{ Updated for zlib 1.2.x by Cosmin Truta } + +unit ZLib; + +interface + +uses SysUtils, Classes; + +type + TAlloc = function (AppData: Pointer; Items, Size: Integer): Pointer; cdecl; + TFree = procedure (AppData, Block: Pointer); cdecl; + + // Internal structure. Ignore. + TZStreamRec = packed record + next_in: PChar; // next input byte + avail_in: Integer; // number of bytes available at next_in + total_in: Longint; // total nb of input bytes read so far + + next_out: PChar; // next output byte should be put here + avail_out: Integer; // remaining free space at next_out + total_out: Longint; // total nb of bytes output so far + + msg: PChar; // last error message, NULL if no error + internal: Pointer; // not visible by applications + + zalloc: TAlloc; // used to allocate the internal state + zfree: TFree; // used to free the internal state + AppData: Pointer; // private data object passed to zalloc and zfree + + data_type: Integer; // best guess about the data type: ascii or binary + adler: Longint; // adler32 value of the uncompressed data + reserved: Longint; // reserved for future use + end; + + // Abstract ancestor class + TCustomZlibStream = class(TStream) + private + FStrm: TStream; + FStrmPos: Integer; + FOnProgress: TNotifyEvent; + FZRec: TZStreamRec; + FBuffer: array [Word] of Char; + protected + procedure Progress(Sender: TObject); dynamic; + property OnProgress: TNotifyEvent read FOnProgress write FOnProgress; + constructor Create(Strm: TStream); + end; + +{ TCompressionStream compresses data on the fly as data is written to it, and + stores the compressed data to another stream. + + TCompressionStream is write-only and strictly sequential. Reading from the + stream will raise an exception. Using Seek to move the stream pointer + will raise an exception. + + Output data is cached internally, written to the output stream only when + the internal output buffer is full. All pending output data is flushed + when the stream is destroyed. + + The Position property returns the number of uncompressed bytes of + data that have been written to the stream so far. + + CompressionRate returns the on-the-fly percentage by which the original + data has been compressed: (1 - (CompressedBytes / UncompressedBytes)) * 100 + If raw data size = 100 and compressed data size = 25, the CompressionRate + is 75% + + The OnProgress event is called each time the output buffer is filled and + written to the output stream. This is useful for updating a progress + indicator when you are writing a large chunk of data to the compression + stream in a single call.} + + + TCompressionLevel = (clNone, clFastest, clDefault, clMax); + + TCompressionStream = class(TCustomZlibStream) + private + function GetCompressionRate: Single; + public + constructor Create(CompressionLevel: TCompressionLevel; Dest: TStream); + destructor Destroy; override; + function Read(var Buffer; Count: Longint): Longint; override; + function Write(const Buffer; Count: Longint): Longint; override; + function Seek(Offset: Longint; Origin: Word): Longint; override; + property CompressionRate: Single read GetCompressionRate; + property OnProgress; + end; + +{ TDecompressionStream decompresses data on the fly as data is read from it. + + Compressed data comes from a separate source stream. TDecompressionStream + is read-only and unidirectional; you can seek forward in the stream, but not + backwards. The special case of setting the stream position to zero is + allowed. Seeking forward decompresses data until the requested position in + the uncompressed data has been reached. Seeking backwards, seeking relative + to the end of the stream, requesting the size of the stream, and writing to + the stream will raise an exception. + + The Position property returns the number of bytes of uncompressed data that + have been read from the stream so far. + + The OnProgress event is called each time the internal input buffer of + compressed data is exhausted and the next block is read from the input stream. + This is useful for updating a progress indicator when you are reading a + large chunk of data from the decompression stream in a single call.} + + TDecompressionStream = class(TCustomZlibStream) + public + constructor Create(Source: TStream); + destructor Destroy; override; + function Read(var Buffer; Count: Longint): Longint; override; + function Write(const Buffer; Count: Longint): Longint; override; + function Seek(Offset: Longint; Origin: Word): Longint; override; + property OnProgress; + end; + + + +{ CompressBuf compresses data, buffer to buffer, in one call. + In: InBuf = ptr to compressed data + InBytes = number of bytes in InBuf + Out: OutBuf = ptr to newly allocated buffer containing decompressed data + OutBytes = number of bytes in OutBuf } +procedure CompressBuf(const InBuf: Pointer; InBytes: Integer; + out OutBuf: Pointer; out OutBytes: Integer); + + +{ DecompressBuf decompresses data, buffer to buffer, in one call. + In: InBuf = ptr to compressed data + InBytes = number of bytes in InBuf + OutEstimate = zero, or est. size of the decompressed data + Out: OutBuf = ptr to newly allocated buffer containing decompressed data + OutBytes = number of bytes in OutBuf } +procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer; + OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer); + +{ DecompressToUserBuf decompresses data, buffer to buffer, in one call. + In: InBuf = ptr to compressed data + InBytes = number of bytes in InBuf + Out: OutBuf = ptr to user-allocated buffer to contain decompressed data + BufSize = number of bytes in OutBuf } +procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer; + const OutBuf: Pointer; BufSize: Integer); + +const + zlib_version = '1.2.11'; + +type + EZlibError = class(Exception); + ECompressionError = class(EZlibError); + EDecompressionError = class(EZlibError); + +implementation + +uses ZLibConst; + +const + Z_NO_FLUSH = 0; + Z_PARTIAL_FLUSH = 1; + Z_SYNC_FLUSH = 2; + Z_FULL_FLUSH = 3; + Z_FINISH = 4; + + Z_OK = 0; + Z_STREAM_END = 1; + Z_NEED_DICT = 2; + Z_ERRNO = (-1); + Z_STREAM_ERROR = (-2); + Z_DATA_ERROR = (-3); + Z_MEM_ERROR = (-4); + Z_BUF_ERROR = (-5); + Z_VERSION_ERROR = (-6); + + Z_NO_COMPRESSION = 0; + Z_BEST_SPEED = 1; + Z_BEST_COMPRESSION = 9; + Z_DEFAULT_COMPRESSION = (-1); + + Z_FILTERED = 1; + Z_HUFFMAN_ONLY = 2; + Z_RLE = 3; + Z_DEFAULT_STRATEGY = 0; + + Z_BINARY = 0; + Z_ASCII = 1; + Z_UNKNOWN = 2; + + Z_DEFLATED = 8; + + +{$L adler32.obj} +{$L compress.obj} +{$L crc32.obj} +{$L deflate.obj} +{$L infback.obj} +{$L inffast.obj} +{$L inflate.obj} +{$L inftrees.obj} +{$L trees.obj} +{$L uncompr.obj} +{$L zutil.obj} + +procedure adler32; external; +procedure compressBound; external; +procedure crc32; external; +procedure deflateInit2_; external; +procedure deflateParams; external; + +function _malloc(Size: Integer): Pointer; cdecl; +begin + Result := AllocMem(Size); +end; + +procedure _free(Block: Pointer); cdecl; +begin + FreeMem(Block); +end; + +procedure _memset(P: Pointer; B: Byte; count: Integer); cdecl; +begin + FillChar(P^, count, B); +end; + +procedure _memcpy(dest, source: Pointer; count: Integer); cdecl; +begin + Move(source^, dest^, count); +end; + + + +// deflate compresses data +function deflateInit_(var strm: TZStreamRec; level: Integer; version: PChar; + recsize: Integer): Integer; external; +function deflate(var strm: TZStreamRec; flush: Integer): Integer; external; +function deflateEnd(var strm: TZStreamRec): Integer; external; + +// inflate decompresses data +function inflateInit_(var strm: TZStreamRec; version: PChar; + recsize: Integer): Integer; external; +function inflate(var strm: TZStreamRec; flush: Integer): Integer; external; +function inflateEnd(var strm: TZStreamRec): Integer; external; +function inflateReset(var strm: TZStreamRec): Integer; external; + + +function zlibAllocMem(AppData: Pointer; Items, Size: Integer): Pointer; cdecl; +begin +// GetMem(Result, Items*Size); + Result := AllocMem(Items * Size); +end; + +procedure zlibFreeMem(AppData, Block: Pointer); cdecl; +begin + FreeMem(Block); +end; + +{function zlibCheck(code: Integer): Integer; +begin + Result := code; + if code < 0 then + raise EZlibError.Create('error'); //!! +end;} + +function CCheck(code: Integer): Integer; +begin + Result := code; + if code < 0 then + raise ECompressionError.Create('error'); //!! +end; + +function DCheck(code: Integer): Integer; +begin + Result := code; + if code < 0 then + raise EDecompressionError.Create('error'); //!! +end; + +procedure CompressBuf(const InBuf: Pointer; InBytes: Integer; + out OutBuf: Pointer; out OutBytes: Integer); +var + strm: TZStreamRec; + P: Pointer; +begin + FillChar(strm, sizeof(strm), 0); + strm.zalloc := zlibAllocMem; + strm.zfree := zlibFreeMem; + OutBytes := ((InBytes + (InBytes div 10) + 12) + 255) and not 255; + GetMem(OutBuf, OutBytes); + try + strm.next_in := InBuf; + strm.avail_in := InBytes; + strm.next_out := OutBuf; + strm.avail_out := OutBytes; + CCheck(deflateInit_(strm, Z_BEST_COMPRESSION, zlib_version, sizeof(strm))); + try + while CCheck(deflate(strm, Z_FINISH)) <> Z_STREAM_END do + begin + P := OutBuf; + Inc(OutBytes, 256); + ReallocMem(OutBuf, OutBytes); + strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P))); + strm.avail_out := 256; + end; + finally + CCheck(deflateEnd(strm)); + end; + ReallocMem(OutBuf, strm.total_out); + OutBytes := strm.total_out; + except + FreeMem(OutBuf); + raise + end; +end; + + +procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer; + OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer); +var + strm: TZStreamRec; + P: Pointer; + BufInc: Integer; +begin + FillChar(strm, sizeof(strm), 0); + strm.zalloc := zlibAllocMem; + strm.zfree := zlibFreeMem; + BufInc := (InBytes + 255) and not 255; + if OutEstimate = 0 then + OutBytes := BufInc + else + OutBytes := OutEstimate; + GetMem(OutBuf, OutBytes); + try + strm.next_in := InBuf; + strm.avail_in := InBytes; + strm.next_out := OutBuf; + strm.avail_out := OutBytes; + DCheck(inflateInit_(strm, zlib_version, sizeof(strm))); + try + while DCheck(inflate(strm, Z_NO_FLUSH)) <> Z_STREAM_END do + begin + P := OutBuf; + Inc(OutBytes, BufInc); + ReallocMem(OutBuf, OutBytes); + strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P))); + strm.avail_out := BufInc; + end; + finally + DCheck(inflateEnd(strm)); + end; + ReallocMem(OutBuf, strm.total_out); + OutBytes := strm.total_out; + except + FreeMem(OutBuf); + raise + end; +end; + +procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer; + const OutBuf: Pointer; BufSize: Integer); +var + strm: TZStreamRec; +begin + FillChar(strm, sizeof(strm), 0); + strm.zalloc := zlibAllocMem; + strm.zfree := zlibFreeMem; + strm.next_in := InBuf; + strm.avail_in := InBytes; + strm.next_out := OutBuf; + strm.avail_out := BufSize; + DCheck(inflateInit_(strm, zlib_version, sizeof(strm))); + try + if DCheck(inflate(strm, Z_FINISH)) <> Z_STREAM_END then + raise EZlibError.CreateRes(@sTargetBufferTooSmall); + finally + DCheck(inflateEnd(strm)); + end; +end; + +// TCustomZlibStream + +constructor TCustomZLibStream.Create(Strm: TStream); +begin + inherited Create; + FStrm := Strm; + FStrmPos := Strm.Position; + FZRec.zalloc := zlibAllocMem; + FZRec.zfree := zlibFreeMem; +end; + +procedure TCustomZLibStream.Progress(Sender: TObject); +begin + if Assigned(FOnProgress) then FOnProgress(Sender); +end; + + +// TCompressionStream + +constructor TCompressionStream.Create(CompressionLevel: TCompressionLevel; + Dest: TStream); +const + Levels: array [TCompressionLevel] of ShortInt = + (Z_NO_COMPRESSION, Z_BEST_SPEED, Z_DEFAULT_COMPRESSION, Z_BEST_COMPRESSION); +begin + inherited Create(Dest); + FZRec.next_out := FBuffer; + FZRec.avail_out := sizeof(FBuffer); + CCheck(deflateInit_(FZRec, Levels[CompressionLevel], zlib_version, sizeof(FZRec))); +end; + +destructor TCompressionStream.Destroy; +begin + FZRec.next_in := nil; + FZRec.avail_in := 0; + try + if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos; + while (CCheck(deflate(FZRec, Z_FINISH)) <> Z_STREAM_END) + and (FZRec.avail_out = 0) do + begin + FStrm.WriteBuffer(FBuffer, sizeof(FBuffer)); + FZRec.next_out := FBuffer; + FZRec.avail_out := sizeof(FBuffer); + end; + if FZRec.avail_out < sizeof(FBuffer) then + FStrm.WriteBuffer(FBuffer, sizeof(FBuffer) - FZRec.avail_out); + finally + deflateEnd(FZRec); + end; + inherited Destroy; +end; + +function TCompressionStream.Read(var Buffer; Count: Longint): Longint; +begin + raise ECompressionError.CreateRes(@sInvalidStreamOp); +end; + +function TCompressionStream.Write(const Buffer; Count: Longint): Longint; +begin + FZRec.next_in := @Buffer; + FZRec.avail_in := Count; + if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos; + while (FZRec.avail_in > 0) do + begin + CCheck(deflate(FZRec, 0)); + if FZRec.avail_out = 0 then + begin + FStrm.WriteBuffer(FBuffer, sizeof(FBuffer)); + FZRec.next_out := FBuffer; + FZRec.avail_out := sizeof(FBuffer); + FStrmPos := FStrm.Position; + Progress(Self); + end; + end; + Result := Count; +end; + +function TCompressionStream.Seek(Offset: Longint; Origin: Word): Longint; +begin + if (Offset = 0) and (Origin = soFromCurrent) then + Result := FZRec.total_in + else + raise ECompressionError.CreateRes(@sInvalidStreamOp); +end; + +function TCompressionStream.GetCompressionRate: Single; +begin + if FZRec.total_in = 0 then + Result := 0 + else + Result := (1.0 - (FZRec.total_out / FZRec.total_in)) * 100.0; +end; + + +// TDecompressionStream + +constructor TDecompressionStream.Create(Source: TStream); +begin + inherited Create(Source); + FZRec.next_in := FBuffer; + FZRec.avail_in := 0; + DCheck(inflateInit_(FZRec, zlib_version, sizeof(FZRec))); +end; + +destructor TDecompressionStream.Destroy; +begin + FStrm.Seek(-FZRec.avail_in, 1); + inflateEnd(FZRec); + inherited Destroy; +end; + +function TDecompressionStream.Read(var Buffer; Count: Longint): Longint; +begin + FZRec.next_out := @Buffer; + FZRec.avail_out := Count; + if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos; + while (FZRec.avail_out > 0) do + begin + if FZRec.avail_in = 0 then + begin + FZRec.avail_in := FStrm.Read(FBuffer, sizeof(FBuffer)); + if FZRec.avail_in = 0 then + begin + Result := Count - FZRec.avail_out; + Exit; + end; + FZRec.next_in := FBuffer; + FStrmPos := FStrm.Position; + Progress(Self); + end; + CCheck(inflate(FZRec, 0)); + end; + Result := Count; +end; + +function TDecompressionStream.Write(const Buffer; Count: Longint): Longint; +begin + raise EDecompressionError.CreateRes(@sInvalidStreamOp); +end; + +function TDecompressionStream.Seek(Offset: Longint; Origin: Word): Longint; +var + I: Integer; + Buf: array [0..4095] of Char; +begin + if (Offset = 0) and (Origin = soFromBeginning) then + begin + DCheck(inflateReset(FZRec)); + FZRec.next_in := FBuffer; + FZRec.avail_in := 0; + FStrm.Position := 0; + FStrmPos := 0; + end + else if ( (Offset >= 0) and (Origin = soFromCurrent)) or + ( ((Offset - FZRec.total_out) > 0) and (Origin = soFromBeginning)) then + begin + if Origin = soFromBeginning then Dec(Offset, FZRec.total_out); + if Offset > 0 then + begin + for I := 1 to Offset div sizeof(Buf) do + ReadBuffer(Buf, sizeof(Buf)); + ReadBuffer(Buf, Offset mod sizeof(Buf)); + end; + end + else + raise EDecompressionError.CreateRes(@sInvalidStreamOp); + Result := FZRec.total_out; +end; + + +end. diff --git a/externe_kniznice/zlib/contrib/delphi/ZLibConst.pas b/externe_kniznice/zlib/contrib/delphi/ZLibConst.pas new file mode 100644 index 0000000..cdfe136 --- /dev/null +++ b/externe_kniznice/zlib/contrib/delphi/ZLibConst.pas @@ -0,0 +1,11 @@ +unit ZLibConst; + +interface + +resourcestring + sTargetBufferTooSmall = 'ZLib error: target buffer may be too small'; + sInvalidStreamOp = 'Invalid stream operation'; + +implementation + +end. diff --git a/externe_kniznice/zlib/contrib/delphi/readme.txt b/externe_kniznice/zlib/contrib/delphi/readme.txt new file mode 100644 index 0000000..2dc9a8b --- /dev/null +++ b/externe_kniznice/zlib/contrib/delphi/readme.txt @@ -0,0 +1,76 @@ + +Overview +======== + +This directory contains an update to the ZLib interface unit, +distributed by Borland as a Delphi supplemental component. + +The original ZLib unit is Copyright (c) 1997,99 Borland Corp., +and is based on zlib version 1.0.4. There are a series of bugs +and security problems associated with that old zlib version, and +we recommend the users to update their ZLib unit. + + +Summary of modifications +======================== + +- Improved makefile, adapted to zlib version 1.2.1. + +- Some field types from TZStreamRec are changed from Integer to + Longint, for consistency with the zlib.h header, and for 64-bit + readiness. + +- The zlib_version constant is updated. + +- The new Z_RLE strategy has its corresponding symbolic constant. + +- The allocation and deallocation functions and function types + (TAlloc, TFree, zlibAllocMem and zlibFreeMem) are now cdecl, + and _malloc and _free are added as C RTL stubs. As a result, + the original C sources of zlib can be compiled out of the box, + and linked to the ZLib unit. + + +Suggestions for improvements +============================ + +Currently, the ZLib unit provides only a limited wrapper around +the zlib library, and much of the original zlib functionality is +missing. Handling compressed file formats like ZIP/GZIP or PNG +cannot be implemented without having this functionality. +Applications that handle these formats are either using their own, +duplicated code, or not using the ZLib unit at all. + +Here are a few suggestions: + +- Checksum class wrappers around adler32() and crc32(), similar + to the Java classes that implement the java.util.zip.Checksum + interface. + +- The ability to read and write raw deflate streams, without the + zlib stream header and trailer. Raw deflate streams are used + in the ZIP file format. + +- The ability to read and write gzip streams, used in the GZIP + file format, and normally produced by the gzip program. + +- The ability to select a different compression strategy, useful + to PNG and MNG image compression, and to multimedia compression + in general. Besides the compression level + + TCompressionLevel = (clNone, clFastest, clDefault, clMax); + + which, in fact, could have used the 'z' prefix and avoided + TColor-like symbols + + TCompressionLevel = (zcNone, zcFastest, zcDefault, zcMax); + + there could be a compression strategy + + TCompressionStrategy = (zsDefault, zsFiltered, zsHuffmanOnly, zsRle); + +- ZIP and GZIP stream handling via TStreams. + + +-- +Cosmin Truta diff --git a/externe_kniznice/zlib/contrib/delphi/zlibd32.mak b/externe_kniznice/zlib/contrib/delphi/zlibd32.mak new file mode 100644 index 0000000..9bb00b7 --- /dev/null +++ b/externe_kniznice/zlib/contrib/delphi/zlibd32.mak @@ -0,0 +1,99 @@ +# Makefile for zlib +# For use with Delphi and C++ Builder under Win32 +# Updated for zlib 1.2.x by Cosmin Truta + +# ------------ Borland C++ ------------ + +# This project uses the Delphi (fastcall/register) calling convention: +LOC = -DZEXPORT=__fastcall -DZEXPORTVA=__cdecl + +CC = bcc32 +LD = bcc32 +AR = tlib +# do not use "-pr" in CFLAGS +CFLAGS = -a -d -k- -O2 $(LOC) +LDFLAGS = + + +# variables +ZLIB_LIB = zlib.lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj +OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: test/example.c zlib.h zconf.h + +minigzip.obj: test/minigzip.c zlib.h zconf.h + + +# For the sake of the old Borland make, +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + + +# testing +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + + +# cleanup +clean: + -del *.obj + -del *.exe + -del *.lib + -del *.tds + -del zlib.bak + -del foo.gz + diff --git a/externe_kniznice/zlib/contrib/dotzlib/DotZLib.build b/externe_kniznice/zlib/contrib/dotzlib/DotZLib.build new file mode 100644 index 0000000..e69630c --- /dev/null +++ b/externe_kniznice/zlib/contrib/dotzlib/DotZLib.build @@ -0,0 +1,33 @@ + + + A .Net wrapper library around ZLib1.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/externe_kniznice/zlib/contrib/dotzlib/DotZLib.chm b/externe_kniznice/zlib/contrib/dotzlib/DotZLib.chm new file mode 100644 index 0000000000000000000000000000000000000000..f214a444aebb20950fb3e8499b36731e1f12be95 GIT binary patch literal 72726 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 Z=2?SwNHlBI=n)AcB%@YIoJo}Se*vG)TaEw# literal 0 HcmV?d00001 diff --git a/wolfssl/64bit_kniznice/vcruntime140.dll b/externe_kniznice/64bit_dll/vcruntime140.dll similarity index 100% rename from wolfssl/64bit_kniznice/vcruntime140.dll rename to externe_kniznice/64bit_dll/vcruntime140.dll diff --git a/externe_kniznice/64bit_dll/wolfssl.dll b/externe_kniznice/64bit_dll/wolfssl.dll new file mode 100644 index 0000000000000000000000000000000000000000..7e75b493cc9a2382f723e8672a5624988d25829c GIT binary patch literal 862720 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%0DPSP(mawY2K`^G$IvuEU}3GtU&(s>55P2O zJ${EkCbqo6gv5w%Maqm3AAMBFlhzYK2juSY-_ zEbZ|H9b<63H?O&%FJ}dDOshs&v4|j1k_G*i9Kp-Jw+vW0{pB&aQq>9@lvK>Oo>!rXTj;3QBm8F8>g`Ov7#t+-ntZIxrAo z1Q<%bb^~xtqjC=~DRV7C1wP2r5MQ|fNuK{n2XS!7f%6Iv6-M2)OBZBl4X03&uG=4i z{T#H;Zb&@g;|sce2jGR|{*iK^|uaobG>F#MTjCAOiSCwpDo~7Sf zIr3}U!AO>VaOAC35JMi)kAW#(b(NY!M~-Bs=wEn~mZ5jg3!>t#Gf*U&b3ZCl_XFjA8SV=Yl#BW}a2Bc- zsw}iux7VQ>#mTCuO#l)@RUm-PzPNpcyJ-%d!DNFid37;Hm8;>h7u?|s&qL0q0rAmh zb86m6n2O)$aT+)Khx%$>=fY=$XbdaRUL$RIMoO9OQ~is`dWwoT&AY#g^~c<5>|klk zf4nH%Z*tpEEQS{cBLky3&*1H=>@`Dk{1!LBgbP{OnJDu_yfVlF3irRdgy7jvB*?iF zd95eg@PrE|;xEr-mxT1>S>$xggZ0RogEI2I%#bYKSZf)&6~=eUx4 zS)?SrpoUJAhd-m*?()h#8n5fj>oexH*}U#Dubt-gAg)FmVxe=$7oEkubS)l@G!PRa zS5O@arJ7x2LT!Q`LxNmV_v0zzpB#=sl7X4pBU&_P1=tS}Fw@MEp|Ci4XjUqd2^&Gq zFHTekuQ2KyoCV<5ZQ^LODaH}DDz^>4yU zp^exEH@RjwX2C0!N1anx0}*5qc?v*m8dM;g@DXSo5ps;qvv}n6!Ep0|BW&rcydprr z@6{pI^}uu(um(bn9@hZW_MbB@1D8OrS1BKhoHov;?zm})3>>$TciFF=!aMt`+;Ku0 z;MaV525=I@<)Fw8Jn+mE(H9#~0IAXW%gL}}OH6pWf{O>G28P0X&8rW@hx>~?w5#zP zsN++E%{b2<03X+_03I62bEx7gQD3Yu?7<>_7uG$8{0KA+9r~a0YS9>&9L69LzkJ2s?J{W!PB80$W5JHyd@}9*;LNGW>=}!~&J&E-doVY%<<4lkj zcc1y6)#u_4|M>PDSKo$zRiEf?3-=W6H`a>QMr0F%VJbO*cH}Mqj6t>aTyHzZ6{KRO zSy@n>65eyYX1qo&**w1^ydbZZXT->Sx4-uWhK8$lSv9Z-%W^>o!4qdRYa8uPXZ6Aw zdZ@9igZ5iMvGLXXI)u>n?1@)5DErN4!myx6S+Ujibk4 zi7xw|b(W=v%CgPJ7sz9WJkAZ3Ikgw;Yfu5ojzV24rLOaMO1zP$HuZtkZ%!Q zN~lL_Hx6H(2%yvuqx3zA|r$c=NyJO*y6?_KdLYl0EOENFZKi zE*uXKt8!NbD5CM_SLukWHRdssKC?2MzLg^eC%IQq35j4)dDz~HG{~FN9iCppIaX;5 z-h33tg8&Sk#v7mWwL_*CjryX^6N~av0^f2jLNmG3IAf{QzN!suPg&ssxHqMa`abFw z^K*CbXfJJL6F%mv*$Q_g=Uy0c&?Bu}|M;?S_LFSJi#2?0djqyr5JlSOpcxh6?2u~0 z{VhkK1%17(>^Z2F4;eSVB5K~Du}H|TG-LX*vCsxba~#9KPS>R8p|cG<%%yNommin% za7}K+g}()npW&}JQjfpYU5n8jBo=kuCW+s2f$X|Tr8h8r4btcV%=#*kQWeW-?q^zl zs-CSMqOUVkg3)xhHlbVp7W&#a z*`9I=$r2ecW!wz?l-k4F2Jr>f+t-aDui9ApPFR{1LfcDAHYWhsrx$!B2vY^YY0c&! zngeLrb73GS)I!P{I20SntHD)K0!nGXfv;dTx+=mMidKQ;>Dr8RH0R}^*l@gnbzTe4{1oO_Z}PMw)W+yJy}O|E$X$b3wcftW38f(7h}Ld0B~w7j2YP{{R7j!r3~KR z{ap2j0(YR#FTDcYs~=NxM^mV=vC(bY@$H8#pV{Vb*5JW$6|qO~I0ga_FfQJIa9J>< z0XiEqeyVU82CKjt`zQ7!P-eY)l+Gwq__1C{%tHcB4}Az|*Nd23DaNO-90lsz1^VV% zRT<4$gwDC6Z3t0XhV!LXxPeUo!p{zJNlM&QRu2J7igoC!SWlwclKSE=>DiZ<{c^lN z)Jm!TaC+9?#V#!y8L`WAcXTUII&xA<5~`W zVWHetRFgAX9)*cR-4+sXk@8P!=zX$Mp1i#d)`H+Jwm7E0VL=4oJIf8$j5o#s^aZ=Hm z^CV?tFG5tv*U&iZQgId-bi@l^k)2{}p6gp(qEJo%JGO1 zY34SlOtGQ;fo8hc%(%kZjL#70tzw}}FAYcA5<+{6)JseGm(WtV9ZOhJP|1bz0#(mdG7a?HWZftlVUG*TJ z;PVR+H6b;CKsab>2R-t#(3Hq^Rt-{B=wPWEI-1A7t} z&hTZ}$8m!;4X<&BnkbX%S}9$HW?;MVG8RR46|u6ah*@NstJM(^i&V@8xsP|+#4pR< zlNMwW!{{fNz6GCW9%mAleUe&1)Utik8gI0@c5E*$++di;M4MpZeZe5h00u)xQLoH_XwC+dAa_PKH~yTbj&rNsVLYI*Eg~B}F*A&A z68U{`dqLRh-~q+XHT*n~$J~*RW$U2-iZ?33dT=;j3gWyj)FvLTK;5&>bZ_YLYKcE? z#f!pSf_>q~pB)d(S7p@|%HdP&t^_4OJDx}Ggx1~9j3(?Lm$CnzuPG_*;Y4)@@&RJf zRC057M>EJHrs#d^kqY4iL2MgTM@$r8({W~}yP9>`^b~}uOX!_~UmxpzTF8;~lJK?U z=ZZcGMk=E%D6r-DJ{8E=sCkL>{vbZ1EVx`n0W*@Z4`%WDUSh38GFHwWgK}vPuoqMc zcx?ZDSFFG0c-0T&cy&v4b)0!RgWv)UI*d(&AY4F6iBP#jO2$@0L^8etC3$k;w+;Ij zU1kw$6olk-hjA1;bF{?Yhd0fbOyCl@g`=0@XsJq28jOoixz(kkHYWe=!2~9}dw}=# zp7%ZAX)2*$j|5qx4;E@*bH2uy1?;4G*`|vQC=wXR<_K)g4&l&)z3{~mb7YWk7$+e- zQ=2?l>|m(6GvJStOX`kUFjc05-MHylFwj_2AC-Lba|O#!xHA14dYu15^mu(^oF30@ zP+D5hW7GcEB2DqQRVKIuzf^oRYYlMghm)3pE3pj7XD=g2%D4=;tYshwL(pDEKE55X z8!bXe@5&5M;t<~<^z!|B)fCW6&=~Ak6z!2@tWin(YoR4pTap^W^$3pACti=Xl+zS# zk*r5mPsjT2RI@Smskk7@1VB%C?@s#UB zK&!mH6h$^Yn1yf07lq-nzzBVwh$sLKZ+ofOfP2F_rH8Nr=lL#`cxG(QK&{~*&lqeE zuEAgYM}}Y{u3kJr#r$_1{Wa}3i>#3Fh*peD_UAu2zBOwB3yXsC@DW0-(i?76O+gf6 z#%GX2lIMaLgIUL+VQ8iDAcjoMiEVUwXl|xAly3|~a|`$Q!mAddB9+gG+RbO{&}Mhj zL2NgS2%h=EkFs0t_PecqfjIg?kFskJdRK&=V(;8d1fF5bluAP9sY)wCw`AfgY@+d) zRe!=ap(<1DNciTRc&219GpjPcMog$oXovM_eNwhNG%>rZ_$Qg-F?8q0+y_q0 zP8iB*ebEsZ{$Oy&R@6+&_UR|XSk;);i{G+Olme^09Mt&mJEhFs0$(g!4XZJLWyQB- z`cE^D4WMv;D2gVO`QL0P;zH;7bm=o!*Ry;jt67B~e){$UA0_2(liW}7H5Z)6ih;t= ze;^ZX6KZ`F`6$BAhglWiL8?(C=ByPpE2Yu2%zZ$hyaFRDS+Oc5=at#0idodvvM-h3 z1Bb!5x|WUR(JC^Bwf?C{dmUPTp92YoE_5S6gTssXg}#C|Hw=bkmdotr#=2%79N3Ih zG@vcL#8kJDd25?wWd*;WZy^PBSut6Y!jj>T0|;aP*vg3#S_oHyXA$}p$wf|Y_{B0L z%R|)%%fr99Tat5)^6($qCAqM(JbatGEiI*Of@`3=4GmaPhf1>BR&16_8RCAfupw)< zyz@w^7oK5BNXd4$rRO2trqYs^p+X0ihZgPihF4@F-G*<6UtEF8+=u{CUQ;(0nagc; z1i42KEx?75Kp^OjFqL^~f)C2eo#i$;na-o@595Imv~rD5x$co%JL0+4 zFxRzKE;b%@)#3uwi07(ju1l<3@1udpMd=i_$nji@n5(~)iyIl_q9_YC6Y*Tt%oTyq zSXxhKMdYfKx?Ydxn#NpPRj$BKkmIkCBcYyV=J>6dqXIeB<3YTF4Y-r-i?Q6yGlGgL zn6N_)K-9%fn5V?YWAu!R zLZNK<=OjW{W~!k+Fm5*6F;Le+eYB0MX`OyXM@XlzQC1&?===cdSNw>oU-p1~*dxkI z5s($=3I&UCAwG*>*@qgMJ%~Hw(L6AivFVc*hDuM-Wz`J9s2!TKjVt*voCg*P@@qK# z@NP5=XJBoSyVdv0o&J`3_j~p36ZLMRdiTG$W2E9>_n_ssQ3(=$U<}(4o}6y@(=t*H zt?bT03?qL==(zX0v*jZ~06sR_>Wlv-kZ(0*i^1wRt>Amq}D3%O%4+u=ND#sU6{RRBvx?u^yYg2`Nl(R&Kw9yG8J&XKcFu7M)Ou73iaMm=iLZK%f)6a;kW#JsRK zs+TSdHJpNS2$lDS9whKX4b3Q*P>(c5>))^ik3&)^sv)j=Yf96#{^7Tn-JvUdZTN(D z{lou@3s6>D-Gz*Twm(;B3pWuo=tal^^@atiQ$*H7K|y2m%_*%Z+ZvMB#^Y9a({=n} zG6cfbyL!IUgM!SVhFm~i^+mL;mO<9f<#o7X%_|IL<_S;yr!n@Ja;|5n504&f#B-7P zdUd@PX~z5kM-1^4+3qU7sxHT1%CmglPUBlApH*{|r}0mvQFc3gD4_t?8n7)!#T4d* z%hpi5Qw{OXG}1?@!)f%s!^%q7t5$o%OV@~kSZknZ^DFex22RxCQn&~0{$FGLrBrEX z4YW(dlEZeFhZ~r|Y`L`8IMt&R@%~9Dz7B5<{kPZ(hQrwUrWngrdKc5TtF*!NCF>z% zZSN{Z-3Upr#+U>k;hrm*H~exfvP7~(N=8>C2-(4M>2JWqC3vh)0P^CUkzT=Ly}j@p zEQ2yup)vtf;M3pYHD5qxoCe-N?~cr+{VKrBAgpkL846O!j?t9kU)72NtP57>Qm4z5 ztO=^B`hPtFA_i8hcN-1+P%F$M7^5ixF>urp`*-tE^iNP*t^lNV^ki_TSNj;w}o`VGEBe`_Q@-ptZ!75 zD|t(z>%c-9J@E6ih=I7^9j|^*UI*^QX7Ql@K5Q0@B_IhN!Mu9LSAm}w2`;1r*x)RM zpr@)b;vkjm6J7*S!$hpYRk`K>RH^~^)gCnfzd~`i00*NOQ?DMum_|9KP|yRJ%Xs<{ zh&W7R(1>Pab(_u-Y`fF=9mZBNLdIic?nRCJ7nS!(x z=ovm;@_^Cwv4dI0y+`cebsAVORONuhr}8vR@W`JJkNn$RN!|zX70Gqw^chXn4t(|N z?=T7@J3*n>J#A9x`n*cK!Dio;f~yM2X8MH9;D-AO?)EEukU5|tsm(bnLRAL59D z>YJnN-4DDb7wICW7%%bfCJ#k4S*9N#Vi9BAx~UMsr%^ z-S(1p1nAQ316ds75IdI(gBnxnCG0!>AuVAeyZHnP`3Q)4|&Oi98~`@O6!uJ;DW=Ca5ij)zw!C$Y7O zQwlGh*8#hgotY_Z_9pzzFwS^PKENTJOli5JcF}^2K=0b>A0LH4qJXN>4&#e;a8f|i zu@Y@J+{IW=F|qg4Gkv?U2k&T6X-<@cy;1UE?aA$7-Y0?CD1gHw(a$An8*QdWN?Xda*P2AyXTsqqrRE^F8N0wdWZX&Y` zf;8gqAV^qcs-rpm0C@oJGF48hpnU6t*{aa;?NkmuoL7r(QA+hE(<(q&0o?Tgkfd%4 z`>d=0$OHkZ+qnRgr_a_lrjG6FPaoSm&?~y#8{HQ90w{^hTJTe@7d6P0^Y|w)jo|Kv zElQv1YFv_zX5ER!30S@&*m@9zR*~n)80`e|JPON7IrRG=EA@(o?`QMpbM;Y_8Z&=5 z7ddd~VDMwWnb0_PB$P$Qk?T|+wN<o-wESdkqbGZ|+34QVXskEOyV%y6?a|gY zPkJ??__Vfno? zJP94!1!Vc@j--xF=9&*1OAJdj45r~HL=f0sAPD7iCXk;8}fR(}yF)%W= zTx;UfqXMzvmOasb3%Pd*34s)WO0@jrM=@~SDN7~rpLn6$t6(8GAw0G)JR=oGL4=GO z-j}6#b1~jj=>L$Wf&B56$-iWOOZ?#S4cdCBYcTfz)guK+Y7I+~P(%e&ZJzMKZ%1<; zL9@6kqP&p1&UtQxltd?O5Mbu~PL9jrHbQv;3(jFL7)u^eqT( zL0hTbH!1l-ntT|BC2Tv$3s_e&wISTYCZRm!#Kjp(?K%UpqiD|O-`GJ}l$%TUc4A3P z2MeS29r6|@93B!&X!|>oLxzAhVV!sy&3PP|y52?-zSDeS-19&7l-G^B$j;vcD> zlTrC-0E$@BVo(f8Nt(e%V0|MB2apKQ^n==cEyS=<`h9t8P>}Fn=tcdFywRIw!?b>G8usz1 zhGh^>1G1q83T|*Fc94yvuibyEr!NFy6uAl6I}31y5sx{|E|@ zDsPf9@G$u;-eSg%fgT;ZX1;oqqrXqa~ z-nmP*2Cj&at<%lVT_&Zn0!8uWUBb__2hNH$EzQh3O!8&~vcsd6I@xyH0b4}m#AFvR zNE|w_spkOr_ip3*FLO1AK@u>MXiad7S1ls6B%AS1&b;GZi103!EqOgAc7R`q@3$46 zK~%w`I(fJX?PU-dja$LnxUcvzzp#+4ssT%}pq(tmjrf~k?7Bb3Qh0xmrFiH;vJ~Y& z4B(;@`)Bbh*=~G{Q*;uz3qP`f8#K)hDn(1i4_Bkd<|(Gqksj@j^V8@7f{Yu&DoPI) zvIq0o1F}MYX=A&e#NP}fH{R|aW`#a}fb9ki!0JLinY&uqqHi~B z;9uaW!ZEFq_FoqhdXSfa3ioqRo6X##)ezX%(RqajYgv|;IA06rXhA`B{MlMs|Jqt$ zjyJT1b88Ll8H?ceAcn>T(rhRtSP1MHYDFZu9`hBbg^156fdIy#J5A0CUg2lG%V z{u2xqNdRugwx0>`?g5`TJ#eC#MQN)26x_c0Ggp`+l*U%jHrt76nXgL65d$0u|r}WZMDs5xBC?V}h$Wxi{d{)Bq zxhma{W&J8`M><#w(8XT`_u@9#oeG&qSo9A#Z8qWj3ARH5eEWh%YTzsG5k#tV-{vHE z20kZSdJvct7>MJhf&@h+X9O3&YcVTOy?!(_Kf8GTAph9*(rjXjFFYmP-JWrN>6CF$ z)Hup(N(TkIqX9csoCu^oI2~%BQ3#yY7Y_=yr?;0nuq8|>p6~Qu5-rX4*0kfHw`Ql$ zwqrtjdcpZuvX(1PK`l<4@TF?8v5JF0jnLv#Y>S=6^GEq7p)7n}Tt=SoDx7{=$ zls+1sD+PEmq0uus4YlN>mQkwi4)3YuEPprBwL|sKEs;f%s zy3n?`sCd5T2l_OPeR81&PjWj>k+Lq^Vo&k>N~;}9j%&w)gm#ppmdX>gV;2-+p~dC4 z#g)bLXPvkmQ?Ft>s!+qM%R)HrP*inZ4)5YRI`R*jLG=hzm{)dfYd)xVr9iOU;)?it{L$q%0h6FjA8 z?ex7E`|_F$gx=+6pG7-S(GgTWG*D6sH}K2Rth zSYngf5yy{92Uo^wt z4Kv(&9V-mgRpD>fBly!^M>~(6d8_d(mUj;GG8A}w9c?*!=50>QyM=jaiqkG8Fg^3q z5GGddLgpPTd1;Z-Gw-6ryi1t(00yDGuJ#0Z>l5=*G9(LidmXK2de*xpG4FlM%l%k; z-Ge8{`*333b-0NvXs=s;f{YsyGyaJgOWW(7IYGw1BxY=4#v$!>9Vf_mP%^G{;?hJG zF8E!6=Gg_S&4Ej2mo@BJbn1lAeQTXS2EC4E8=jI~fqdB4%S~h$Opy2#hZ>~@y9X}q zhs<@%9F@mDeQhr4g?Xim7ySyaVS_4)Ti%=SK;b4hgqX2CgqY#AG&#{*gJV(yCr4Xh z*zc{|T)^VNZu^q1t~?|uf!ie7nt8kUiW(BzcQ4|*_((hBhI_-pZflNIZ#Yzo=ip~* zHHUAF*5A8EbGX;xejV#_p6zw&C@%Y(!P@L!T*%t z5xZ9ZD-o7J^h*o?Y+``cd#9(^v(i&W<9987A^e`l??e3h;$1O*f5Gnt{ATpQfb>y^ zkM-%5*(dQ|R^m-O-8-4SV3T*)%`;*4k#1ej4aqDrz0)1Sf>grP0Nb^l^h-xP1}LGn z8T-GXe2D@s|7hAJECeG!CTuQc+LwyBhA|7*{}X#U;kW<>C8x)6Lu5Nd!xMi(ew=%c z0&We-Y;BXRjX(Aob$YIg`@Y$&<`>_Meerd1^@stIRM`lwJk(;`Wr?QG?5~sJQVOkc{dM7`)z7QMI8S0=pIIuDEkN~ zY)u~Xor9>u0YlFyrYrZFoMs&fDx2uu}$HM57~6=1}0{*EOG}*H>6560FtSIV?#WK`K*)fG=QmFD8pUWF z&rW(VhFeTXe2AG)9@TwLz@Uk@tu~RY-u%pA1bKP#bqqa65TcaRHZU#Pf?4ul9bRJJ z!)LH0={o}NeWA&68PT!%b-d#7jwdJLI*O(HN6Zm^_1EBAW=1c&1KnxH#0g)0I$sK!)ZH(~_ zS1!mt1hjx^>sEs6VKF#?P=dgr;lDcnO^IjgKHsH4HhxtMWX*U2L7I*Ov_8a8YV};O z;JKi!x&#T)O`V4Xed?4!ZG~Q$S;39`$#`6*dp+`MMHVyFj>!<|3)s{Gt$~4YI4dsn z!7>-4T43yiJrW3dBk455qFhJ^;Kr|!&jWkA;8E9-beu&z9vkNZpY1ahHO3u0maeU! zyPrE4P19DaLrU9Nftu}ecEB>=4Ist0A9`@^iT;kerORF#P7k$o+D3LzFirXSIl-fl zenFdhJ>)%mJtfEP@Ot4bTk^NtUE0R7l=|kodIvj~BhK-My&`#@a5fHSdPm=m>ieR4 zpY8RLZyNttVOBBBwzqH_J$_OC+uL3Wmqt;KR@SO_PiRYb(t>IA=ja>PcV%@$d>^p| zBU879u#f4}U`gu--xPV*A}sowKmiXB8V4fRE^*-CpKp*1SKyGb-M60%X?RTj-H!J~ zd>^sFpa?w#85mk#)9wpTcNpn=@vWM6X$>sG0{DhoVxZ`68#rB0I1sgL_wD_=*evj3 z#w^~3SrYDB&kH7wi?ai=DL+!-z8T1SleWA*Pv#unz|yYot&$b`Mx=9)fhFc9JYR_P zQZvsYr0XPoPhKqmf!m*%x0JHu_UGp98g=`yc}va=Zyzyl*Qwig*7I}sXXy_2oP#jdLPbmt!qmN_Niw5$7 zhwc91a=sO*EOV5+kLocP<&pB5t;YQn0LG!+iyxJ&V$pCFI$=#xA+MZR3S=t9qUUwS%H z9rCak(Z>Eqc{Ba6Fvg?X@CpCk@|snOhn)_g#%5nh%hIjh@G5e#-f(uE!beXrEOT+l zGPqHQLXc<4fyiU}=EypeDnou)_qmLUZZ|?Pvcgd;Y=%g6LFyT0H~S#8LXe|cJOqWu z(}kfY-hidYZY2H3{^vzdR!mmhEV^Ub1rA)79Q<$(geIWh_~je_7{xx)N;+r3)A$B+ z8=EhXhi6fUnu|^M6?~(&YW;0`-|0w)COabV;kS=L+LGJ~a$!o|4+C0E$#rN@4-0mz zFYJ-vIpXTZd&Im9Hni6lD&31FI&c0o>qofeH9U3mOStCW_Rm|!;yP-~H&cIyYr*m> z`dyCeh4;+0KZI-16Z?Y0aUDDOjn0{UR6MG3Y%bdC^SV)p|D+x0zp-sGo1!(`kB2-=G83yoLkKsrdJEOvZEU$g+8a=< zKk3K3Lx6inPGmircb=9HmRH_s`GA#{57RxZf6flP)cV`sl}q1FT#T9WwZJHLe3;fB zF=|@T{pTe|DRv`$UzFrzrwn!&H&*Al%CPf~zapJyCuib3RE)0K-=dZOQGb6~srvip z#Qv`D(cibOSD7RZw2av43(P*}=R5$rk;oY7so7`rUiEo|{bzW|SC!fb`=d;c$hlcA zeQR+shRW9im$3gM%>L)wuVM}y@u=nZy+)FgQJ;ObdRic$I2|`VLGkFz380V}+=E_O z=Z|7+?yBOp1!`mcYvb-$5sOy8TanwBc=6~9K~!N?@F;G8JM~XO#~hyGOxVU<|1Lfz zriT6{72%0a73pN~PCV7McK09@1X8)3-cV}08y1e_=I_e%gl+|KyPw}cHW&`#ZU7BU zN9+b?yNWZot}6q%=`gT7FsxQ*NVU{wQX_*^GEKjG9iD_lD38Z!7c|SZC_&E^RB~DJ zN7$)UktSPvvwP*kAj_57#yXBTTW|=R*nr&zyhI4DN-mFu`;jW*E&MWO;rP|?p)C-;O{C6=-PSA-^72dEcn{KNLE z4?)X?1Ho$1^pxUEzXObiH^}pZzLWEWP=hPxcTS3BgVS`^&u>WOu21wwVo!WcA= zEyUr)s2>D;(>MRVeYuvxQs9}OFQ)zp%W431uw9G2?TAo|`lFj`$M%=72{1jYEk55H zo|o#?%DP~E%IJ_dRC=3#O6`&nQIO$V`Q)p@sK{4v(6CnpUoiPK>;%(TQOUu8Lt-Pm zf%DPcmbsq?>jkXKfMj&eZChhfpO}I~#z(hB{$XJQ`it*kRQLGLhSNXTlV<-goJ0(c z8{s59fTpKpf+qlrgWVX`F2@eL0+-c$X;tbo1l>3`q2_Cg3<;{6f)a+(tZn$g{Q$O%Gj-1j905zrZ+2YDYVb#Yq` zfSSR=aTTDd^5r#HUiV>tuVi!`;~oI2Yb*cE6(XFI|Dh%7{i_p>2KTJE2N#KF1&t7i6sQVv%}5k*f|#0$xP%HN2n@6(wrrMI&E) zs$Q&7FDOjagCa3~L%pDQ6eS*%7who1>o4lX2K9oHQawm z_twIG)LWvHZZBUzAx+JF!46aaNqO)fu3{@KX>72NPM%&eHOWc-Q$;D z0B;!jF&l%n91~ACgyI&T?RJ+(is`NG!TXQ_WmA%e_og))ho`4}F)Tgh5nNx#uNQt! z{EG3r0>AnAeS}{cR=7X6uUZ11g(LX5q#+syiCDS4!VFFghZ>SBWcM?EEPDzTN5P0dTpDPm%JFM zg@QQx3wT6~j#PVV>R;kOB9GU6Q~wf2RF$9se59o0rAj;rz!gDU>p2sBUi&q%T&NFg zzgaJ*P<#|aLAn_vU`9AdCkI)bIKoPb$t6W@5`lv>F*kuc97jKzo=Sdit?$ZTq+Gwk z1>uE%eA42++dxoIx`1+BZ^mD&>tIUx2kW|5)^&c?_#hnyL|n@)|JUPJ^`7+XzrE-F zL(GrSaClyQ0{ft{Pz@FWh-PFjth)>J%d5G8z}T*8K(i`BH5)3zlbdl}SBAybhNS`N z2aV1aSz_l9v|ie{xXQySVC=I65>&GfdgwHYk5L$X*JTOuNc&(sRXkEp<7wWoFV%`i z`s8o9?bu!(I>QsHkzMr_(VW^hut0OTAkuTsnmx1CICLqHQdw!brP`C!_fTzij~Zw8 ztkM6JL?epV#u&}gb^5%Zzg~S|zQ}!H;}w|nZ>s+6 z9|xWxvHA;C{lXDbcQmytp26P*N=E-X8U)IWBVhMP1g$*?sZ74$qw>c zJ=%M2&-yHrsPA7RgA1*;g(C`Qlmt4COVa9-W1r}|rbqp6tm^>}zj@$Oo@(o3(VTnb zOFNAL>Pa}6Kw;YEV>=W;J)3fgtU!6wYU^?q8Hh{4d#KE z{m-E`SRywn<7x1QC7ZRCjr>IM<&N8MTn=15xA}is4oQNoqkLpDd^MkJ!IlYfl-ZCJ zb3YJQgM}}%HBGz z|Ho`{LJO0?&G;YQP?b|$TwsO;bghQP8IHqA1ywBE*6wOz0+epNtUX*!Jk0~#T+Fx|ojOogM=%hVAe2W&QhVKqiHr`62!7V?D4qL_T+ z!NIpl33~~B$olq=Jx4})+9$6z`}aMh!^q*mX6x4_gN zV;naLMB}*ZL(|~mq8{t^%aA1j(?`nNPVw>}$1Jr`7o$%H1qO%0tyowYzYB*_p>Jh~ zA*b7i`~+-zAg@sWQP54Cvxa{}9fFoZ7_&WM`ohzYI|4 zntD>CH(TEqy#^J)i|g~TyzCDy$@8ShF#uovs;3)7J2f*XGby+XCdp3f3iOizn3Lk? z69B^^}Lj5;SMH6?{M^X;tVE)mxR~`vO)XWUlNlNopXND%2_M+ z!k1Vzd1#G(TunUl7(D02sOB1}My!})zMHNDVIA~@mQi{%CkJ1M>{n-3V8RQ$bos|R+h9Jq^Aez&SML6<)95~gd32+WSa6E9{Kvn?f83mjt;%mhJ5AX>=?4q!U z@R^L(C1cSD@)8P*eh5AjQH2Sgp;G=og3n%PeG=j0ateI*-G4lMoK4n5rd_@a3H&}hnXwsRM`2Ff%Z!QW>~@uoR{#BH_wtGcLEG%Ma`$@!jR>Cv^FM~ zR!z2K0A>#?`eMq*Az(O-f=pEit7e*>N{OT?&x9Qa+7Zn;@K-kK)Qj1uaNl0?tc%Z} z?dh!tn?Q7c=QL&wl93(v8$8%_ZfZ)F=3!vxWZsrdz`@gT;VJL&Y3$SY_z_pjogYer z!X+~?#w=ug2#y`LpLq=pTT(=PLSb_+H+RKJq83*Fx^ACxTV_hwn;Pm{hD2gj^1i3M z0}N&n+i(usa3&X&d{!$*vFK~Pf@>l2ImWYV5YaxkrAR4Cip*Z1tmqq*oozh6uU_|8 zFm!V7Kbdt8z^sF5iV(EW+EY-YlF}qWL%~C1{@(2qFh11jCgrof=hf@H9KVG7%EWt& z?;zagRgZPT6y~C1(XK0S?yb}>?M-+eK1HdDKQv%a}i+ZbY@W7}#EYwC%BJ60Zccpu_?kk?&TA)pHQ`tYCf*1_Tw z%FgOuq)7J3KLUzTx!X_)p&yug*zKfi^{;a<^g1#Hv_Z>fW~wjsMGhPSV$6RI7Gg7+ zZ)z`FpAEO-wuapbX5P>v^fyM#DYzn;+yZVGQKxWEyIhZP-moff=y_%ey-fd4+)xtP z*6;}aE^liXgsnh!TSFc$1KS!dRCgYAnWiptctPce1A^iWI7gJ27MCLw$aIz?kMM6)OD@#@FQL+kU_;AuIxF1+eTIOEFQf91@l z+`;mH*00Q#a}^Q9w}1Zk(CP&|Vu*#W_75)3PF>Qcw&!?k@S> zk4Uu9K(2n(Iw@Z9pt0v{DQX3xv-zqHfE=^eCX)2FA7XF?=lnanB)#)DN2Zo z0!cSKlCcLY506Wmi{thmQVkxeiOT zT@$s9{?t?qKzeFRr^DUyX{M*oLEL&$(~tniuD2QgvkcpRxIeJ&F>c#2M4S%vY3FVb zLo*Cv!EjnJQrAlD2pd(h$f2#c8F*H%pCx^$2;ICeG6K!q9FDEreJF3t@P#HVjP#A> ztbKuPm0Qj>SR5bEt&882dzPZl5OQsL5DiH2XUHcK7Y$`E%)^6v60Bd{m`Jb+4p^H!39c}jzjSDeu&H0h(1!k zZruDgETzgDZIHa0mbXM+4EsR6V26$V#o)uS`@I2!y;TQJrksTGz?%yYh2cV9XuJ%T z#DNl!#>i^bLvgYS_cmq4d;9Z<1E#D!`g7~3ceulqsm79zk3=IIA?1BRIH5>WjFPDY zW|jW}Oa6!Rz0ejP+Cr95MkzK!hN6BB+TW7do`g^`HFbG1xL=_Q^Sxp3Xw-G!XQ(Sa z&362Ss7vP5?<=plTjjrBI9{>j2v-$Qa_|ZU->Y7?rRSnVdt8RvKFLW`PLO9x(j+Vp zw#MV1z6Z$~q*uU0gt5~*FgnFQr}!#hW2{<8F|^_b7C_7C?}d<|5;qdSm`NgI>n z>|%Fz06U}s+&;tp371KpC|;~%209EI)|2lMea07*)-@zs-3 zqDSae$_ASt_EI#_qJ!43c=ffy3v4qjZ@ToKlC6pTYuK|4?9(=yBm11u*BbULr%9u* zFf>?@{^usf-;`Lx_BXCKCo`05g$LT}KEd}vbU<}rczl?LwNT0iE8tXD(K%ZEp8+Me zeoX&n4XNGv<>8xC$Byx5)9l>r*TfGwxd^NkcqUIx-ozM0*MAOER zKVb+*9`iD#`yyPwB%dFVT`gqC9&6gj=s+}D#d7=4oYwYFk zAB{EWWO*6L3|F4oMGjasDjd&n=vl!CWEj?UgeV|DGtUx<+q0y?5JZ398y@${X{cNO z2CMjAkqyb+bJ4!wkt}Vch6HO>6~gR7tN$KN)9XCQJMK*+mtW*R=iDYF{6m7qV1G8G zeSr(Yl_wV-h!nqw(7Fh?7%6y>ssJR;evuk#B!-RJQ#GsX7-1@?+Y3|@|TbYl`|Hs_Bz(-YGi~mU`149xx;iXYgqeKOxH5#pn z!FEoVkr_xN3Tk{*X`?Ats|YiKijp{qWO^LM);?@)Yil32wZH0ZFGSQflL!eQ7@*o9 zw~CM26Q?TLiae_G`>wsunM?xM-v9l5KKCCubI#dkKi6J+t+m%)d+l61(yrFIq7lwY1jtkTJn1(MspcFHB?mxw-~R4rDN;zj@|K-&XFk8nJB zW<(I=K%A9@thfy*MV3=@PnK@H|7aV=2sR6aM@p>_mGSwZR=SU-h`#M~A zv>Sc^YxUcnK&e|saV1SG?4?T%Ge>r+=9fvQA zR%6mCQx0TiuUT|Vy$*}MbBF_(A8I72dmu9|SwHA`{ zIV)ji&48?lna13Knv`*`wwY#KOlVGB(;ISrgY}#=diKw}Ipryi3A-62{OsL6zJ4f< zg@%UIcwuQ84=0{Jj56ld@m zp{C0gaAuNk`ZW!BtCUK3g!P$xglO zH`<=1wPx(LYoU~4tsDE|!uQnZ3t6{Nm3yk7JW{g~b=n@7aV)Ztg$7Yap5|aD(sW*|7Y6jLsK?dX-ZQ^Mo0I~x|Tkq=?qI;x6FJ> z`9rrjW`=@Zw^ls{nNQq3i#Wd!Zx*8OsDK%_TO`w0wY=^tWq78Zj@lHT!YE0C#@ zxsG3LGMC{1wK*6buK)XR1)fiun6)Tt(#lZvu_ucOK*D<@x5yCztF?kk1Zr|nUd6hK zL)DGG==;_K5||ooHRPxAtnID)FM|z6S4i((BPe`DsQRHQVnjbvtzt$mRDPVc+O@T^ z%%-GlERSOca`Er12`%-Mot-$N+G;=ZJrtw^D%L?!o)!=hs`D6@nsd}7^*B? zX(PA~a;^%{aB%mVUE(Oo0f4P%(F{y?@roRtt{iPix4-^~G_(hOpc~$hYKz*H68gH0SuHzKJq(NKk!XL|4PU@E* zos?;&y#*F+4XE%@(J6IM2^biQ*a9D%imp&ROn>(n?LxB5*a{h?Kjty^Wk#uW4Ffbb za)54f258J3pfZoFVt}5l2Po`b4bV;Q0ByGzp#2O`+Wul{V$^3k-3DGg_Z1|`cD?qWx)N6 zdt|a6S~bOyiE6lU=5fx5@m9Ib8E<|WZ=aP`or&^7##>JGNN2!t5}?R4_EzQMJq1>& z*DrnNW3>)_r1b6tdPd^Z>p;Pta7{W=60%klx8vu?G%kEDVC`ZOXtakBKEwxS2ZabS zFAG~iMGlW+08C>5fRFA%tU3Y(Qv?|k6sy-yv{b2ig8EIlujZV@fUE2(<(KFMY>^a`TJlhNjAs;r+1KanYPbP6YV2_=L_TqVnq zxY&1UboJFe=AH`{<|+?!!S{VIB!%x1#1M0wtEJi<)`Ro*YbrGRDTn=BpxBQv5GCto zZ2o~)$l)BCC7~YJW_{yu>}ZX{j(#IJpL)VMzbh!#EBjSvidsr_W*-j-H(tSjDn**y zLswiWJ9b-XPUQ9gq@=P74;PU)tcw~0HQjd>vOA-}df6-=NS(v{ellUvVySnP;slz! zOB~bML8SJbE5?!f6;uq?%PSa!I|4P^>zf9U3SX}CTwW1OOezULwt_WVqvPARv3AsV|ZdHJWy3<^x9C7a(m4 z7-DiPk{+U96l0b!{DKV>@CP>#MW_mlzANINnkuyH^N7?QQq&`0J*8y8vs?D%N4?gv zhSaGo`@GT9`Cck{l>tS}t`#pP8UTbgpZH?{e+eYDG?+PqkV%VvO zcvQjeMaz3NBnQfyHJoNZw`JFk1Yycm7+$-N876 zCNCFJM9m^Z3l0ZH6iJ+RZq2$oXHw9|OQoPW6``gVvkL3|QKm3;Ug7Vgz#9%(;0v;q z#WRNy^OF4=^nJNY8kp?FRFTfCYpC3;KGO3KaiAzdkI}ZpMbCBe;OuBR2T|x4S>;c7 zi?~HfG-Z}`7pU`)F!aHpg&|aA8(08$@I` z&W=5=$UEXHI$PcmgJ31^sC98%w++cVM*G+Kh-U^Y$b?yphA zq169}Q)z*O?q#R!a)?a z7o^by?V`DF?lmTSmRwd5D_5L;22qv$x+g!0}rYrZ%*!8Uz&$g>n( z12Yrc%iqm6Yi=XEw+q-D-e7Gl?@xV(gD4AYlF`wc#ePXXm{xyzKl<7UXpFpx%hULA z-73@@KOKRZ4=~6vtyhftmnCZtYFsjp&zjGn4beg}V>+cK>j<5b72O7_w%Ff7MV0cZ z5#-9A8I-dxK1lXdf@ggbvsSjqm8-7E$eyweEvN6WEoj-bIgtWY@j=mBC=nE1U7*St ze3T$1nPO}A1u+Cc@W_%+55uqBYHhM>?sE7w9M0j_s@&A%XjnWcSM~Z8=T6mR*z@$m zv*&RRdmg3OGg7TiZ0*o;=`N{%Y()wB&KKoTu(VemocX%QsN*sB5K5TG{l6unUMFM_ z?*Wc@TA}G+qzDfc8$Q}`%r+$CCf#oPWER$yBhv?ynQyb4Z@)}H6#Fv46{^{p*ArBK zy=b=)t8yFU&>8dnz4(Vi}x#*04=Y_1U^ z`l84SehC(N!Mt&XM+78OaqXwA7LgQsn0e)+3+tKTjXoB#E-ICEoF7`V=QDcP-e22j z*7PAK)Hbkk;Ys#b$@1DpWnGewzlk0p*P|uJa6FgAUqPgh9h>5f;XQ0a_>vKmhV-S5AEt`>rrpnqA`peXC{8s4`mW5t)#flBaIu2F zmz5GElX3+9Mqy*XfW4hxvigmXv;yhvo9HFVAS-$ZWwKDJRucpKr?| zdBVGc8v`XSdXiN&zR2-1o2#o{=8JwHQ-_zCa+x*j?;2-XuMVzMS%iEkv_(vQv7c^$ zPD?u)>?iLPX#kWq+7}RwS~d*I@vn8(EY!j{qz!X&;9xbNQ+$#6@?{TEf!-cM1Ug3B zbjdy46R4VTT=b*CV^mqQ=y*QKvUI4aq0tJ>M--~_geruJ)@((i8fqxtC_=#9MB!AX zx~Ak^930TA{cWVXYgPXisQ&F*{vJx8jb_c3<%MSA!gR1>`DfFq(QLO2bj+xL#^f`T zrkRgOY1U;5=T<=9RUl5EP$JegTD9}*Emmu0S0J$Z0=U)kXf&jaMNV@DuO@O$pEYRI z+h!tvTD+ES%jhH!=fxX9Mk&E2{oAs&5=Hv^tkOVy*?jBIV(*WqAN-HMYb3m?7R;8m z3dgwi0SwK>;SZ|-E&F{@OeN+j+59L+o;kF9E}}UGURpE{qBv8s`R7G89~H3t4JpKQ zFFqn1;e4tV&L?W&oYRNQhCq3Dz|)oDxhqg^Hl{rAYE<9R(SWbxxYU9wgThT+(m|ja!j~Ny6fF#c zMag@|D0(MW(Hu$1cv`ENyE~;H+@KbD279^5_!q+D7gECXAw%R^N&u=@?m^^sWp<;t z09Me^*^jRJ+Ugp-5=U=}W@{25OY?#tP(DT9gqqcK%Q5A8I`ke#(Q-l))7GR)Adx*p zrgXK(Ug~qaB7sbcP;)7IH;%7@_Gsjq{PVNTJ5>E|R)iJPS4~(a9G0ds`_eQO|D_qC znki+PTgveaDn`?ItD&)GuQ1G*={8uwtcA& znpaV^d`5wlYbr*7B~Q3!LqukW#nSX$LR+)f%(9=Qe;j*GwZq8nw5TCh# zK8(*~0D2^hsUjRIGgZ{hP_v$qYbOeyz&=+$E%pflnP!2^7p30OD_d^o_Yz&}3-L@u zohd2 zm+~h{Cq%~fnpXidXW7z)vwS~O>c`*?gJT;wUz~-ikOxGG=jm}iR>pb%@=*-)^6nl+ zcUF%DE!JPQnonhx!hTK>9mI54$aW zOVwW9Ap;S$2^M2{Ewa`@3GOfoS<8GWxY!)_r(FUc8}?DA{db^OQ-L&=>PSo-9KVAx ztykx6Y#ui9gR3MT4{0mncPwy*b5+)G9##kdlYGi#JRDEQkBT1E^2M)yY_{ym4dy`; zE~*Il%&)4k=MDjh4};yN2AMi&QVpC;9FZ4YdVoFY4vAkc@k1(q7WXyPD%vyit9jyz zrc!F0nCxGUJ%{XwJVxFf1=b|-L8FKM;fB4eZ%Y}+sq7*6VcFxCp8V$hVwtjx{e=K; znqxM9@bWhM{Ux<0e$llWja>RmzsRC*bhI@v*rJDpFAB@in!gE@29add*9p;TzhN4` zV764@6`|rB5h~bNt2KTniQ-hG0oGT-jlr7aib4pES)MeJD+=HfB35uhge+FASOgtq zqodkH1e5oNtlN>kI1*1(fuhl7eqEKG{L+2ioM++mAleHYEVJ7Pu_6>m1cCE*K9S-G zX1%MX)y$BCK=Ll%{Ug5nM|{t+*H`Jqj9-#yM3a*ApTak3JuW=OH4pnA zn@|$Hk2?FQ5K>JR?>iwOV`G32t&Ik5Llz^6Ik_@$Ws%5U-zF$IC)eLmsZVoa_@*cC zSIHHS7>XG#AsI!+(#e8K{hTH3L;_b%E2}ir#!hMvn}peblV|i}f_alio zp>-#Pp2urt;qwd(zWgrvkhZq9$)bcU(i9ZxC?4frEg5X*6CIG-lKjy z)URaM(UWd+eO~=Or+$0YZ=d>=8G29WLx7{F^Ly&|`|9_H>i0+Lm*bcD z`cw7Gb`62$N5B%_n#Rhfc(?BT+OAB+zAF(rzo&l1pu4B@`|9_H@*5irMn2m*csb9~ zzmp=z$`5_EURvHR?rS<{^4Qb4UL|4^CC@)lzqJw`OFkXj*JP}$B}m{>cB6vJ-c0c_ z73=AYsow|GZ&3YyQ~kE6-^bK%tNLA~euc_YxkzNJ!m~GdO_&ipyh?cMKKX34%R)%P ze5xn5Z>~NEEMe{^(X7Z+5ok(cgQF#R$Y}qmikRQiIaiW*hScvY`EA|zAn-QYrGAVR zNjFJ;#!zhZmV}wt)5&+z&^%%fDwIA#U{n~}Hz_)|Q><8fI{#Ds%17cnL)6F_l1rKV z93?;FTKA3TYxKCzeiii(D%0Pq-)GgYq|!W^S!B)+oAYx%;=19>`8nUH8#Q*cPnA5Tps=WU)kJA4*YR8@ag}qO$#pK*I_kWM>(5*VxW*E; zmHVH#-r&mReKgk~&+l=4$fepiDR)xdB+sP$N#04LCjGzp8||aM2W3?>cAQZ>e!|4& zRaaAwYq`F{wTSCUu3Nd@<2t}Knm&7j`=7bS@;u0WBKHru=W9W8Wj|UWRgO$ipY7;W6!-^a;6DpJw99}oLCwK>ha{ITZV9{nyFf-;alR^Uuf%-&6H>V`1Y3=;!Q;8b0~f@at7c!BYv~)-N!h$4I%Lcd>7&( zV=2>}4Qw?fWu#HsG%pmti4-q|;-87%q*L6gQ&dYnfa9Z+;F+i{*heV4gB!7d;N5d{vh+IZ24B}+xG!w3{aQ`vQO@B>Lu)>o<`fN z@*=ovwEdAsoIqnP6JG*OR>qg;+V-6y?Zd;HN+*t(@IfhQ#RW;I`W7H0j1|=9s5yCv zFDCg}@x?lM+({ngQ~bC63ffxfic8LU6*_}PH-otcXAp8SIGazsG0A`jnll%9j@>(C z64IGWbTcV9I1`VP$$L7f>Rw5@KqnoLU}?Y$@-VyseJ4BZ*GVg+)X$J~nNIqBH>v1x zMkGzBq|rO6Y?UOVhrc0ATT({8EX3kVBT`(cQ_LZS-%TMbU!^!lQdEpcFBLf>vcj~7BS(p$FMP) zim;1(e%YeLqTG~Gee4(NAja1tp#N8c(2QV1kVQc2-ZJTC9M(uH7g`UN2`({U8ifis z$Z5YJQHlGxs@6k@!~%4hIJqgc%N{~r7+^G04CUJMFQL$#3aCa16`!uK5Fe)%`dmi6 z>%!UjIWkC~?#xFIWl!Gvw-%}g+`G6{?v#^l-`8i3;tWY3Uztu#7swY_dlL&iiN>Q+ zM+@B5YrdFEXs9c3Z7+uBjX83_#uj^kg;Gg}z0Vdqb-aN1Qb63N47$Izi_*k|WD$#5 zEQl`Pl|`pOS))7%oKPVMk@N$hsysfxC?o}&a>Q!YT|>3c`kr))w$i;&on2X%c(|;E zxM6nIg{>Q=g{>vn_uNqxw%$;1V!I~rz?9oH9i$4hcrS)40qcDTPDdxHm4@v%l1=Qk z2B?-yJJiVi9uFVsBLcuH7KB9`?lfDJYp-DtAkDs24sTI|5MF|j%y%RM>n?cj4|nls z?>J7H1FPhy8crGjFanN-daIXPh_yIwelD~hn*~d9Y4S7?d<80{_Wo}%%fVVhXRAv> zBcsmlWRI!Di#@kU8Z5TkgN2(tYN6E`f~+rkEAeaKj>zs2{%S|Qi~PZoiDTnEUFZYq zInI+rq0Bx5h&)aS?B*{h4t0n#PXE31CpUb0`eeO@eT@=b&XOveE{j8u*sjP_wmwjg zIVh3++%NXorDD;CtNrj1GvLi+atc3`6V_ zE|iQSnCp%G0blJ0hzVQm_1?>y{LydI7~tL(N$cnag+ybwp_j(|_(Fj)DRsQH_1|!| zlI>~5WL4f>b#Qy1@j(9PxcPG=qE9lf+{UW=Aw0Q^Xkt?aN)kE=+%MtSWazq7nJy zPfx>V68W=zlQesBau2Z?n{-khrdvAxv6fG!mf*0zxVkvvgYp;9{_GmM@;A$qN}xd; z5d7oFGsGLlf_=jrPmXNOV6{-XOm(#)+cg`F0Di_tD0^Lft|+37HgVJJR7NkZk!Ljc zKkQ}7RNDDI`!~lZ)IGb-nkje_ZW8?a)eZd|8`2l1%?S4$|BSso1t~uAJ9m9v^>6B@ zS?dm2;2z0Ol#;U&ORoX3y%=OzMkmwB$|Jc%;yt)s9iVn_jekUZzIERJI5M z`%U&r5@_kaLNvY*KG*31SlE+#E2{z{F<1zx+K(&eX5$QmnKL8kb0;%`DscwVRwiCe z#9Z@ztJ^y8Q0(>5p6)>6j$ErRwrg~9pQol9$LL0Yn(v968?L_E7dg}6{n|I5T^Mq? zKT9R1^--#%`q*m%WS=;HSBRStIDqItOD>RY35W>L`4{Z=IVx3I3xvH(g@!q0N@6sv z3;34j&$SYgZyDT?fB{P$U%N~(-;pu~$P-q4%PvI#0^=H2qbRF4H$v<@$4b6xaJ^Oq%Rl-i+2PT z^Kg>~EdDslfkjGSaiti^xUjfwwn|k^JB!Sk52Hm2C@HVpT7oryiTc7#>jS40%j2_3%Bj^Q7?C%gm2t z;k&$htL?!zXnu9>V%*w=i>>|}x~2rmyR7^N@Db9tT~0(8K{H)?z!1_IPP8{DUw(%< z;9L5K$%@)PCX;Yy(*ox!Sh6!*QGq$kCWMVC$parRIjW8y{l!|Bsi9e&Yuqg-QiZLH zimlDeUa4t$U#*pYx2mP~gV_0vvhdfX#EOrYXJTl}H7#-WsmV|Bt@YvqbvLFf9VKML zF;vPL7Fn~@-g~q_+Gy`l)Ce>WVZ)dxS}6i+=?&|rl-pLW@hdx?TaTkE)4Ii16DgY( zIi}u9n(@wq~FU3kf zdG3n-$o_=pR0!%>-i;?@##<>NmF#)h$bm@Kd(d>FP5RhaJ)w<9KaZi_BqC(Gc@;5!a4iOasPotmhaYX=D6HIcLFC^?bGf74)ZjI_Bq>#*&|4F^FZaOyw@XvkL8lOXM8^7~=90IrCZRIgylPtg>;C zE(WRW700Q5N9B{78XNmqaq4mQ=Mi`h`zC6Z2_O`yMC+MGn?Tv^#X=Z zlc)-Tw_`VyzF9`3>XK8WJIqc=#SU)!x;3g_&LrXfpbTW?fzNOqNIKhWINyUDbf3AK zg!JHc-ZXq+1=3BY$&^MW7Fx*~vSurEoJ?^?;NBMy9s=&tKTi5H-1HpTwJn12s7_yk zJV6$fy4Meph1+%N?)LZbF1U`sSk3;~Vf)>Uk9?|ST30^Rg_lWtjt>huQz!E3vcFb$ zxVA_Il>g*~rJ~Uk^^nnag-|Q&deURtT`w;}&H_BtSyuoq^nJrlQmm&eb$;RrL{S_~ z_)QqDq4wSt@`6$YAI)eHmld1V9lpBwqLQGsn7iNR8Zc`Xwreqqv|!bc1S&ZuGk*0zEnb8Ppg@ef|(kWRqQaonj() ziSVOwZ#+(gCJM)-99%VSOnoaodDd4Y7AlQ)l*d>KM~fZ(*^SCp*e`lk9@U8FMZq8X zgoW9SWvUArD&N6Nwd^}|4DghuSm}&~5{slt%N7bisXqRu?W@k$BARITD-w6+BBGuC zL^ZqZ6JyW(9EJ!V*BOD$bW3EW2<1xkPn&Q3F>S_*87Uz6XE>))LUEoYE(F;x9X(P8 z4dqB%7D<(rg8ynnqtstjn4T;QeNd>Zegr==lz?Jovzi`Os)nLp`^7f}Aw@AiV(r3( zhc>0iqMZ%C8jr&!#DoQfSI}MU1e< zv%Ei(G>4-pw~)i9(v+dr59bGp4zjCZ8|RnAZbyN5Ij%44qt()as!&*5Atfdc6e`;z zd(l|2(DEKNRGA657-aw{q;gnJdh%;u@oLivjkAh*s7HlYBeob0TH}Ukd=Aq02!9m( zLuk$TpHS-?oZlFBHhJy9cM-$^m*D4*G81>@LM7Zq3F}gHGB|3p>U}geH(~~? z0>){iI#7LPpHdJix>CTNzlyg>BjN*Lq+{kEq^6?CKul)+^TCu$!i^WY( z%3vi%FYjDNsk#TU=Zj#dyHRkc2ZXR6x2IKh0%tS=ds?diq8|kT^1=ugpNZB_Fs1y( zM|4Uw-&p%T3WDR7;!7eK;+$ON@+LotbmD#fvQdf+8msf#*qCu%Uu2xIx;B?{x7xa* z@56vqKVjb}<9WEhDC+F}{*fS8Zs~!v zx#u~*_G)d-4ji(cW2tA@dVF2iaRqo-2qjKGnOcT=dqvcA1z~&r?&4nyj1V#Q2rcx^IA17@+Cw--c7PA= zr5>E``eoTMJSYbvjR5HlWGf);luv+k&vV#~3R_^0;U%M3d_et7bBr}!lhb|(>~k7|;U+0vRLr131!ct1ZQ z)A;FHbgN@M1cCmgIbIs4wfRWH;)2-m4=)F5@4k+0d0RuC9fMCYR)@yA;ur86a(=M} ze}B^y^fJ=qlOzMJ9YvjcNQp7t52?chQY&1AUWmQiPsl*HhGQ>xCutRbR{lSj^bIKR zdtaPLG_7drA|%{2h}a))+U+=S5?(T!oDy@UWwD@XQV}iIHcBmgRJn8cUeoFKOc{sXakUFF%_g^avYVf~! zvHX)__F1vLO-sMhJF`sug7wZUg?h5VfA%Cyy0^sko_Xsy9v()P;5lGi&}Zc_#)~*x z-kMzu`uNjHt2Up9Dy!DVt-`7;S}R%bJdI@vg;9<6qdq7B_&mY zVewu(8)83uQaUM_nytwjM-zHb&Vdm*FS5f<&Wq}rfDh7O`U?UIM3Q^Ux`-_Z^V2Xv ztaN+o>kBpu z7HWKG{*HaBw6i35R@YfO#mquHkIFWZ=mgDJX|2S8r3_)M)}X*5>fhK(>= zTg^OE#KSRs^pZ*HTz^|SI%>v>TR)SUKBHyn)ac13$A*St`#iT!>6BHx=2f*-Q+zC? zBAg+Xe~|M2Hf=tUE6TQjhq*G&Ir^jvkQCsm-j1V0J>nEUx+8b+r+kz$&OvU(Sz?>m zt%Va8F|Y2#8a!c0%+J?ghZ{r(S(V6|GM zdDV$ze=%1h*VSCta(#ts8rNsI&gSxSUBFexbspCuuK$182@c;cmbKqS83#XrTcMi=w7g0CgE zU=LrT5kf+Ql-hSVAzvb70U^`u>z$AWLY5IyVPEEid=5Xkt9T}`%C2<+G3oiX;5>nT z`*bI8()yW~=W1zMP+oxMoGY1Gx6_)>5%flrdL^C6mP-c5XW1JlJy2}lB88yQWUQQ^ z?CV4ay2U;fYjA?5y4H1tws2Wz#xG@O4K}HZQ>)CF%mTi^U&bRNG>#Wf-05ca7ka0j z1xppNLCSaae`;|@O^rp8%8@7{OJqg)FNs3+(GPlepP3Pd@WOXr)l?`UT{{oWMX8bn1X`Lf-(aZ>p}FR7>kpytelM z91PLud_?bI38b>J`IYKyFxp?)pO>w?b^7BhM+nU|#+$`lrCb$Uey#?t1zd}a@vSY= zvUsatsI&U0`qO9|fL%E{?|p)B;A3*3FgdmWr5e3C>H9TS&s}K!P@dA0|3WCL!}j|X zqno=>$HQX21DQ&9#tuv%-^&*pr%Z3+Sp{jVz0%;g)-Fj_Y;+-)( zo=?T|9(7O~-vfG1pN(erZj7Hrx6Pv4X3=f4=(bsO+bp_m7Tvb8MOqkNsk*@OZu*P{ z1KZ7q4PJ$B-y-7?;hCP+1H>==%$WBsA)lvqOV&d$oh!-df4?|Tqx*%uXS~(aN`mhU zPjH+nZ$N7xjJ6=y;7*7*v7ISVAmRUnJ58HO(`M4NnKW%CO`A#6V!CNDX`1~(gJ?b@ z9ADx6>**u0;#pRR_^?HNkg;gA+ayX){s|wnzz~v#`x!hHLP@>fAnH@4#K~&k%_^7O z5^@IfC4^9|8u{xfs%Ul)d2duDWP8A>l@j)>pLqpj7VkFI=bTW6>d*9dEV+W?${*%9 zvQT`@E-5H6he2~k!}^(xauzWmfP*R~FOj+{A#y|=)2EGW=Zlw0+!v_G8}d!SUn1I{ zexcGKX=tX6x<5rfOYEN#d*qo7t&$f_9Y>cK<8x%9%;ip$U3#hK6Ry6{p#owHA_PaB z?5y-yud4<=rM$qSJD7|MC1hVnBs^~x#F!&I6Zfl?(fDZD_=Z_!j=i~_8YEVV0buXS zRs6~v0#ue0wL|eAt{MXe#$rQ=@tZ;%nl3EL>MaE~?XmyMbxjwr37#=#*vYv_ju#Zg z+r>5gDvXigan0?FYnnRAlpQ-vj)68Hd%^zojQ|g4qXo-f;@p)-#=`g{LMU!niN|=0 zCnT3p{MWl#9F*OW&gdC##Nxn8ZbST7&A+riS>@qPPXqogxyuU6+wzcjO7iya`+P{K3Suqy?FB+GeZ#u1n85gbl2<6cx)Jzg0ZzmQ7@>?q<$PA?sooE46zi?G zFrzA?cs95g4lyaNEoDMHv?czK@r#}KM0MgK{sJId+afcq+S1tG(j_%a zInJZcF}c`NTb9daQS0K8^yKA$%9>fazO70=%42+1z9af52AC1ZwB+HgLl5=;@IvvZ z;`aQ*l3%S4pYHf?YzIoIak0Gh=lvVp#Xb5A(_L6^iwlv~>(MWNPi!F+o&n}>x;OcJ3Q z%f3SABni7sIb+H|I#a%@&kvvlGs_w z!FEvu4DW-d0IXq(@x>Pjyp(ucic(xQT%Z+SqBND{C?S%klGcRUR&>S~30Z-|9qTzY zcI)e%N`aXZN?iH3K{`{(zlN;wIcJXeRvaK-$Ms*P<@!P3dz)IXX?d!X)|3AINRt4( z0z~eT0BL%9@;u03`aWTTp~QU>Zv8-B(vxTNLDjk)-2};^>}=g)|3sDPO^9KgR#z)A z^=c(HTqE_Q;VfbLIi5@G@O)CTcl9TuUG=CCboA_gu|H8=&S(>o7x|)e_*L~F=4D|3 zS`)%^CfZMb{DMWYve%$2Dy0gjn3a8X1@6@S>XT}g`IKZSt%8wlL0MXApUatcXlX_( zq|(F%lRAlos_^!6s4S**ymDmL2=V55Js%$e>fkZ^hN+kbYaGWlP84HJ66IWT()M-a zNnRGOo}^vUk!K~7b}{-Ox%)b5)z{~r4;ZU+MJ?5ACU^Oo1BG49fw=QYp zebT3ER=zPgc)YmYaLOy+nyAhGE*>t*H;S#0N<`#OHWVcH^t?%+W zZ`}Od?}uFKV;6w-rS)u?;D?N)Kd1*r(rO;)ETiq$JeaYn3ghla<(qgSXidt7O4Td& zOjc7xROVFmVm>V7gEe5+|B5Yi11*2(XK;I>m$m$1t2`{e&{)0l6`p3~-!iu8m;s{K$!svuJPPBZ?Q&MpLc1LuvJV5Pi{Th9z@ zX1E?=z0hJ&t`UJ`A*=9<#NT`C-$WD(TekMY`uhw>zASB(W+xi@GEHCRv%~)(EuTX; z`$gQQ@3k-fCH33e^0aRHl`T)}reAEVj%77{s+)3w+xU&$lJ57q@j9wEius`~K%%MU z&-{mqrkbC2+P)W+M*B0=K9HCN-`b2;%XbIEe)1LstM)Ez0`9~Q04tmKaH}(d8{FEB zb8F{KT$alK+GfSxJX(NnNmW_am4$)EaBEkOg2Bv?tU002U^|EGVL(7&9QxP7+H+(U zC|@fW{L>5q>SWCzkeFR&ckPr(>oaAKNN7UuWEf$-h0|9Y&AzO}&`dTyPoA-c zo8Yj1_hjDdtpB3N9wWz))u#5}7@WpZ9D=#EsogoobSh~~Xa9-wf$+UVmj+3k-8_fm zGauv8*1;0GOF#OIce7O=J2@oCQyxW81I1Obc6| zlj=AF?%?{7wh>HChkIvAJSzJy>-+Cj?18TxzGA_HD(27^_z?)NdeyskZ-#oe5Mr!p zeTm*j9b&A0;5D8+{RD{^=jr!sYk5i|_V|{kG-CTqMY-`rR*8F`nZ;JCpb!Hl1PxSp zWE#aS;v`OiK0&t-&>{X?)qa=|UP~VV9s$89Q%z0+f>kc~6;c8JU&fgXOQ%Y9Um~^J z8LE>d%f$q`xGEiFOm8b|A!lQ{K4#oLcZWDZ#S2H`K~EI7(1RGu0Iy54#5VAF?DBU5kXCI>i?C}ZKh_f38yfjE-iL$3_#NxE|ZxZOV5`Xp7 z2b#2BoOd~R>!PYL-QOu;QW;}i0TyA#T~@#;OePwtlmNw4vXsrM6q7oI zh>{}_B`Z@!Q~^XR&=J)K{2O+JL})WRnCFVvW_I{7j~Bs>r#x(;)klB6dXldg(-J0M zM+G|?M!V9K(ucBtNW34*k+#w$;&I|E`8g#vm=~EMPvcn;#rlXy>7GtmO7H1pEu7y` z>X+8?OqF38L2HLN!xs^37XeB&@FyPda4)KCppuN&B3>3bP>Nn!O}`0{G)!C|`7=Q3 z8VMu?_6(3Dq6Sh|Hjn~{wF)9gw(2gTt$GmI77JLBd20a>4}1bXJn(5$prdwlpyLW3 zC;ke9=%^jTlW>TR+5*#9)2&43+Csd^bzEFD?5JWzAw)kV1AZDQoHe4@+xd|%nYg^= z08nvtd#u=uMH>N4)XPq$=!NzvoAc@QKBgq>r*nhPwTnjt7fb9?;7B`ET>I)@3?;NL z`lfnuKWc(SU0PLLVs?JyWHV;xMULS&H&QHK5sbDOujl9J?jJPY!hJ;DfABN;BA+8#H>Y2dEnHHP_?!RXPcR$pPhr_N z6n4ymESL7DPR|Y-{g?{FFl;DZY?BJ}s>4xGc(tzstHX(J?~*!+0_^|rE;X3%)Szvs z2ED2VcBvFUkg5`UGpUmO!*7u1fDC*m;J%-$0Cp5O0b`}q0mrj5t|dbC)^jSYK+V5S zD4Yg|99SZt5Q-;Y3t9J;<;WdTpz0JQ3Y7Ay_Z8#u7yHELw3Pa+)t!1uKX&Vz_>ei_ zH~4np3Om;qxXX15*R3P2M|uAp*E;8ViMw2X<@(!*OXk}klpIIY`ZsZ+1w#4X8;MYA z_+W@HhcUNEwV8Uu0~WH;-o$$^q+T)5kUG;Co9W1fLaSt;~Rn`>*=qrOfJ&>v#3VtFhc*@hIL2W0TVG^))^FcCE0KR(U}|@;yhqG5nD6587N4|OY2;6v znK-*FKs!z|6ASmVeJoJkg%N9+iOR(4n!2(4eVRMXRQYYUr+z@p3RFqEs7iXh>De9h zJh%N_A}0rrwUQlmWp@ZU3zRL>llVZ{ZHgJxCW-`0#rp7e36Lnu-6(geD5PDXma>`m zh*9EQkf{7fts+;D3&>T0kSnA8Ea@x3^XWVU!9tY0H}~b|q)t$w;%dSP-S87a3!Rr| zR)N5MGPd8RB5J41{kw>Zj7^&s+28#vGduhfzsy%-^|ytPsOm^9<_OI^Rq8NCRY5kn zv)4}_EMRuZ1cvk4q#|$iQY4$K`KC6xXMa0Ssxy9A^i!NlMHe_lve7YU{N_2mrXRD% zO6iqS`V=YMEA;xDdQ64cp8ukhcdL|ltc2hxT7~@aQE9aE(tE#dbY!fR9PFb>mG4OB zhHx+wLiWK|r**)71ig-IBt-Rgnm7so9QZQDL$i1l6E`*$);g0)SzA8Z3Np;#ELC;P zD)Fj@?1#!f^lbJd(_5179uMCQl)ng?nQ2kNn8~+~-!owDdD*|`l|4HGC-(bKd|#Au z(uXo>G!aAhLcBjA!?WuWzbk7YkYcCFL`I$i*0u6MTQ$~|e_-zUQ_xubp0zhv@OEAK z`*r0zKLYq~TYa^ONu$m3KFUjP_(Y0kuhpI%d-_l8Gf&)Rp13i1)`n2*z}P!k(O}k1 zkwu==gisBBCho*mhp|jho#*eUe)eqJ)8F!1i+N(QAbDc9dE&ZY&2!6-n3E`~Wb4*Z z*e<=`Kk=m#`^di_X?ElvgXxs2F&0L#cR zTS&(FLNb)IFY(u9v>OfvGpCZ)OE=%Yj!vB>n4A^(_KyghI3n=H1U=p_Xx>NKkwt~2 zC?!)Jql)^8`}z4KT=SOsd%02BQR@j%DHM_C_+ zGq4uV^hAL10XF8sZ4~vxtA|j(Y%a5{RB;)h>2Mi!1{PBaMeju^B{~3T{rtfUtyh9M z8C8&iB|9-&K(a4I43&ODkVLI#jAtCkk6(ToFM2fjbF5RXZI;<85qiMcCNpHl&e%ev$(khtuD)M-x06Pb{s*Ornf z!tLjZbCv<#O-|$#(oWWIieS<&Vb+GAm8!$3hM+~D+zyn#94LR= zjP(?;Xqev2SqhBTbYEbqJu{I%@uQD|iQw3vwU?J-bNhRmXtBlAG`{{^<+hJLLRzZ9 zxcwzDwcMTxl<#5=7xcUlEdQ&Se!=cXOx3hjT=L1;Coh@h>xh!>Q_5Cj^==9*?=`1> z=)8AL?Je9Ldv~nbZJX|!x*Lhdj%Tu&KsLhgc2Rjw&1p~HH5F(5Wb9!rVUxWe6Y(`7 zq}O>qGHc#j{^vmXyBJ)1IDJLRw$IDNdYV{*PNfq3jcsmaWi(XoF%vhIQn|XhC{?&4^beu4C( z^}c=02OLjGxj?F~dS*4#6R*<5pM*Mepi6QlVoWsPYD;)Ohn z?tGIZ=%ve;>KUu=Q>xWO{-~#cO8PKsh^ordcg6uP;L53KG~nW03x0usEiG8oWeT%Qg>h?xH#=1U^?e#9b9c%Ih0oJ{~ z!)&Bw!83xHed*Wqh<3X~I>Ija4hR}P#D~_EU?m-;6tzw#suTJBa z2p;7WD>YF-V)>K3hKkaOV`;Fi`4Jq_j(vdOkW3JcJVxQF;Mma4g)6@x^MKy~yFRYh zoNGUKxm=v>%uRzYHGPqMR+f4?KMx>=lnX@4UOM%@SHOU4FCh}u9JXkx@*A>8W=MROOqnXM*X!VXZz5kM^K?bdXRBsOToy@u zfet?|UJQ0o@QOhaH`ev?tB(>tDM_BADaR}#V-)DDjY?JElFl+RJEX~=p`x%%dGYP{wyI&Y!ulUeMJ^(hcwuS zNdJq2)8F-}>5px$9?ur}1RIdGp<(o0mZ}F^p|r9QPAS7&{8sixvPLb4SIYSm)j6yH zCoa!QN+nt8=c@}XW5CN8h#nobVlFKn7pp3eEon}zG}Zy1h9Uk3zyXa~u?SgMU5n>{fjIr`GUg{E)=ge?~ zg1aNkF2f#iQ?4f!ouo^BzEilKxz-1|q|WM`qF%Pjmyj(+(zWmW$H*Mr=66_q@2F8bO>!Tj0oJ{(4|8K(b1|VIk#SJyB|@Z-V@~?5{Wv{J6F=%b9v7=+j!HoY_x;|iSkq9+G_Z1gXgzSk< zm#Bl$g5mKd2IG$^jNz=z(VS}+G=kmquu{ykfIx{L1(|0ybRx$;hk3`#G*GUs&hsnI zJ;i-5mzQq>gpFK1T=JKv{&M-#PwuaLkudk}hW{_zhwZhOF*qb@DS1RJpfd7EmLPm{=N@;rwk{o$L+*i@tmXCnyeH34A3-JS4WN=$&u~%_K01Swj`9UKWMK; zdh)%eilm@S&aOhnVY{62)Z$7WVu!T>`CZ&*M4ky*lb2H&C0T5XOiC+!QkHO;rlcp= zsvIc{9sH22mnBaP1p*&sUtX$x#zcqYB{9h!29v@pY6DFEk{&$-lcm7qw&5^A9Du|J zSb#;|m^D(~&@dyLA7p3a7~$PM-4!w-cMTWAvOuUfN_z5z5?4d-V&V$)3MqLAdN0`4 zKOE>Kf!^mR&w-vX1U)CSF)A|+I2DuyGxe_UiDhkLjXzI#zVLH+w|L5AS=QXsB_0oi z6=8wd9B-A~VsM@AC1;CJ(=y{I4uiyLQ{bpvyf%$mItdc+fW!$Hzv^x_(+96NubTMHE%X^xwDDXfrsXmA%MS<>DRl9N5}1aHos9u6KbpOT)C z#YCxV)<|Ie5gWk!q=5h?*&L|ZwB)>u{3*q^EU(Jrd=e;rm8WIjsHNkLHQ$ox#;-Ou z$JG<Wc7^^p>(!ivxmM=JgZBGFCXXUIjzzp5gXAXDx+rdv z^~re}zyuj>&k9tK;oLKCSX@$V+}FIyIx=M4S`vG^AW|(_|1V**2kYMux!mjWpe!Wj;ot+o&R4mU$-r)O_;uC}3_BET z*v!x3*0ng}xg)O*;j1c;X!?AetPYvV>seiVMj7h4wn`j){6QxF^*Asy&-*Y^Xtvxw zDaUAg1>k}hvRM9HbFk(Go}V+V7n@BZm~4irv0M4vrS(o=)yz&zAISVa&~qH40v+1^vEek32{J(d^lg zI#WK9`DTIUyQ|daG?RMg^91=UwANT-<~4hIn>_>G&L&>*260T~^g2k!S z76+WhuaX@_r`F4IG=fQ<>KLpt>nva*l6oD|LRE7v&V~V?n!owf_Wouw_o%E_@M0!y z`SAJtoC(~|d)KAjEdC&E$4!-*d?n)xAw=VFRPf-(y`PJ%18&>r-W-Oa9Wk zTis$z2pwfisO_kmfWJq-I7ExSY$n2=5W{p#oy`vBzMl7$uM#|b;Fpb(CF?Eqf;l)p z%g`^`j}L-2v$90CP!Z)fH_9Qb{xo^)HrdrLf_m7x+D8WK*%0iTlbBIutO@1K?5L~C zbt)E0%;i0wsn$G+H^fvvK-V^$smz9;#w|r4ft^{iVF|hQwJfiOh?eoBIEzQ|yvYt{ z0cw4Unhs|!(kZohs$c7%+URhhvYy?4_&gP+^ZU<0ZeO#d*(`saT2k8?Y3Zt&9f27@ ztCz&%nrk*S>rp^}8U#83okG#knK4k?QFQcE0>V1$L-DiLzM91%!TE)<_|_=&yFnKA z7B%PUQBbPoXS~2x(8Vup0q0-H&soML@Ba?oyY$P|PrbbMDAGZ5?JE%PWU6~vq5;~y z$)4@J&q_3~e~R@7=l$G716sdL_NmVMDT#&&@_w}Qeq^EnrOYO~fOpk6_-C*W?u6`; zrGFa9pLgIQvt8E2evf3C)7<`KiEz4hu?9f|tXd`O6h`|G)oV+s3`tOV0@F{&fwD6N zeV4scGC6gc^@1Hk?xI;n`yP_2rm^1chP|%BXxcmVpS7qHj5e`lK&4=`**r8uf*7`&7H^l4S~eZ0P&U$~dRntV<#g&0eHqFx zQYNa2<3&ApbS95i8QNWB;32Or$)hWC4Z?U$klboWHG~@X;;#JDD=0GlIbtY3|b?XLC zf$NFhhP4Y>JJ^{gqD+LLAA8P!O^;uT77Tyy^_w!iBXf7o$*5y}7mE0So-Q!}KBZf3 z;+t}?a-BS26V?K#O{GPXPNK6m(%B#g6)ptGTbG;7`{7};Od^w&K4OV@W;m$5%Q(`6W0fV1Y4blIhO$|_nm2vym~ zs=kv&{Ux+Zp}*?8bF=!coN8`Y=|il;%8C{F=;W`cew5^A>*Vy{fxKIbacd*|u;W4$ zgjhL_qEEkoNX7EL>eT8%5oL6z`lVAx<8TG zKF-x;A%7Y=;0fq}$Dso*z=aSvEqHr~VJNaH$Qc)Wc2GG_qwZ=PncvJL zr8#$E76M+8qw4C{G+G26rJ5BC{A*vPj$mL{SUeEySF({_usfvGyhQfz-Q+Y$#I36A zh6u8FWN_1)PKAk~wA$vAdE&l|v!nWT??~6!bCeDvI*tC|n@r$Te}q(j%+>ut7w@EL zfm}~kAKaamJ^A9mQaVCSX6Xdchn56781LGQPF9I={J`qGv1S*NAacC;=?+*g8f!jQ zO~oxa0|}#_qj(T0b&=VEXXY_@kT=@A@)3|V2wiOqC60aklmo~)HUBhXuM6WsDzKg} z@57_6aqn*kpcTE%_~3JHhy`a)<0mkUhP=h}b2lG|vxUPO%$nznm3NQ^9b(ZmQ6x^& zTJF|;B6u1rXGj5UmHfu`Aq}3+1O5P!2R)IUqF9VA;1=?15*yAJn?0WlUJH^MYu*cc z-Z5Ja{f859Mv)}z;~H&)7KX&@z1)wFa{RYHuUrCCP1IHGmRu)qI~o2SuUB;nRd zP4!_y`$(}$xGny)96k2nUkDS$x^kvww&;CpT1~(kmKZr6 zy(^r!PchTPyga*byq86ebu7wPzGJSHxqNCa$`dobQVY8M%{A+mREhqiyJdL^lI~QV zgcy}*NmsNx_e)f?I|#*b^{fVe&5MgSI=%D>Tq^1(72eMkW)Gf+AgYTK>gIJ8Hk3Fj z_|5cefyi?ibuN~8FG@_dj`GP}YRmfmmx278-CU3F$j_OAnbrX=kyrKH?C|q6mtM;H z36$u=6#70%B_fiesM|VOIA@=POqOk76&|%MtfD!d+uUoS5tha1gVsZIem^}#eyt<& ztJ3*Z{X6+xa)|uS9Fbpz-o}=xAC*6B{k(_B@3l$8+gqjc%hd1F^83%X4~E|ZBk~&w zzfa5WxvB${5~ze$%n}A{fWcdI|6>P>GH7fTZft4NPPLxi2O#t?^E-O9wNVs zM&vgFexI7(Nr%WUcSL?8;P|1i`F(Ljek1Dlsrj9A zi2TNn$ZtgdGS&}YzrXzT;PxgVnc4JUME`zje&0Mqez%OsZ$$roYJR~( zknK$-eZ%yx$qmEbF+xxJl6}6`*V3r{PU1=zX6tJ)o6qB53Km==r`DBkSY=u$WfI|h zt3TQ0OK$X?B*|J|SLyoW7yUEL-j?XguC#=_luVY=51D`vYEHU^&FpA5e4)zz5G(JY zPRT|7g{Jn0Dv8mJr)#v6#e6LeRTBU8;t)r-Vdcmbnwkt%c88K(rLv!l>TRu;^NCPr z?(&77cC!j&V^CMw$C;hJ`l*}hd13>V&VbWL!cvJr^4~@NM0%|_Jhd-exk2h1j$#@b{U<&H39CGe7xz zt#NbFwr1nKK7v*hZO87y_ji+zJ%8szxB6i6ft@CY3{K3L?KU{IHsqF@lJ>09cpt9g0J@}Mo@LB3^mNhIqY>c{Y%HtE+ZC^57t2JjV|-)Ql3|- zz8Qn<@@{!58lUO6F*L|8b(dBZ6{~O>1Z-7{MusM4vZ1W!Pzg{XFMfzNEn#y@k|u>c z-ENBlB99m4RY-T{s^;w0&2gnC?138St>&Tq4xA)T+jC=GX>AWA_$~HJTTx#K5bk?k zTBtC*n4#Ff5gV?qDyME>#3#uxjgn|bf!nd`l+D%M^dlKP_#z4>*Wiv;&eA{Eg{ zZErSiemPXrv;4au77Ut=)PG590qxB_&Bl@e@=Xo6FZufAu7Ucd9raCp^));0JgpAk zC5k52mv0)Xubg5t-dH_efD)+eHVeBH9Bp@4FriG0{W+&{VUPOAjozHKVl$Wp&#Afi zzVoXs0sjcs^euliLn(D1_~)@(OQx8ZM=SSf_0}$PD_Dm~)hra0ql}fSy_o0b;cp0U z$@!S=2hf>Y7Z;fjc2kpeGr7rULgdZXH-yRt3$gUa7Aa79Iq^4|$!@;vk}qcK>q0(F zxCBWh1S%ga+$gitsz7C!6UnxjF4ZTp#E_*8KlUQz5~yTgod47fUO0l}BkNbbKp|U= z*lbmKQ4#wDAI3wW=%Us+<4GANWW%EvYZu_b(E3NHrg!R^7Ojb~x*yz!C!l+W zz?jxE-xQ56T%yFRd?q1t0<&^?yR2w*6VRT6HwmT|m3I`oiOEGL?lG<3WhMTdlQ^Oh zcbS#H%OqYh$xQ>hpdjmUC+>~JRa;i2Hpc26GnoR!>;$eP2G!!OGO4_wM12-^HpsCh zkwi{V@|P%R7}c}XoXt1tnMwyLmrTL=d#M@g#rS&f@bPD{VL?D4I|igNR&UUHIMbG3 z<-@9e!OE*tTh@SRl@AUjotN*VStno! zTK76}>)P4ppt9{F&HChf#mRT!cYLOS+*J;N$~ivy%AQmWgn$5n!>fs-OX3+I@Vrii ztDZ{+DrXkCUB~9>OxGR0-|0HH-@6Xg?_kp5`@P5Q_sS)cRM+YP57qBrA$=hI-pwvA z`aN}+ey6~`L-jk`)WLyI>-YAFOxZJ?ES*kgB?PCXU`Cz{Qwu*i08mN@MX1OYpE8~%J z=8V9RHkGeX7M1C+9J*Yr0b{b8(M8VdL7}Y7C8!r%fb(gDbQ^zg%_{pPxoLrwih3!G z%4&Zl6r{UyUJ;~FNxF5`*{mBwqh#64uWc-NtE>PxU=YO9M>Zpp;gi$gLloi1wicy7JHMG2i*$n(*=>>{kEW)AU zf0tjtixb|_L42|yu>^ADq_;_m#Z2uEweHJ-m@NNWHj7c~*=j?uI01vn{9-qKteDI@ zEM%LBpk^}P`!l{aZtL-HOyYM#-_Drc-5q9{;$lZgYQ>VD0$o^djO0Ns^gH{uOJ@s!Hn zsc0^_kyqgzmA})eDsL73l4Mu5rZY3{2Y=2D2ne2Obtp`adX`jh9QDk24_0ylR%|_7 zW*uDSA0S3u;-pVzdZ8*1bZDPqF+%3pn`=G%pbHB)%Dqwpwz2?<|I6I_z(-YGd*4ZB zLP8RlpaG+zMvX0s*62_h40>~51}8XCs-UQ-X@izl^irJ>sDO!+Nah|!X-j+Ut*!Ll z{-Le+)>@0GRT7YdKS}~rMXic$Z+l|=gSAxxmU+Ivea=iKfcL)7{k-q{Jo$W1W}m(H zS$prb*Is+=wbx!d930=K@fo(uR+G}^qJp{OWS2#{TnW}?z6l2_+A<8t9q8rEGAjj| zU-L2ZS@5bXBLPU)dzw#79v25>;FTKiYd#4FFY~6CUKa=cmCPb-f@-R!Fxd%fcJV%$ zUY6;R++L?kAI`Rvt~KS*-ECkFq2gh$eatgMUClC3g28XRyi?kSq!e{bkOXSNulq55 z3=_&uXX<8;szel;P3%dl>E4_cQyj1Azu;pYkW8<8v&$4(41ASCMNL@Qp-~e)yt~^g znOtNq0MFxsvy)z`$ED3FEew3|3;*#FNl)LC6YXSSNrojtriwP&0Yr!fTh(niG$^Vwzbe>;$UT%O}F6`O=wd`Qp7{E1hGPS}zhhVSl=$laji!yZ2Uf^J*)+q=WfpsKJFM;iG z6m<)#pTN4E_R3X#mz5Y>3EUUJHJHs+yu-HH4 zWma`DiP}rGh&>wy`NYKf_8QJ>|Hj4lpViPzt4;3&aZS@ZRJEb@4pN2QY91WyK%SWa1BRatLe& z=T?6l3ce0TqgIgHgm0axwg%PKS+sJFsl3~8Wmd=qL?dz0aLp&&Dm%hQwL`Lxj`>S4q(jG{$FM``8O#?-A%BBjREyy~)HT@1O0 zgVE~0hJ)KdYFQ}wJU>jsqOOW?us4!efQtcMuqiynGb>x@4rY7>bZAhEyEUd@cKwGq zh#zL~RG8N=9FKv(fe+5GFupXTk%*|@7RK|g;)7}XH{SR)(n{dTbY&~VGBkQcCpfS; zV(=0lShsChJAwzSprpSyEO-oZ$fhvz=lF0Cq6sm8gYRn~S6i^63HG~I@GT1g^KAQh z4_(iThBQ7I4S^>Q9-qOq25DXz>LKHiwRo8s;rZdUctsU}(TD8a;o$Btykb(=hNAYU zI<;Y&2^bk*pDHy)LkS~Q&P!33kXIANjHyHV1Q!)}-83WG?fKx~(Q7hzWK9kP4+<5L z5F?X5ru9)=pm~+zhV)FOW>Kk7uv;~Pu=fOCv$v}SbG`bQ(Pcy6rdEfrB6n-j3bBKk z_m4W>g6|(btb%_LiR;4DLl(V9#pVrFZ2nNi7I+l{QB-1~I{;L-m|LF=D}C6j(BH>r zE2O>lbdal)7z0Q4Rlmr8cwfDx4&XAIZnE z$EdJPS3g)S$KO_v(_1fDc(_=jyusZJpm1_^^$&T=)X)qzJBvZg)x9pwV(_SAP8d9F z%oz+mT)h_H;*iwvVU=pXZV2A>^=H{11V2za9#bxRM<~clv9el5yB>1oVHVFEnd-6U z0zbFgOb=VF`%n(IWU6Si2U0m8s`0@Q-K>Pbx~;?d88vJuxY@9*utr{6b*IXvM$ei$ ze4yYKf*z8eBN+8~TmRXtbH&lh4(DiDK33xY|BjErhs`*s&HCaLN$LC0%*JtN6wPa!0a zaB!m<8!?Dypu<9sq*Hg&K=wSCWku4f!;6qEj*fgK97(0Ggb-+g2gUbhib2j|Acuo} z9GO)=%o##{hBarWtCPU8Tcq%j=>nC0ROGAh!;t@q5vDLvcPEV_cyphsu)s{luH0jI zNOq70p5)MNMmUjz&l{pg<0I}69nMJ15QWk)QMc@U?o1I2iH#uX&8=Q+*52Hm2_O{Q1+J~&U&Jh1_*fiETpxkV48k^#>u(83 zP+DnN{^7*njf2*Y_-=?6jYOl7a5RQR{Na=!N#=k!xMBSEOQGP4s+7z7-BIwM$NRyG znXJV5vjVOw4-fHA(k?i%b3OqvT}L7Y?%5-*xduRHM6{XN#KVfq`^|hL-k)%*joI7{ zEciGjWE^6LQscD+nitlgZP|K;u}L%f$W-H@uwAyYG38%5%`SWJ(p1HRa{rpx^l>Oz zl4|50SU1s1%}C?wmN$~^=aoO4EL+VttNCVi*v4gSajG$234Ez{Jj%d7QdfMeuM(U6 zWY8y+DC6*ZGj(%sr6ekF@6Yqa?5{3vOx;}$t>ZOc;|a05&09`E&m#ZnxRB{PA4zc? z>nF3wWCFcFt4NRFhb3G{0y8IoKMt&8xyc7)G?0UQe=&>HBT5J-FW>(^EakZWokBkT z9~N@8|9_*D!2hU_OaUPeNub0Zu6xkXQ{bN2Xsoc9jRo*-Ji?NK3W-+SudhP(8dt>h9uCh-YWi&oGeqsccnGz#}W0r^!~SKrnYnbb4Bl z{tfS@)5a!oNU6g2ne&f2xHO7eW^^BKt7@}}$_%}@`?qET+!zg;lN0X!JuGNBE73LJ zH%I?;S}ZnC&~DT*t81}EzCs#qjz84rS?f`dV2*m93c&N2^WE1$MCx9>;x@k_^=*Zm z7v99~GEi=!BZ+SO)ZJPh7!%%?*p!ZQ>>6OfPRuclD-%{}D5n-wn+=Z$h%y)FxYafG z8@hiSHBpsYO>+d+y`4!c$(S;0NK@B9+dTw6+!P43FCjpKsC%WMX#@Rk+emZU*6VC|4V&L`H*2DYM%+mwOsd-Pn0lA9ek`G6rY)mV z>Mj#`^O7|l9cDDo?HBS7(#&y;#bYoc$ZyHZ$Mtr4OG91f5*(gz<~^XOfbMg}aq`5S zk;H+rW!XIv^`ANKB764Z{-p?iP39K%deIQ)C=3||+P_KjMM~}!GMEveJS&GBxK2%X zvnKBk@!!15K%K<7Lp1n#LxY#{ziLq!N<{3alGT-bO+kyH%Cr@ge-Zx0uG%)%p^)rD?hvU3KrwVkuPpH!1$XK+ieRvzEx1;t* zW2hvrJg?}aNV!g>@>?0%K(YFJ6H}BZ@yW7k?Hd)-zccKz-A~q&ma&g%-@4>PnXO=7 zfoW3UZt{zcGxkdjvdP=W_2He7kM>|w^$+IQ`RIn7P88FLo&C{Z@4(3HTg10DTbQwt zSksW+*pN6-uylpax0M?mYXdHqc&X%mgvZ;=?nVoWJMhhQRX9XmTMAMKDl%iya7D3NGG~V_b&TGUr_f!yz5m7-4l_N^qAuGq>a>Pdt^FhjjUY=V ze?t~^M+dSNs-iMbRbWixny4LCL}OpXp1meVKYf`UeeDs;qe$9=-)cjT?w7Quv2U3E zR%U|~{n5_IPABoEuC*N9wcJM3dpQ4RYoA zU_*LS1IK)pCd7Gfrie8;gp%!bp}hTjOk)vy8OXSvCftg@3{<-Eu_rSt_(K?8DJOA_ zYaoavC!mW z*8nnt9x>Ut*6@c}FFazcuZO}6eKCD3Db4oe&8v>!2b>h)K*i4fNa+^XL1Xawfsxs_ zh!0aDs0q*wGCq7X!wtTZ!KJ}|2Ep8UWhK8;D-PM^R1J+kE7@u;%r={o==xi^`2hL< ziF$qp3e9K<*~{upzf58L;Afa~G6XF9qpGz?LPgv=o9 zmLuuRAnbhY|I$JDUk^PkX7iYz{|Do*a%jY@H&6`PxBM3)acyQK-al*v4pc<4+-Zm> zM(l7^gN{b)?@bAG^R=h2P>jv)(4exzHSNs&nt()UA*{Q5B>gqPqkIwgQP*DP{0EI9 zG7^MkE=8zGhOwD$>>NIxF0(`b`H1yIJtZ0bgVefYv^vW7NI%<<__$yx_R@`gAv-)XGtJ3jT$AM|SdC}rxX2LG zbSKI^83_MRr&PVcoo+d|8&x!H51hxxZ%P(6q&q%}R_ZSDP@ zcpH8XetI|7FpTeiwArKDYk1xt1Ih41c6brz8*yHGKOZqz7=VuluGWnB6J67nZ2SeT zZ{ZDZFiUSp>@SNS_ZN6tzJ=c*6P*nIxjX!B{y?2&Kcuc^n7yIHS6b%CRVdQ$1R03- zT0JY2u0LeWD(8F-a#~6AO<+R!ji+=s7{nIt6(f}tWBNC}1Fqi^D(vNir9^sauxwv6 z72W{ENNRSk^Yh;_3#J-3MBx6VUD4Dffwe{PF%i2ca-K5P5AxeHz)?)z@VIvofgKp4 z-i~|l#tp_AYnc2HO*QU7hG>|G0eeF}=jV#kHJ*#_KMoutLfgQul=1!#SQ4a`K2j z&;H&Dut9t6r{(w%y`~+1h@SijqS7xA_iMDPK7rj2?x)5%zz}lYaPFf7b4P$cKJT1M z36aFI$MfQWU?(ozO0DDu^@)2$V&i*SR9yG0Av2Ls_Eg^u_^!>YCt2H`5<;O~&ou_+ ziz-5_KWb15nQINo0*M7|G3G9@k4m2p037;!VC4{fHvdSC^hh*h?@NZEyZ(qvmWjPk z>aT(yLaR`yWL}pvAIC=vq}h8US@tHwFLj4sH)Q!ek1TtSMwaZ|{aWdUBp>>~NK}to zN%IY435|sxx4$R6GmJ9;qR<{6OaQfZ_!nSSUyF9%aOMJn9_S?!@_fT7+a>Z8oW{qY zPiS+jc;Mrrq}~h_Jw7ngq^H8K>&Qe6FI<$uM|E3nKOL8AuF;?w4^ZT&-kQ*;$3>oI z3H8pvu}6W(-3{>~uN^l2`u-TW?{72$vbozze9U>3pYYZw;tN0Ckl4GQ>s%re`!L|g zdS3$~Gyj8cWr_H@G1NyM#;E?b3Z~)P2xN@$bFB9Rw?(kDS458SJ|_Um729{X?S4bu zzNOzM>+cYtKG|gdb*t{VW#@2|8H7@iKGi2WaZ708n+zVA_TcbSRxJ6!Ev4@pIr1$O zOC{^048wjM@-?i*2n3Id#xgABjl)>V>R?v()^KM^Tp`N`w(lgB-NQq%xnF{=zNK26*4 zU(u?I;U{jrhxkdh-fMa_+Myg({UyhGPDWw8&L&5%v-P+BJn327VIJ!=!(1bA*f4kX z2e>~%Y2dn*h+Pq7xYsnI&x+s)GFBp`*2Pk9ab#bb2;$DwH3tzL{YmT(EIO6^wWJ^4 zsJl0NBld2o9cr|=FTb(>E$`-D*9&v@Aby6wNPi*Kn(IppKlZB1pbEJ{Wj3a!?f)rb zEFGVgI9L(8Slq3(Yd_6!oZWsbk;;;fSJLMkE=#AA56O{CAhg5oPToJBpwTb5cEM6L zQ9HPor$x)UEc9yP{&@PntbbbFqOfJi(u-`$TY8 z@^Q5#ai}c$&)N0`LfeMgRjYP!(n9UZRSae$O@mYi&)=?VC2S6(U{3Hp&hEKvD&tDz zYzk9vA7j*lCkuDdLyR>@bT4M4PXcXzBG_xybWvw&=w3`CPyU_6@w0^==COFO92>pB zOJao@kRLxbu|j>4A1_(|F_L?~nH9X9dqcMm2~kjwGkO>P3);+bo`P@K`jj%%@Wi}1}O283bPHBi+AqyKZdkv+^+AE%@)OT$^(w=O=G zgL{?uqs}+##I2FK?MpsD(PKYYtx}>X)RPVNEr7kFzQO)OcFee_9(c)Md|(gvbD(Sm zv+^U+`gW&5SK%+(y@`%Z7!&hwbrriS2ID`ht|6%X>Uw@r(HgY=nrsI14-+6wUXSn$ z1rm`j9x#c247A;^#NSlwj$G*+T1-56SwsL2uDUg2J;8AB9VRa$+dW*Zk0YoeXNE{! z&5LyJZTvcK;wH#-zdxGS>^PgMadwfBB34&NNRe>zqo3*KFDUa&Mw}qYc`sTC#@vI| z3kh3+&}R0W77*l4f-6aYeA<5vD%k>12G{*TwoTtACDCTUK&HUdw5Wt00nrMD=IbG*u6?Ge;HyC#jqY>(PzwB41%82W@TF+# z^948e`+qnJai9A&|N8anuQP_O053TFE{R8dytgD!a8=QhhhTt0=gnV|>1q@*m6L2Wo;l=v;{PSGuxG#{H(W zCT8ZkivR;9cBc_80_(nNd^lokF<+F{Z#epPPz0LMNs<%$klrZFO8IISVUBi>rs#^z!Rmy5U?< z4!uAu#bAGkHq?&8=_8Up<2+`+Y!ic9iTU(U3>{mR;Xxa{GrZZ%1nmFjK6;KcB%GQd z6tZ(vi*E*ymUy;yh`wlpNUKr}8?;N+VNzdD13yC`j#-Ic$~S*zr4Pa4Ofw4BM3KCwv*~VLIEH zD)R|WW%2|-9G4tnh#)7+`lUztF1P)dAgR|UXats)iT&}`xQbB_vI8@b(@STnl`vp#^FKT4mmL2Og{;Evl zY5OG8_Rpy8Q(g65R^R-I?LXcyk}REMineTn0JUE&t!&>FN(KTU?hvFZ$#KGisbaQ$ zwBPtNM2yGb@uM})3DO$7#7-vRCpY~(=Kvawq4bcgn}Z9uydgtA?0C>)EmMjM@wWYs zV3ct%Wn>;Nx0x4RNQ_N^hhuneVV-es=0>>iAo3&O<;OWh;la+2<8#ghWYzjd2EN6; zDjG7}(>J`nerLw8`g-#NM4?S#=C!DCC};MJxO^J)y#Hu{GmdZAP`}vrwRbMRzz(!b zIWI5%89Z+-KU1X^rArfadCO0-i(01C0nu>t3|lCWAo!_hP{(|P>1b{(Xyt%EX0TD06K z1;$2RIly_5wu1S1jkZ_bGfB>)bq_=&RroFL<3emKY&^&Py~%t3+h^SOaE<%>Bk%VN zFa3=3-1tK8yI*5RDmX8A-@WF&-=y^C&M3_DQ)n4a1*Qrgsd2m4?XTorv`_6bljGt=HYWdho^pA(1mmr@o^me`#A7po_ zNQ1@R{++imX4Xm^-K zgmyUXcOV(h$>%LbE7CE4x4$kgy{Y}3#iLXHVBO~BMTY4OoT9|zBF(#51Vwx=IgJZ+ z6WIFu8H#ZqIlUpka#SP37_=DCHH(CheFDxw7z|yDCTkc>!jg{3Xy>Ad41>~wcs1uO zEO#KlLGCad1TG5G(V##YWCqF|6+`3O%+IcC8hDf}lJ3Yux)q=x-hdqDKOW2)HeJVzl@HSnid~PDC}xtFqVNP^X?hw6C6A-pp(Kv; zhR@*U-QyP7Y5i#QkeOfY3+Z^{(e!0*jw}E%pHOe`K_3NR#A?|mNDuNWdAd2xxt$Oj zx17Q)Cv>U_6%#tGfx{EEbNyBEQY-}^TjZ6c@8X^@UK;Kge*!%bN?r5!NVBYn{L4FVKOO3*|lhjVU9Z&O(JPbLHrysN9EFu4u&WsR~+Nggq8G(D6Ae> zq7f%^ndZ=V(;Aa0pq{*}47dx_bM5;+qQF9wP{uwV`$B&U~4Z6K*_M{;_x z^T_QQEU|zt5ox=rAaDKckoQ0!<*&1nBh0Gd8$<|MO`5*v!#=S2<8tjBiplb)8juK! zvT^Nn0NrGuZ7YpuvI2X76;Bfu=6tj*;yRC3%jUD_k!4lHIm0+Y4RmOEAl>DBh-X?yW%ZlN`S&sy)a>L2u!~rw_KN%st)=4G14{$N9Ww#|B4040AZ&P}2 z>!7q3i<)B5ME{)FXIuNH^BQyS+Wo5eYSd#B3iF^i&Wj-=c5RBLMxDm3=)+_7xiL(3 znLPKNIV?}>;12}&|2c(8u&#^lsIazxCI;pGA6ZRYIZt^55Ed1{ZybN(QX__zPvGtt;}?yANfK_Ui=N=v7vcmW6J&$*&<)wqU5M=>r}h# z_fIx?Y~BSO`ZL!b9tcs({7#r^@uueach{L#pPIZA&>cS;UhS<(?q2$Ee_>m!roS5U?vU6&4*L#QONge@b!)c~|IdIN6 zBF|GF9uDXDBl0X7o+mLF545MCE}GNnX3kWsbwRVZRx|t#twC#JqS!o(J%#O*d!qwDzwAjj^zbG&cz! z$K~wt5CvZDewx!Kzjndr#Qc1CpYT<~@R*xdX)*RAJuJfB=b6D`?c4DBN)~Te0wS1UC;B6Jgq$6Rv{Y^_BXEJ}(?mR9aeGI&vt+ z4V83&>wn>SnCBUuKAzw6+{t6=kYC^{Dk}09^6&qRzY$q!i2LGn_bsv@7Djt)BM`G7 zD0RgvB&X{(X_0kN%aoE4h=OxsrRx`ZGSzj+EZPD<9Gv5f8!+PTSnXmbef*z;0s@7G zf#Aw!CTR3S6S@mVFf}@#zsU$%!#zq%KCQaS?B-A}yC57ypyd!;t)(4SEXtzT#jz%n z#&GMM6z%FN(tfGF6I$i&)jw?Ot>N z3UmKtE+8t5Ph@dkx9Lt#yKt)FxEEep#DR*IDHrDPA}!)T5r^TDqg@pnNOl)THHR;b zz-V^8S82{C8Kobjr|m-BXT|RFF815CN!fq4nP$KkJ9bqZ>OmJe+O#gvQAUy-U@a== z`uL+`3k8}qH|Nj-E&&)IPP&3X`|I=>l7l~~eiXG#|Mv28G zKql|OeTF!4KV*t^ca9UzoEz1NU@5jJ{^TVnO2S z%eh1%i|_gd8z%;Pj21(NEABlvW)n*H+(7LRTFs+1P?sU$nW7-)n;f7Lc0_+7Wg&l4 zV8wb~4b=oz{5wJJMg-^oW_R zS1YbVoobwalD@u~^HPhCfg{2CH=&4AE#CbFRwBlvC+CVocfC9Wp8=2y|2i%#*eLc` zYk;d~>YWLu1a3IZl+Y9L?S|7jD^-HAPBtZIQ4RlMZwW1cHkc|xlM5CFO!qo}0P&E> z5%-OQ=1Q)c<2x)?`pt0_9T<#rifmVGqLpf#kSvKzc0IGiM%!&>6Fbpa=-ZMkS$_ct z1!%;&o@oNC%!e@t+FoOXnZrT9H34)Xx`D$kG5gmv&DcIf?H`)G?nVq#1K0v+Fr+Ry z$MS6+Ky$hu$AA;?DLmerko1-A+{>_XuSAS0wCO)VTm2Bg@cFXZZ*Lq3%f&~%^LwZ-G065)q@=o ziecXX_MAS{R{!qLLto{4FXY>&n=XiavAe)8abPO>Bbp-{?ah3VDx0VeuH=KMDgVUo z5jA|GBJi5(j3Y08KpO0q$jKB=#u_rpB)*E=LD|qx&}gaeUnpYKgld>}rt`BBP}Kh2 z>?YH*hu#cb&;BTjb#FJb(U<@*ow$^dz+ zdXK3DUQEnyN>z|`@!$X1Si`7_5(2O*4%@xh%VPhE?oDH?ZV+1&Mt7jSf=pp9E|k$o zsKFksaW%(SXSkWge~ir!Lu!ID)f=-O@nN!|ednp?2|1suf^dKtua^83Qr@PhI2GMh zFS|Pfw#rGLX7XVYdsF`pp{`{` z_QwA25dImEa8Yf=09CVcKU`f%*vFP)sf=)~JkfkrVj z;$ZZ~rEd+)3E8t}hU$R7+|O~(OPBevj|m?QYGacJ^bB20xX^`a#t%}IzjRU8?VEEU z+ucIwGgQb9FRTl<1lk`ZtebTxauyzR>SoWUIlKF1=p0!2b^af<)DExIuhNvohc)HK z+yVzKrz!K*l*Ke<_rTPp9I!nSIgN`wfXE-$centj+WzCg&9>V|=K{1}ggq8M)gcB5 z9W*&XEYJ+ioh4JWP5mq2w-=3oWZZRpa2Gtkeku)7CQ(5sHT975PJcc$9O$@)+&PrT zg?!tcR)iXt@^oX6y@Tz(@1IhL%j`(1MJlezHM;yZJS(w39auRCWHikwGoy!RCOQv+ z&A^IRRiGVi(&SjrN$7eYQIRU@MMYAY%|mvvbMq1j&i3np@E+M|{nDg1E_80YtU%d1 zcz3?&hSw;3l^fRQ&Iy+nFfv29%s0(Hkru%=>J5Eg6t*v8yo6^q+9QCY(rNkx)bWgw zDkm_uz#Ru;&8ID+3i6&Ji!c(}gv63+*B5ZZ)3f}xz5{D?jJ0~OEg5h*{XpSUSD9|0 z!cR92Rrr@~*i`sOZrD`#%T%5Y`V)4)_Ui;*Bj8G)e;}0QWNtvV#uE_2?-DQ9Ubz_6 zu2_-PQy^u5Gz!xu?u>ng=Y+bQ?1m_#_C7T4@Ie_r1G9M-#xw6>-qlX5Jlq_c5`)^U zzggcV4vdPI5HB?b+w_S8KJHvRP!j)<2ZZU-TNC8eBfFn3-R1?JZu5*p|Ag3at%Kb_ z%G9i_Wa@+68lQNgm96LK}q?=k$y$|MIPCKyY#L;6Yd22lu zq(ipI)g*BawaLip$MF)iZ<-%Yg%8Q;V{)Q~O_lT9k9V%D6e1D#U6AG^1&}IkeL&F|7P7$MtwoYct>gSzBpSa}r^0JkYB6p0 z_%zfxTn2U>=OpbbEooHE>z%VM6-mO=ohmQ1&>3e!jUCQw1Ptv(Qx8@PmksuHo=xvv zksP~Td=MC5ug%B++wFxGI$KQ$V5r z@%MUG;u7Ec-zJUEJI&`0RyXncln6MQ{9*MRUPAUCWM@2+p!Ku{BM4ZinPsxQvU&@# z6Su@p<2gn*o_(G%5K7&0h&!;01{y5ar&sExl7Wld%do?#n@R`HW8Gsm2Pjqm68lHR zM}$&Mg9FDU_WNRi#C|leMF!IR{R6&`-5;e55mn$B@d#wnKwC<$iOF9H-1AjPgd;B_ z;#1AescdPLSMspxFGEu`N*2CqM1*SB=oe|_^81anGM`uLM&p=*?M**s*k?sjj~UZ) zgg6-`KSHq?M6$QpJH`ia^T|-oaMtm|=?^XE-L{0QX6K6LxW$fPTt`Dbx;t=9tQ)*ICy4&}+(8Ld|ME60< zKGfhd1`ai1x_o{$rW$Exu|TNL`SBGhn5te~h`@<=cgdVvRQeMTq3;7Ayv zkLGj0A>3Y?8vi-j-(NjTpCdFyQdd@Rn8nwNdW4Uc^0A_=RK*Av_r4cXi}R;;`!DpT zH~J1iUkgR1EvgXhdVpU^aq}Sg1>zfvg>6x*y<0Psk>a32%~c;9aN8S|P|IHIVl2`p zkkS+zg-kUs(N*Z{(yLY=pVqds`laycdQ+53-igk0e4CT`X4Ta12Tm$d#E^Po8AFOS zgLiG*zx+h_XMlFbi&N7Q{jVY#(5QK)10*jlKsbm}d)1Q?Sre(^geDM}&u^9UDVYa1 z?}G`QK>_ns02ro>k!gG>_jdp?J$5n$@p6~ocXRo9XyQIj_beZ0tryjD{2&;e*vbCL zi_Qz**IJ;hx`lW)(^nhQbIbRku(gIbX`SG)GIrm`D*}cn7Yamu$!8*;5S&xOZ><;- zW?!&ZQ`539QVGYc=-3TQy^8LlqPy(P{cn7%imv)Gc{ca&;)Ny1Lf;{kD}Ip*`+eP$ z^Y55QBNLf#J7Z<(KC^7>Ut>Q1JfFMot9WlnRh-L;hZ8b}0`1+t{i(7EBE8x*LVV$c zLx8*IQB)RU{Da7 z)H-N(Bs?J@k{b2n;_L=e#Hb1BUZjnD&Cxyi>INBk%`7sxv_BF_V!T05lSk8cPhL6y znX<{Xe5A=GUYL_hQ@XqJ46{~Xu=GX_Pu=E zC{5k3Cy;EG@8P}n0lQtjjBym>X|c7zP>bz))iFnmQ&r^V(7eN;-A+#IcF1~tUMLw} z&0$_l5W=ez!Gs!Ks{pfZ_yL|4=%z^=JCt1Zpg8tCJGGyJVAj)kPzS_Ho>F@MbI3*! zyRn0rOy3Aw)^8+f_5Tz9a#GZKH)Y_CoM@_-iJqH4!&&l_B(MHBVC{AlDHcBx=!VNr z7MDK-E*~p0#Se^Ap$0V0GJhk44~!)frNS^yv2S=hh66D9K#+X-)|&q z)Q)dSEt+6ozlvjJvFZhKV^x}(R_N>I*lMVH0SYU-aMqGxOy;v<@=096FmD@1GY7#D zST?1?=og63zzlokd_e=&XjxPXXFE5RnpH{1DjII!@6&V^XkW>@-JVCIg0Cj_hhtY= zWT<|^MTY1-+@T{ae58=;1CS=!3<$5ybl^aQl$-s9;vNe{>edF)wz7yGluZ;ra4Olp zIl|2*)MsF*KL-3vL<@vx)-$XaFX!07OLo`k-4pwQou}`_so~R=>U$oMZs2=eV%sV8 z1CDJ>E82AMhx5K6Bw31N6C!q#{?+Nn<)sGS zW=-i*kB0X+1OLK`^3~W$QaGUf-qhfGo;lUm*ynUS05^|!h*Cqg!9BFT4?^p-zva+& zD!!NY%^@fx56vX3WB24tBg}m2AxfWMx2szTRXM-84(LW*b0-u*t>98Nd2(4 z%&Vb7v4}Ao?Od-ij6gD0O+?~U`_r3zd!)qeLvENj!a2~OZ8b3J+tYxcgpBmOGm6%Q z?0AdidxH(N{x<;gUxHr;j86dn-J^j2kMAG^p<)x-yh<;7Ky_A`j8|)eD&7zXy_C8f z>f7O5Wq_#KnGeXN5A0s$axO6GrgQf^F_Ld{+IIqJe+iTq&VYWg{q*(yWolrI|E$!t zBLnLSFCvnoBxe;5L6!q47kviws}Z0XR+jFh0=@R`2Hy*w3UUK!I0fibirfSk-0h_Q zLvD{TV~V20apuvx4hNnkS}uMu!(#q}s=CajO_esic~}ckUz&Pcsd~Uu+#a-hhxOqF zZbjA(t4M^3_}+*#FMH754W6>K9!X}jV2m^$$11#9pJ+0}U{r_Ql$p)`$|Ve)ZV?TP zl4dX>&{&+!VQu(uSvMGvzM>m_MZ_+A?G8yez4T5--1`;APTD1CTqp_u)`Vn`2h9pf z&NU!w=_Re}@ib_BY#9Fq5hiV}&v;w2GC=oUnwhlWyt1N%2QenuFEkYzGQ4_d^ZW!6BYD|q9r@e zSG%-Ga5``nD5chQU8!xo9-B`t5k+$^CBWL(Rn3Gym zJAN{*;R&$MgpLeO-J~yStqq#|(b{41Tg&J9@r!Yf6+27+#w8B0`*ao)LMZh$4%B?H zw7(t*)&@-r;nbH(`c;Irfq!}}?LSSgR3Xs*H>L`7E`j!b()e;v4Wjj6#;ggNq>^ao z?7EuNK^}1(7jMEBm~LY44E&JKpy(QtcX3k~2!%&t=PPF6gbP~MQgu6!UBS$!w59gq zqEm)8Vk@)}+r8*Suo53vJO0A>7?9V>j3Cn>EyH5XW<6}qU(yyWBh_tMHk!W7E+-q! z(y^iy!fJh1_`OkTZmE?5QY(!DVf$(J!2veX54!S;JX3YN#ynw=kZA(V6e_;9U8q>z zY8HJ44~z*HQ;+(UmrNnw2hJ5HU!Y^5;4~w*Tdd*(_fMw}`Jf4nUne^g956q{d1kdX zCCVnENHWb1tf(RvhzYbEr!K!HzwY(GiZX)keq#Y4h@ei&GJjyj2U<$`j};*~1nupJ zT_<|yVX-Huv$*LzRN9~3WN%M!ChhGoC%-$MA!n%W{lL8@UXAV}#gJ&b0%pTp=gqLs#t4rnwn@zH^vz0Ucprz#GKBV*@;PDl`{L4_mf1hT zG`M3bc|vs`1nyl8ISGXtU-LAG=4oaplHuo}(ka>IlHMpjvYwDvnoNgeM%+AS-0NK$u;&dFDm>3+ zygF+C-&OHTTixQn0wik#nR&o#DM4J&(ti&P6_I?0*WZPn_DXx}NWqJb3g^%$cZ zS{VZri|WP}i9u8cSr_XFSE4e@X||yyeX*8Uit`uN)W|%%v~6F^WFHrb@Uoa1fm!!FsN z#Abg}rg_g z=2#}D1+p)!)<4-7Vi#oAk{2)vtS3DJe9|mVMp#es87m*UMMvVj>9~xX5vJM*iIDW0 zMfQP-gLL%5L{D*ci~0$DIk3Q5ufg?XCI2uwvbWv5%I?|iuz+*-r#bEWo@KIT_e+pp zws|==x;xnKh&!DIyLI=c?JjL`bGRnawZCJvUyC}!sQ$!};>i)bCp1wsL^hujHBu=` z9+zZL%dgf%veSx9)W4I=5;@q}e*(>ZMp9-pbx}3u#i<+e2PP6;gK6(TWhUj7{cg$_ zQbu5x{!}SnJfqc51bJi*;HAmb)*m{3l)IYGom($0L8_iayoo-@Pa0xM1=j~O&VZEk!RJD$yrv92nUOSUgSm8m_B(tjf3>gu(scWPzz zUb2gMVpZq*qZg+oO>EsTTg#AGM&C$kz0^$1*0m@AeVYyU73YQsCm8-arBVEMaS7K+ zV`;P$K}Cvv(QX6;8LCE7QyD{wes?fMFoF>eP+?X2WjS!eA|thlTWJvh8#`=2&gIXU z`2oIV{498$k^*f-Fdk#*bqEO3wN+^L>{3}?Awc!;VuY+V^^wVK zrb~O1EB!6?KKijf^2ve=sp&iBBV)r=6KJ=2^QJswwq>NoP^VkiZTgN&jC^qQU+sB;VkQ|X;YAONr3`Pr_b4)Rd8@(b<_KFy% zBF1<{0DgqPFZ;BHT8oNsp+`XEV(A#&BGCHgmtrJ%f@>srtf9W6TD`?27aV1BWR}E! zM;6TN^6cUKDmZOSPIGwnhLh8{b81>8ySYR5a80sWcI%`ir&%-^8$vc#84(h!>J_TO zpvtij-k`ibHzSWQ){sOHZFE?$%94rNJ~l4{ZQ>8c zW=Ni9H0#ea8_jEZ!-h@@OZ@DxMX@uK{FRuCc1^GJ%uP)3S{@d=XI45)X zFRWc|EDY|Vo$1(2m{~NrsGJS5Xp)_$-cWK;v9rYe@?1$IjeIF`31=V(uLv&M=%7k8 zjZJ16RCNRA(FcC7Pfk!)9V{GxNXg>bQ4QtGiYg``v=poTl^OeBE_IRV_P&hY{9PG& z3B)5Wy0j(Z*_}@d-x;awd<{v-NH0i*9Pd`z;&BbB%PO-8&W$E^N#Rppq3ulTukI&oI@vyTY?sWg!T(dTBLW zYt^Qq4I{f89Mk`mENB221821KKbIj zrK8rcx`?T-Q#r?&P~qvX5OSMb+fy){gOels zA8DNa7jn!^0ri$VemL%_WHS_w&9M0r0%lC)6ENp#VfAX|Oz5HODYYulA*WYdiX@k2 z;*-xi^Pe@%oz7ANV(=22E8JKHLnHEcCU%M&djhe#3C;!Le9FWIl8dvPR`!^7wifS)X75Nr#+<(YGU5bQ{UOO8^4sndKdJhmzA^>?6UicE!#&`< zu>v1XR%u|8dmy?Qyr^#U&2P;&i=WHZQ4PI&lZyed{Natg$xGSjrsOpEQZGe(#cKcy ze#Qq?_lf%l+UN0hM5V99J;V^SKZJXSaFuVM3-Hu$`{h;&)oN6D2`=4zzy;s^3UQ87sF<8FF?|)NW>fbOMRJrTn_*11la=xMj-cFoORn zLHv}UhJ1(+S`5|0-tL_}c+n|vE54jU)nc!DZ@U5jN|H+8k1={OEVg$PK={Bmo$E7hSIp}3^Kb= ztmVfGxxA#3P=N{6NM~q55vkowsEJuEGgG?+W#%hmLl5r{zPc)6m%SldqjAzx&t% z+kw+==^L+oEc=pjtV}vSPP{cRheRkOPZC9rOGPwFA+5u#lcwUiOrh2dHGs0Aqhg)+xR| z&3yObUy%~ao{}REa>)H+`>RW2;QKRz($Q}b9#WTAYAxPL*!jk%An4}Hp{@Ox@0*64 zNE0U9vU7ZHD~fVj(B1;U3~K`>=mi#zN-z~|B`xH8A6>A8e-cYxN#6U6+CogMB-HW4 zLVeBR)3?uRJ!D!m+ImJ!!k(x91JWY2>08QVoaA0!>HGpr(=4*7UCQC^dynOsf-rAUVJ{NTbEE z=)_*^qQ@&)rtG9*0k4&8{AIp>HieHWZJJxZu=w7TXc%)#0_pI_VlNjmLLjs zVo(2HctN>z0mCCw<1?oL8=Q4#Q;pR8d=fsxex+}FU9@^a;QpncH8go1=9+CUix7f1 zC1%clLf!D}P5{C?CYBW#zdM)4cmao^hgKc2)Y8%tH-SR!>j3Xx#b2Y|dLzzrPNpTE4%dnH8%x z!p=f6X?OV-`tV?5bGP}(j37lnV7@pM&BTi+72l%lhZ>uo^~$JKms>8^Dym)~a{})MLY`cZ`QdUQSEDGmoc5Of1(?BQ()25Sulu}m?Sfy1 zO|Q~ewhP1OdTcs;ToBO(U((6h8?YP-+3y+le3b^4yrnb}NGw^*>^Y5)G3{NJ# zx~WIE1ifK@6iqFALl^A4hwikn!G3+kve^e&Z4gU{2$?C zMkp-1YS zq+Ogi#9VZq_+YBhcXLlTP=FJt*~Q)Aq8jJkGmT;_b%$?yYSL#yb@9iSU+3;8u~z>_OQy#r!tXrPb85pT3;>-qX+wJSwk=S(e)TDp%)Q+W-3nIf$wiJo`#!L*-%gw{^5}K` zve-nwr|90H=vUq7j}*OoDEe8Vxz*w&-v@wVXTU)I1(BKaRm0l*(5zwYhQqzf3;0pPz0S-sauio%kz1W!(us{QlVPLEBv9lFx85q=2#zg=-S z{Ou;;Xz&AVmEg&!cRp;b0P-X1OhD+v2_Eo z=Bu$wBp-^Y#rF4x!@JXkx8ewR*AItR|4Hx~ zhr|1n3-5DBz#BCT-hJ~SR1pdED6!q^puFM0UjCYJbl(F;0>{B3Wbyh;7ahl@`y#3P zMCPKh8~Ufi@6uz}>H|00nM9098@{~A=)ZIHVRow-ZK)^rY0%j(OWhc;lNyLdF`)Hf zjq~i!+~s&Vtk^b3Vs+RKO?Z!QXHs2eo00oX!IDagPrmMbqLrf^P;RnbSy5;51Xf_# zLvd!n<25|cCN*RTEqbVKV_=257(8=Lyxu|r;p}uWplEG3W%IQ2(lX`Dg81FIf8%Uf z%ajTE@jEcME}M|Nv|8UK0|P}p)2hiwQ+}l*MUm96s`!y!xk0-e+$w!3rXp;ibS>h9 zEE*k-9zXAV`(d>FUklqz&sd3M8kApy^bGv3@_8k#>NqMJ0F4%q?+G1gj_1n;B_J0U`grlx^C zLwW8Yc?=9izRsUK&F7`cdTCW_zd1+ZI5}9$|dX zb&(PJ!KFuFh17j=)hA^YyE8xLRqC}#p6|ID=chk*>-9PS5P~PQZ@t^~deMKEVi2B@ zlPz3Az9leBOzy^u?qfzzg@+EGQ87-k52)^sx+kKxIamC|1-ru3YqaU}NfUd9_xWMn zZT#-h*ZtC88h3O3A2DEcCUlb3dZ2~6b6(q=5gb_NZic%Dw&iwL2e!e$Mzh^r%yzbn zecp3(XZOS9&XNP$4x#Y9A7ctS3Ze(Nse2zvy!3YNMSF~!xox0HV&;FC~+GlfxjqHi0Pi`A&X!|72c#E{Rd89ouFaC%1vqTn~0nVz; zqwd7gk^a1;|CuH37~UR_Ml!N*%8<-GTEh*I%pJTACz(5c==SZ;DT=c&lkx)hZDZ|V zXvHJDCwVvY5@>&pAY0swn;kP4H&PTfG=GH3E;2Nm|B#d4o-z8w)Flb=g2mbws+ahB z^|hQoNtqiju0tcITQAIw7i=KdFNo{;OpByBx#KptK+1nEQj;O3o@w$O0^aW`9{8E7 z^;(<5KAuZ&O$?sky0vhf_uBX1esJYIXD=^g#f#J4_1fIrwEkbrfA#OC^$(i=-!uQe zZ~i}I{&zyOo7Q)k{~OK!P3He*^S|5t-)jDEH~*hA|DQGgd(8hW=KnVH|2t5@ruE-7 z|G#JcKV<&@!2JI=^Pj_$C^nr9Qw zR-Rs-7kFOfd6VbQJn!&)z%$5`<|zahr95MJj^jCrCxb)ubJC@;0%Xzmh$zo4oO!Cp z9kYAt6R0P1SK(PVfK?5Fh~3YQQ7r-h(W6c`(Xgjrn%D^9nqtRzvGw*xycO|gztNDq zw1bxdUdTB|+xeIN6CsQe%I3 z5iQe)K0b`3PI|BjTmJQ`j0~~I7G6wpAp9CqUwZ7`+XXw4I%fr$u>0SlTUZ0(0oJsu zBF!H)q^>HCe7RfW8l6k*RPP#V0spc2GFHbLLCNVJ++fF_lgihti0vN8(x5r*YK^Gu znooUWjtshxr`pjPzjFwk>cGYb8U-H)XwOa`4z*eL?9}^QfgT5R*(mP z#Uj3a*Ln$ePegcqN+RLYa|v;V9NQ$!;u}*x*5qy3Q>w`+X-B3OQv%`sCw|FzY4E+v z!av;A;OiDi%(3eB-#*T0Bv_%U1hYal7pynf_qig$W5#4e`oRt|7?vBO2%XKU+Zk9f zpK!~Rz=-%iV0h9;4sA|5%9(QCou?mi8P~<+v^k(kn$JzLk`>kV0k0&ZOm5_A=hR9A zhuJ%^#{JT-FCTNE+nYHMfXc?yZX&l)R8%{qADR>W?QhaV%Py-9+wY+Z6qTs;HK~g8 zz~;5w;V{Or7m*o>gyu&3`@+byz~lZ(+&)Ju3vR~lPW=>E zx6=DsHnuul*@JNRvX+bnkF~8 z$GaB+Fk<%d!R@nk9{@8)Ig<40GV5J*lICFKh4jX*KNZW3Ze=Maos5H*50{*2<`SuO zSMjyfzlI_Yr(84!oU;LBU;BrmFf_0qSuKOU_~%3cT#JBzTPwM)1sDy<>5Ic1-)v*Kf>+#5gJ8=VhWkLC}Y(lR(Qe!`S* z#K&=eLAw6e`IgVzI8)i-4q;;R@vT6tH}2}q@In>Y{V(pwyTldJCOs)%YZKX(w$>A1 z+X$^v-CwxC#tK~C2^X0ZZbK*gCP~DlE*o99P4lu^r3@WpU@}i$#q1Th%z<&oPZF!c z?R0Wo6YUzJr8&F}_?3uU&{tms>Y~AU#>bNICx1~H&D6hsMTd;{6BB5A5M1`u7gJtd zYI;6bVe$1h_&O*19b|7vUQ%xIU#eb6E-FJ7wCoDX;!OCr#Yddxd1PZF&*Q<}{t>)R zuR&+qm|R}NELGq3PV8p!7O@Rk@m`b|tPHfD#LS3Soa)q<-uVy(5gX?%V8bI+@QN!yN94b{=fj;+B7j8s-B`-q~<5NuCvRpYA=+*KOb26ld5Um zOlz{gI&jagWU8I|?7z*DV1q9~%ii4WFBjvUqQ*;=%&U*J-dPmIf>6#B}U(91jJ{5KvFN z5}7sc+-a9x9$&hV85or?f1s8f?mnJj!u z$wY0>&Wl}VU6>+wT$dIX5 z#49j{Oc4`Q#MvsMHm8VFbBh=^RK!RXvDzzQl2=5nikLFI6^n9;n4}_VRYd48%*+yI zp7=a4>phtD9%e#<85s`q^c|^z<_XZzfzOo0^lnvgRdvMyqG%tE>gX%gW0sYo5xQkFvoq z$Gqj&H>B2S7)E>_xcZC4#d)!yslyE0AGCXELytfI+|aa(BF$Ir@c>7gad>A4^M^P1 z^ODQ=_%61zuhs3JUgtty`naJb+7!!+UE>mdVYz9MOQOYu=?Fha8@wE(&B7U{I)YOb zg=$Dl4Z+)&nI*i!K1X305?!c<#MF=$s-GA8Y8G#g0xpZUf9J)++m8vlcuS4CPes0o z-%b^|)ZotLRpOj&z#CrhGuIClymYG1Ez|Dl_7^jCEC_NNSpPThdaGrb*_LW(u8i6* zM>(0meO4)}Z_3C;7cik5n}2ohi|sn7WY+6=D1MfhZX&xHyTb1y&R@5mSTE@%b}S>tbyq(W0#(3a#zyaGGSIXMShYu7xyF*Y>6s@6v;gpXqj4CVqWzO0!{=<~U-t`RJ&FVUl#0fw5DyP(R= zcfLedZw8VZ{{sBANLK_<#FMpzr; z0(^!zu#j7|Vi#aB00Zl${4N~7ke|A-z|hL^ z23vma*ohv?O)#Rff8Zr_LaC~=C`gp~IL~}r4xuUQ38m)aeBU-B)>uiSy5}E6dNf9N6XN9X&xgoB>n=zt0vPTuo}VAq8@AfYXin#hhFD& z`|#UQ8d&jXK1SuT@iwE#oAeFj7x(t9v8OXE2fjesX$o+(ZtSTFTuz`$0W4t0o}vJ} zcI?RtAm@%fNderIjUBJRX#`GG;CKQjC{Rw|cm;|GR1&b(OXxGIp3O`j*cepLO-=t; z;{7aa_xzFOKC87;gNGCr;VgxtslvA|GwvW{*J_OC`JG8pmGiRi+T!l*Vt0EZ{SkAJsAVySd_*u4JS}6dGx4CPh8s_^0ZqJO@1xTF(@BD9;uCaA;Qq8y^)@R9j+I0w`3Uz5&M@~@*1zYGgAHwE)_7^w@d~qRxP^eldRupxc{_kl62)QnDHm}604C7FU5PzFc9*;{)^h59L~2s8h`QEFp0BuwvmTX*HSt4C zDvFc8lCEoD1Sfa+WlelW;_rpADjfqhp9I#u}2aSpiYBW^AP@N4kI?)7Ul}f89ZIpUDr&KZmRUly!$aFi%skYkIDjs{PJ*OAj zdTbCc3Be?Q5X7n|M@4Pzj^hPyT$TBMzH9H9BuIa!|NrxQo<9#ev-jF-t-UVqde{5D z>%F{jY`gzPMl)4nbl)|wp6x0hDR%KjN__S7R%B(2O z!UF?lq1X8@GeCo8;UjMrdYzT#B{gUsQUxej_!s%C#Mx?0HdEg_Ey4%4%EbI|vJ)Sqh5A?3q%LW%;m ztH6P)tmYpxteJz~1oxg@ODMKftp*5<4sXa=w%m-a8(mMmzOs`|101|Gi^i2iTin_f z^ifj|5l$2^!p(0beyF)fSZ1b5=%1>x;pPUyAfAQV zs3NEJqFe)+?)ciT8prj|6BabzY9%Z%z?+QbIoBaQ%#CmLOZjh=p) z-8o1dVOQhEMyqwCt5PdP1H4mt2KuNYcozC89Xyno25BHG!%{Wb>&qc_>MSs4AZCeE0 zyMUIcTzHbp%T5LF2eJCW)T&NqRZ-6ECKNc|r@?wXp2uKCI5|)1^yf&QeX}!@chY%p zIw0No*i`9;ooSrGYKvfhxe~i{kYP2N`I0Bs@My);d9h-msZR1eJGVQ(!k@$ad8tcP zHWIPd>svvUJ)X=IoRq2089~CuB-BVky+!qXUh@y?nX${5urU0z*dHxe8fy~Q)Pxo8wmj9~BLW<3#=HH>DGmjsVm{h*>ITahePr+v%(H@STTOeDbQCK}sE?Xt>GN0bPa}V5 z&b$5J{WyqdUN(o{T1+U@J8SI@=dBlUOuv=I){-`G1r^bqt2m#6##!CDB}x@)ROZM_ znaml6~yp>=$D3rKZGCaWXYai^$6w z9GvyO?Os+!*JPEdk(ae%aMnL$YCXZry1GAWs6XoyV?g6x+vl#D|DZqT-?^UW`kd<& z#_R%qzs_$?K>_~>mX=@e|JOf14d5S5$jz)L2vFB^ZPR-_X7>C$KQC~#G4VxCiad{3 zuwf8YxN=(!njov`e68IV;c(I3XTNHehz_}p+U|$kfW`yO?{HJA)$C z|6!P;Zf?RH_fO^*i#7Cpxv{HRk&l&0@rzf|asr@nyPw;DKh@kov(1;yjWj9o=@4ih zNuEADtk61t`-z1)YeHm6EC>yN{-1(fqlpWPNQw|GF=n#C+1bOW>O>oGQQE z+A+1lMEXy_)u|5if>HE;UjndD3ZR+YuZzx z_Uux7Tqi37+T?fJG+|ASo7GR&0k7WyD@N^0Kv5S8djy&zz!>iX%~QF7dIkxNc6LVO ziBv0aF127ZsLE~~YRn+}E;AK>Z-Q{2>zP}>tJE6T?-DRiZNFTQbfa`nTjU8 z*9-;b{C61N-bz#rIHNH`BsHK$)j_)93&nakzef8~&5Ggc{0{St8Y)#e0Lf${Sqe!; z4cNKyDU%&1v+nxJz!w@~m^gkC!ODMIG;u|VJP!L`gIZssPkKX|xFR@U*nWSpnQ71< zBXy+Nr!-PM8mt#uSoj*OR(U*8%iM0dJ*dI3lU_NsK$x3rB)KZL$@lFL?z9G0^I4{z z!NJY9nfQj;OgiynNKplVPDun;mUiP#QZz#I;3((lba)n59hdGymi-d@>*QP*m>f4=z>AFF=|pe3Vzf&eW)VMUnG15x@y|qfv%*+|ck;O?|uOQ<g zzs5QF_Ed3vX)xD(AP~kAPOsx2`j@7TS*D#?yLdhzm}C3ia|ZL!v|i}MD4or|W_D&< zHuS%dPiyzY+O`4W%@_l@&UR`P?R!H5CaPd(@W_&rMS73NkNP;|hDTbB`%iBeX;tmI zeFV$D;pF(fyg+j!O$N-N+?j0SDFihvLnLXBv##kx;xeRi0}{g18<^#nVAdP=g&IbR zUqGjL@hAvn%mvO35g(C9KVOWUQEhkgu~0+6s_I!h9>w=`N8@CZqi6Avx*J}Db)(T0 zE$_f&xADBwW5rfEcF(9x?5gqYrOBt)mLEheFoIol>^bSuF&CkEyvg31E*-&LZSvOK zs_sC`G-fWnrDgZh7hRd(Bp&-o7y%5rf&&Z!2`t7*RgK-JS-VN2Gq=Y6c13N=UjxmT z0ZvBUx?kTK(P`NzgEQY?n1o6%(x9~*OV(<{{3X_urk%ia;10ogH7qFXS$nme*iNGJ zuhWd$X3O8)A&wK8tlxd=m2B;cCYW#xn|U8NKCFGALHrYqw(M()tL^WV$hKlO;gP-x zrfIkw$0Bu&i*rtIxTxyY+b_`IFe|a4<*!ETJK0Knh@TguB!lqsUG#fw0ui9!$(=?k zn*0~s8pTTFEhMl~!P8YfwYk@Q`4&LZ&pZlX!Z9WI4aQz7cHwPD+=4wIfuQh z#2~795Iw@4CsI??K9+*9tu-EQs$T4`=th?1LYq9(Xg4!jLK`o1CP(fy6B<{GteC3E;~Qnv5^LvU($MG`SHEjlFGT@Shj+SA-OZ-U#7?1fM;`}aA_ej`&t2-3r<51|KV0WlZxALwVZ9@m#IgNqU z9(M(c7h=CcE??mwavE)8w8!Jh_suT<8?yt?U4<4>L_WHE!+?=C<%s>9wgKI8xHF+~ z-!j$!4`Q=HubZ8X^W9HK>=i~Jtei&r!}fgMF@-r+dD`;rAFwMQ&1MpXVWeHn|4AV^ zo~u9`jawrgch%8+6dh3LuhX@aUm&SQpjq0*iZc;T+*&MWq3n=5zNShqD7i2>@jPi| z3y>_ZtrXIt_H>qOfjAyx?$WrgslN{}KbxHbuMZW6>BA3>K1?5GsySXC-T_3^he`B7 z&>|7P+lTWhI-n21fqnP^Sr6&M=s|sOx!?XiSjchc!}lxtDk<8yZ#fMQwD|OKred-) zjRQSR_06PY<{?V6Cc6`G0Rt1MdM|Kig!h#=%vdr`I|Cw)$;|7ijr-1RC~n+$Mj+gk zZm;UP{qM;c2NmzEgxu4Tqb8$^jQ!jhE^~+LIQQXWy2~_QF$OAZjPCn+%u05O8gGQw z^NPViVYy%3@I=ZC$evGjG;}q;4L{JhSj??4xa)D!sCS`MSW<2RlW1n$S+yoqtXKleSlv$Ik5;}zjGWYo>PoE8vV!7G{Ciy8SiPJ zr6!a9Gt#l+Q$vX6Vl>fG92(wad1`5?k!{z2t?&YLyM8j(efO0$(l7{&(10DW)72-* zp1+5%v_t5Fi#6>K#-QtZvyfbW*w;&R{R7j90rq_~);*#KUDFBLxIQP){1BgFPsN9y zud4gj(g6o@{aKMxrq>}N&W-(d_U^x!YQjGU9yd0-yI+YM(_Z$W)wr`HJhVOBY7(nn zo*y;UF8H9cWRs!^BM7=0y-!&76QwDHR{`J-2e{HDpRH_^wLC zzC9qfvc8V2U2E*gfmw-Jef09!*@tBPlb7}1+^qJ@U5TI6F*H%+@xG1G#PTQ)sUlzP zu9T0jR`t%GOWPaHFpXX?!PeM57z+-l)obpzOvMYQQi#HoJ6+{Yb<3S#%Kdxnm@k(* z!7Vq~BGrQ}wuU(ZUA&~Y`%N@)J+iTRWBUD07;kh=qOQ%x16?Qxk;5L-BM((`f?V)a zA34u>eHPg{eRke1HYg@&naIG&|7*}`{b%MZ<$)=5#7@aNx03MrwI98zyy z@O|kmRGQW6wQN9JXrA*2cz>`_HEhH3m_JTL+~d4X`dso*EyLl}vezLIKuRak<_as( zBB_IyG3x88PP9lQGRTg2o4c}=S%X+L*`S9%}@^8-Fd9s%{1a>Ix#Pp znCD0hXusR+#S%d-q)9sVr@Q}xHc%t{==BZ58XpqzaDXPw_NJjiqF%69uk$3w!*FTm z3p-(f3EwK4SBz?U6L+oVA)2u7RP4w=2_AEf$lcG7Z5VTx$!XO4f`w#9tmdNmrMt?zSI@>|3Q98lTEDp{}JR=g0iy0(N{e^sWBs=Sm`I@+> zGn~$vLq5f!#7k}bavCRPhiHvj{3uT~3HuSR#p5im$yTP#9YS$l<<<5E=U+N#KWibI zm~9`Uz87D|91$9lUR$DKDl8K%)i}imnJX`}K=*(0*FcpSQ|BhIE{CrDU6GapJ3*Ll zR76^K&`Iq>2GzQ6G~RNZU-im@zha!jxgXB&=0Ahhd&AKg$9EQHG37nzY~+{7^D&*1UyH)V|)5d;GvaOZJ& zBx|J+S}Tc`Roq!sZv^6BW$Z8uI6b;QO`|RNXxDeL1c}28{-`W~qjK?wd}n#i^8ws` z{E@?{wD8BPyjT5e_|3^;5Cts?%=oA#S$15*QCWWSOW0)66EaFMsbZ`)Ug63?gk4xznD6J$|BZhI{o)Rn zUZ{~AY_QBD1ShN6)W2HW0h!tR#6F#A0O3o!4H(=Rf4w`sa)sn6uE>5-{0e9+0|?}l zMcetw3v)eyah$oP;L1@Hgx~!*)c8&yc|rP-&jT&Lr*Nq8pfAw;AKY2H*999+&PYcG z?{{j!1E_uoz&4Q=N;5e8%VhKCIJS4A69$@p;bz-cTnK;hOVd!n4>08&D)lOJV!9;R z4KqDqYOTG#+V`?pqMizlBop-|q1O4Ms_h6lebtHC@}^bcX(?5G5m?r1HXpG}jr!an z^ee6WA)kl#8AK0nO_yHDw_W16)2!jtlV;Xf|Ke2>b&wCyqC*5#nA+@3)U}4~j|cIr zngN$*y;sEEB6ql3^9(cgo3b|EMyfst#NXHW<1rY_U16o4)r^^U_LeYMLbtS2yYd+4 ztH?hY>6K5bNaOz1`0$;~`&5932Lmk+liU^}Aq?=Fg0Mjf$^nms`WdjLME#qQoLX*< zBjh^(eFp6wlNHH=eZOIl?70#q5VKL|MdJE0hD&+kf1AS!<71>iQ|B)$-tGeTU7@G%eDbnDDm3^K$n zyAk^%fDB|{c3EjL8ojAbZsK3$2bM|U&XUM&nFQMif^*t7Q;oG}rJjWMf_qX{i`U*A$R!;&W&#AV}09E$?T%ARkiz;_T=<*)oX!BCocLY zGg^l55!VFuGlxZ4q26nE$>u_!oC&}!b5e^V$Lc{ku zo6w*YPP?90ux6|cmp7{riQnt|23NUyU9H7DWpPCyekZi!mos7s_x;fRv~#PLAZA{MI1iAY7@$EbV{>;t}9dmYE?;ty3Y68hRlv@Nh=8I9vqlkG3w zzBazMKCoh*QXX$EnAMF1%N@%n@PqnB`b}2$a%q)4QWR)eOddNX#s(|su6|`Y3?Xhc7n)MM$ zd4K@KPf-vV>2S0XX9vPtE?(J%ti1}l-m3`RwR>{zzm{sfIynVn z9U-b*#*OP>sdK?1zA!#7c8lv>$$Tz$9Y-6*!N!e2Vhp>Y0Ix!;YEL3o;lfhi9;7hY zK|!2wJ%h-glr3(5yAXNa&`w66I1lI9(!X&>!Rh?aOn2fhOoB(&1Fl*rM(0JIi{`i} z0$ssu<@rQ4qH=Gj4;JTpgRG!AF%7i+g7*P^%Q=V^IV<}C-zREp)tR6#}UZ|8Znn)(Jd`n-2t7_Eas&(^sQxo&3MAEAL5+GZNKhX%T0n84$m?K^!| z(Q<)AGpCMh<{sdL417fJUL&Z0qK*JgW#<4MfQnOfjr&Qt-7{0B4c?Aah>P14Skb|g zrm8VfThVYV<6>C3OxwKqaf2#>wjz++GuhvsbN)KpRJ*cCwapCGCYKx5t`;lA=d8p} z#M)ISR%Tec5+Ip+w0NtN8KJ7)^G2qSSdYf**35r=QF2}^0)m7j*p7^r2Lm@H_pUc?_&9Q?S7`X zk+!wJT@bck@<7GwM~(00K=Wy8!R*O6+z%`p&%M=nF21mZZ%6WkE;G%Jx)ZU{x$-J^ ze)j@Jcy^3Rw_;_A2U;Fhn6auIffYM=hKenQ_1lNvb15xHnm06z>u3Mkt?~_7_7A3$ z94uW}z;sVI5sA)aPQ~k?dna)pv&4cvgdJpR$+p~NW2u~g^=@|Efq3p>p?dvaTAZ6% zDuw@OsdQpMsObpOk}NE2!P+-7rjL{an#JY`i=NY8_lIn;-ZIQA?t#lt;O%@D<382B z9?;6xeT!GO!OX!x%iEx~;-H5OsFGT;c`qQZ#@A+V@NIDY!39>tsE)7&KHv=;#sl-T zl?_8v<^1Ve?lQvm$v5`_xB)6=(Cv91)F$DLR!0X6V@TM!UoJf^kl7 zJky`+dZr)B>+~ktGkdGMq7t(w_dUwFI}L5#K~te*-j4(#?`4~O7cbi+r|o-ziD^4m zcN=tvur%HGjP7pN-G6gu?SAdp_LEHJU+IOkKL+8`xvO64@aO!b)1NbAy+7x~b^e@d z+tF)!)}OP8^wC||Kanlr?_`RMfn){ zN>;ue6#wu|2pW5r=3B&`Z8!3lBh8wqUHZFpK~B0OTE9WZh(9n3M)+Mo4AGA zWt!}t@-iQ;rOUG=3rvhwYuvuyr`TPDFl=pe%AvB64RUVnZiq zBBgB>{elrmBJz8A21fB}0_#j{Ox;{u1U~~7jdN4mi(no~U%D#PjLYH3+gzzc`5KU)DI$BhFmrA%fvd#L?)EH=;KrUCM+^r^Zk6Gn>+WFkbI|HqLvV;+%*M+MN z&Yxt$7i?KD5!^NEd_{*m0plJM9#YD0=Moa@9%^xNal#A(w)_ z(QAY}l4VAaIK}QLM#}dnCqCl;Sm9$hhVLtPz zgbH;L-#Zz9%aN*21Mwxi91N7EhDK^I`TMK+8adTcZG7S6#RX#iHH>%a<7ONM`3sET zGBYL8+d<}7H)z<*nMsx@I$9@uT?>A$=(j(C51JBNg*$kG&ftz2_NUM7y9Y@B1+r;c zeCLn(3AD(NXmAPBkw3d73JvI`ZWq*w{M>R&q0vQ5-RPYq)Wzl)PdZ>BfrPqpJ9|${ z`%8_|f`vH#7V%MRZ(J+e5J6*ZK`Sjw?@eCb#7)&0k zv1}sdm|9W0a}rccsu)q_{8>#lXG5_Z)Vv;zFMc2gCCacC-fV9MXY#8rF*su|6_>P*Qncsc-4WJBAf+U zHgX4C*pYjtMD9dA6_IGVPunCkjUvS9@WCZ%Rs>oke{|>PF8aDc)AQP;nw~)GGV^NY zT@e(y7TJ*%W_lNV&%|%L!H)dgN^cC8?_?T`ox`X?J_vNdz;m)D5u4GJ*%-KWtn1HFmYsvnJT+dzrjJ=L$E6-@unro$I#B*2CSC zY&`zETUW+C`+`Dk@%NdSn&=^FzsyAZ);R@WwU95!GJKwC3k?i9KZ1Z_hmHl=J@-zo`eD*$!M3HSmgWyrIe_I{F)-YvFK7=S-oY3Wq(Zm|GA99@YH_+1_ zR{Lnbj;675xwX*l=+hpNu$9BU40!yLjJ9liM9sf6ep^}I;-PKxHEVw+SJduE*pqbQ zI`u8b>Hel@A}*0n;x2v6Nxg5-(h*-1c^7DD(wq2L)jfSwq9EfZH;m_rqC?AO%ugj-A7n0(_2*Ww=D5>L2ylr>UGpydow%$|zXuf(8Ab$)t@izp2j z-)B0<;^(-|vxzl+a+^(Fx8?A#ZddL@39yMsM$CCdLhFMpu0iUErDI=@e^J;_3q(Ydw)~)@;|ZZXisc;&m#?#lv*`M?C1En-Jx_|% z6&&m43jtVmZmo-Tf=+4+YZUm1T@?Q!7iZd$FJOrmjL(do{epADUj)yw5r)S~o!BO{ zpBih&wSXBMKc>~O;kH?GfLUZ0(QJ~$ro%)U<>Q->uFS`gq~~wf*aJpwzyFhhoHf_e zp#hx4n`6OZR2Y=om<=49%VP{zkgI|##8tTFZWf1y&{BP5S2 z8fRV{-oO9A`i2j#@10}SNdKOX4y|vqd6B8l|B}f7SD?lkev5G{62EnIG`-XNJ?UN* zVpxiV&q3;$Fcg*VGhX%=0qM6!?c#$Pk}=tM2H%|HJPaLS`m-bUVKg!Epc@oq*zK58 zn?b%=UvI$7tM&+A7-1R1+qvC&t9^)6?H;=we{eX_ z@pa*&CO6W0c}ZU9bD?h-W6ueghig)03!=4T4mn=rhBMIC&HOIW5jE{^B$VTj^u}nq z3k3VIPDpiRsa}TyPji@lGx`!@I_v`->B4yTD7iolqBS*RfAbCk0|lykE4MjUtOumq zt!Ktil;rD4cEaUfSXBhqo54s>o}+}NV?9j-)yY7F6d5fjV6?8jx-;F=is9PW}A?1FJXg9Tpg!q6gH2znoj*TBako^Wrxz-9B%%q z?N?Aea6|1eFj&DdytM+_sO!n1j?UnNq0l`8pIl>iI_qo9BAytn_uk%J!jUKp`;23MzuTh!b+)tei7b41Cso1f`n?bgI=24EtxGd0G#pP4TX23fIlTUq z{m`m+uL-~6&#Cb}Z>8T_tBpA|LDK%5)cCbW>F1cWrTQ7U_9Xojua)jW%D)yYt9A0s z2dtB1ElWNtj<|1(^ehWV;Yd_o_fn@oi3a5fpvS2#k)q`Y!qNp3i$+Bgxrms*iA~0$ zqQng)W=eGc#pFVMYZ18zP^Nt~K2M*MMieYv=0b+QKz(1~oOeWaF#YL-ag5 zzGze~)IR2!_7OCF^xS^`f?dS#N`5_8Zel;Bhwr~n4;53Hb0VumKk93M@E5WtZ|H)x% z`fYzrXOQXX!`7tw-Ptgc^Cpi>1MSyLaMnNfRX@zPKc|h~H@WWQQrcCdRdNmWe)X(; z|H)O#leaNut!W5VXsxBf*({qgS+4ERqOYXzuI|GWL9);+ zVKmwkJC3%f;xD)5Y3Ue$IoUMX!^PQl4;)_Cexk0#nkmIc*GMYRtdJRIV3%-X7GsQ? z8XHz(7R12y@OJZp(Zs@C&(zVHn#3HZCNXbkO=978yE|Ofeo1mFyVtb#_}(G6R0bX| zUF8RG+UjokUj1p8FPewUZwQk7W6s?eE3TcA8!NOL7ZqLCaCUXNBi%!h`L9doszEI8 zwW7!jiPC_Iq&ezm4hWj#?wcVZ(${jL9hXYK-AnX8tGuJCBQUKezOU$(3ch@@`EodN z@oClnI`@0Veho|o%{}tmbum9*Zy2u65`&>={@(y>LnjNYs*_exHCl4d~R$w zDML((thXB{2koAi!q20$ms=Bv^ziZWj%vuFUatYUw;ZkS1s*Tpb0elsY$%4t(3f)O zrz&@w5B)ba84X_PW7i;Pi$BCob=96gT(o<{{(IDZJzV}yxa#i==jV1eY6rI*6?l9Y z!xw1WH(XVAYRq!yzgxK@YJX5&-WQF3QMdG(+GH$QF&Fb-}(_9vpdVXtVCoiw84TmtCNf8;agp+5pmGB`MPvvH_o-<$yM|#x4P<$ z`Nw$lBK3P4M-lb&<`#%cv{R#rF@5roks)m~*8<%BqYTAixAz(7{D4|r`n_B95)>Ec zshLEQA!Qn;;*w(bnn^q|IhUZ5x`|B+NBzWGcw#B3<KX z!P8bh*|WD8s4B=ANnigNN$Jzj3+9XjWExu#K~)&-Oo-_k`_1aAo_LJjqirSZM& z=*?@sjF;=_aNOSx(&}XC)BN;3sE;Sdy_GgeYx(Ju|2UE^ag!$SlOith zxTWs%EIt1#&wqDoY2zn#wVreMLb9}-pVSPV?{S~!>G?dK|Lm4urShlqyvKdNRqv1E z`DOS0qk0b&H!k45-^sJ}l$noY?TU!~Ec8$SPaet0BVCwND@wVv+R~->xT(!uk!H2y zUSVuXq)V^%UXU0!i6(oLRMtY1S>y7F5yhE|;%pT#{{|chm*qkvwPfI9UE|av^j?4& zZ!as~$gtmWFArJ344G!@yYC=7%R**#Ho4a%d!TtjHo46td$3uaO@5GMb%WMH&8dC4 zd_P?7D3MU10BO4Pc2m{^&QHuZssY!TvJuMe$+W)iBx&lQjDV9Alno?W;0iitH09)c?Q9k>Scwh;#}&SAUsqq82Xr+W772?r$XECz ze4v~G<44SnYoqnAOZ*C#0={!TE?`LP?itDa%JOdW88DOmqQ1eWAlUVxu11L-7M`vh zJy~3t#8+fh_tIl@@QI+E0H#}NV6Yyhs$_nZuM2&9QL%_i3uUey{n*D;-sc|hdE(N3 zE8oslliq^H;rbTWja(OUDeY%mKjiv>_p4{+dxEQw#iL*4)BV6}BWbU43IBy=Ugp}I zToFzFrfjcJaMOD-4TRXA^@O*0TXr&FQM+Xhn-_a}jr||eotFrQU9@GMQtOFPjjX4} z$ML7shv!LyuR@Dm;^#R=x15y8TvJhUV6lG+5+Q0C5utLvkQY1un@8{GM1S0OKG##} z&-sC-Zyfc$)~LUj$7){>*^VSP6n=8t^ZNy7U;9sf`hKVeCdX|#V3Ho@C-noK&vTzg z>-k2W|J8lIP|x4u`6aiChxtieq-TA_-fI^B56%6))LEqePUT2Hnfs4P=d+vmNgc)W zHr`d+2U74G<3^Y=`%yfX8;u+@j4$h8SI1MvYXebAw6oMXpFHnlEO$k_yUY%wom0ED z>{L=|4)}B^*Hsb>FD_aXC+@rN>fO1#yL!O8b?&>L>m5kT z|0DOEd&Wh*Z@KT+@?-pKfCZRz!oh^R&^n(vc|WowrbD(Q4nDTnSHl9 z-9_3h@0qU1j$l^obnU?*v5L6T8D3&qurF57og*&^q?mcCGAZ)+q_z3gT96xyXI5=_ z7YogK=rfTQ3ooOh$;O`C+U=Sz=Zd(S6^L{Qyg;^~*NBR231jv%$+5R;oE^T66)~f# zx`$B7B#ZnRTMl=wbc~^iirPs7@GQ;We!$XfTCW8G^F5ou)>lF!V&%}Xo2A0>7s|Y^ z#rKumLJv!~-Xs%De+NGz1w}E+p8uk+E^c=TUJyeQCf5n;EdK@Yfo17&4IF56zef?OonW$2H?( z1S~04*X=Fe6z?Ni?km((AsNogxvJ>^HJ!yK&=nqsKqf0_*OXkIe>9ph?J2>egw!umul_&vf3nWnro5Ze|D=7cA)ihH7@D@ zU=Ka1+S|Y;A8FLhNhIE|*G)VcK%NXrI<1I=*saxQ@wc1|K%{OmFJiN+?Wtwh*1JI} zpiFT#R;Zm~s^Axnqt`i`BbaDC-cJ@D$!?{=i^^u8*ZElvle=RH-V#xRw-U!o98*9y zrb-snS5NEs?kZX*AYUlJYyP7_C6Xv%ye@#YXW&4mb|-tEm8`2vZ*@CAmsj>K)7UQX zirQ$@*(3HjIw8XQ8x7W>wvFle&1I+$JM-8o`;WqnUMssQ;;NnDaw1%Bk`I(*SwO2X z!ikUR(2_c{PyR)n*_`&}s4nEy>5NYsiP+3o7#D^*jU?kKGX@Tal z84k;SE%kkPiNdu~?o36^7}xHswiUi<3zVtO;Br8%LFf7>eVijL;S_XxY%KYznR&vG zB0PP(I2UE~q6Gz!@{UNN5DDdR)*9*6XkQ7iV~YQbCJkHRocZemz(!;zG{U(MBQE{V zSVohf+;|uAFoG?2peJUnIm4}C>xe^Y`0$YfX)@hMrZ%;@??<}R*57w8cg}4oU(R#T zH1GIx{={_?*KJ%^aw+X$uAg(+-mjjO?-{NQg-iVlRoE}2OZVpk{%$lmWR;oz8%AdsE4gal{E^Bj8Ae=O zLxx^sXYh$$>wlB^wtk7PCvM>zqB0mYsEm*Q;87XPWxF)`c5_)BZz7eu1)m{2s2iVw zk}ykV8{nN`(h8J`l$BpliX$4r_HCEr-8n1-L0nW1^8!b>C!6{e4XEGM{MII>w=wDO zgCbBeo!+WH_v+6hqGNDdsQrpN4A!Kj!ChTMeg?RiV4UVS>vjXgbP~FNbuB)(;YNFU z32Gj!=8=Y9-RwN}IWD4ZD@pmEF$5oZE{NZTu=OZ%k_)_E9Bzfe=$EkC+Zhg2P!pBm z1e*gnMj%~JOqT{}jT<2fjX}gWjoF!+_g`;26n3+&O-s#{T(5~xUBUY5e(_1H_=4y#c7fNC! z_RQpE9MU4R+>$O`L0whd4f>22Nq|TTE~Ir)VMFgCY$KmpCM+7ibI&K5|J#}W?VN)g zPxvaU>e>0YBOh&+32W7{_c8m|l%(?P*CgBt$Ct87jw2_TSOcRn_~+31f6?@%CUH(U zvB0bruS*l@lIS^gpV3K|t~GshM>7Hqc%0mV%3SIgQ^mm8t-B7=7Q`s-EC?<%eNuOs z!>{~gYU;(gt^BK5XpKCIIJ~;k;5V7$Hodo6q^<2A`P(eO%o7y}j9{Sa*-O2lJd!xS zq*w91{=gjyqN)g_QF~)`V*XCnPY>}5r8B`WN9zk2KtCIC>bRS>;(NLWA7vc0hg(07 zzdKewZ3@%ttmmEBzTN8z@o_dMPvL>L1b*D{)A(D3$+3AI2Yez*zU_OZWjAK^f$%2h z-G>1u{F5{khFcr*=cLCcEy(KW6<1bYfW=Zu8|l=BDSz4s82S*7u<1SE%`c zA9tC?PtEH{o5r7M`3^FJIxP(o55Y8FGfIa!(xm-+o6>IkpV3OOyZfZg=eEDXw1129 z86&FpKV#b8-8WM0Pt*SHK5a|M;^R$FPBouipUO~9sBqeUg*qF~RjuTt^L(FFeHOTL z40#drDo<#Q6qF;V^*ODN;KE}@ZcY78y)f==eNLRh$PT*-E2;_a8Rk%z<_2+5TRhS7 zZNcg7CT9*=Traq%TUdFxskmmiQ%W$=dT4MygHcU|_lT4P)7Y@Qn-Y38r7Dj7pLoDBZF?B4;BZtDx0GPMe{nY*<6!>vB;O<-3 zvDfF@%i+?V?RIbInBCYBH|pfy2k3Ch{?RYfM9bTaz#V10K)540X>!v+7jT|7fYa4? zq`+b~V9{mpDZx&R$Gke{v!AP77mw+0*f<(C;ShixGIv!!JgaH1Vepo1*><;On?lE= zLydp;T6VEoc74)(j}Nh z@i7z+;~Y@z}}B)$=Uvy4|~`K;mn*k{O}RA|9mApS|+yRJz$AI@lr5P`p?>#J_zWcf1{<-RuyL6hc7!xC4gI7jG|Q zsl?k0eC#LweVYdjt@ssa_={<4cg?Ap=7MZ5opHy(wI_(qfI+A1Qz!NY># zMQ6en_Bta!^5q2n90^42nIOVV_G}C{I_FMH6%v1k7m zY2;DzOK$SZO8$L+@-uGo8%q9DfAS-4^52#G=lbCW+*^4k97AGpbTl>AJ8ay`kI zp>_H`p*^tRrg<|+%<4-G7_al68#I$+KW^=fw@2x&e{c`44~&mfxy@<|`Z+tA^}Y|6Cf$_KvSyZHad%wC z1Ke=e4pk-nny%?{Ms~#?*-x{`hQODWU`4 zngAY&`g)wU_aLwiQ0K~LDUCNVaenit)m1z+)Z7{gz@00ABufEg>R}+W6yv2-&LKJ* zxuF!<;m{mhTNQJ!*1lm=Rzge>jfM4#*EffMm7H*+hQM&??0(nQ?{p z(zuFSGE)Oqp7Syw*0f%8=LSb$K8CyfX)c_D$lW#im@mjPt?m57b>0QqK54NlBF zf_}E{=$`GG-q5i-D!0YoCh#jdS?0tqb{efjg`0Q2&Qwt1Ro|v?)kpI^B}8};P7090 zZgGAs88GBQR2m_5hNS5aq2%H-8djl(8E5N*!hRW9DgeIT%6xd(o*l=w$9GoB>DXZ0 zBKS>O75&5v&qSpgRby|fu{X5+*4}Zwwa4k$Uu>`IaE|wFy7G9G)3M)wNSUwannHfB z&`s;ErNnp9{M*xKp^M$IAKuHf!X%o{d_B(;$-GGB|A@%k(}$W${Raq?nRKS)x{B%zxVX@f5**D-U46ypxlMzE;?+^qHInY=2ktVze3Y4 zLfW})AL`o>F7L4HA@pxRONR|;Dc>$ujc!fDt*&V!zBOpF47|GZViY=YjktWE0z`D$ zFFZsPIY-F1{$quI+leoJB=g-+K6}PMVStfVHU91(rUNs()1^=7t%PhZQ$?U8${F9x zeE|Yehk_L9O+-GN8x1V!2^>-TMmq9Fw8IJdZw6&!{E7KhuhS{0y<5rQ}=L~UJ}_8c)Yfd zy|I34y!`|s?jF-xb4&^8qe(vnx$7}UkT5=lw=2%L&k;p-?F;l4icF+3I6%WDO6)np z<}H{NtzU;M_RRzPIBB}Oah_tD`?jXx4pGodS{8qrmQg^zo!)OgNJP&O?^lGlo~4_r zU!B;AahOPD6Mx5fMI@_q}|mb2PBpQNG=t_@tzbG^d#CRZQVM_g)yPAASps}*74 z^ZWOuQEI))4`@jZ=Fx)AM~gZiE$n|yx$(Ux-C81ND2R zvYykfb&}dK%ihEe%V}QCkJ;81!UvD4vYPfcl4m{=^UKSEu6FhfZmcTHc*8Y;sy0~m zxLoqH4?e>8HwXp0Lo~0HzWq9v)z-&o*Ub%Q@g}Bi#d2aikEoq zDu@M$sf2x3DY^P`Nn8uXoYRyx^H5?v4S?gF>UJHm?oQq0&H^4@>Rrgjg+DQ;dK}w*OVAU(>f0QD_vnVx2ttHveP@?dGP5gOUXq{g zOr4I_{a2Ppm&ZGYc3Y$N49^_`FpSAPDs>7khWzN{M7(ndFYfwy;^m zCF#!A8vRACt=7^c#b{+RoFn+M?{(ld`>NXhi*o>Jp6`utVsTMoc7Dniwm-qhy;xFl zr1e7RcWrhN`fA1iIIbJWUk?E2%z2*?iH8i~k7ElDIGf8VNU6lX|1Rt}5sG_K75N)C z=TBedMkh+OiTWVYqrkFbNU-0iNuKoBXZzC9hef!v;9JBlKvk%@p;(CeIh2Etk6#LL zY^5%aCV#Sw7N(|gqrD?Fg&S=iDNgo&qTK_-*W^#MeMmdzC)z(!rQB!(NfkpP@`b<( z9dvnLxi|9_>kkEe(iFG;P}Dcv{1*24&2N66&Lpir4DI{O{0{4T-~9Ue{$_steL{BD zAMTBu)vi%5ZjW}niFKj)6kuV(=Q`gBw4O#~J_kH>U`XJOkpQkF$C4nUZ98d|U=l-6 zUtiM~6Uj*2Tk4D^uPQ5x-&RCWdMsO3lziGXu)R?8PnMcmr5I;~D zSaGs&iaRAwW(JG1_X|RO0p4)8yoqo0<#`Y5^za$HpWbLM?Q^^bZK!=aya(;7eOtT- zZLNLst)w#AU;7^8!97H~fO^eV)Q61`K$3Ia(1M&Bx#n>#;#$UKbKTAL3$9;rZQ^=? zYX{fcTq&+kxDIgnh85smr66Z7R~{V-aE;|UmFsM->0EVO0(-&xWq8M{PTsTu@^CwS z109dJ%Y%3bIeYds3hpRbA~26~9E$0#_q^lKh;!`^%ndv!l>+~_agtiUwKj26k4{vf z8Dph7wlArf5?K%%%HO4d=3^NHap#w-C``@AJHR&f=xFkSd}A@AQu%gAYD9O=YF}P% zYh8XDGnbQCK7j(Y$p!fq@o&g8F`NvQSlt&Ig9G%t#W#<^P)>Za0rtj|mzoNdpCvZL zdQx@=mN}F(`YH0&ZF=!1ZUn~iV6Y@(&qq)T8OZgZB!=68k3|34Dvxno#v~3k`5Ai$ zSi@B(nMQ2Zfc8K&it+2qJ7h3kwKp)M8#G-;Juno{rlKgJv4oclA!AozUNh|R6)NEr zc@-?mH_raR&!~*Nq;S4Lqk01TV*(DV7=%?M>S$v5LytdnDoQ_M{$)R=9!*3L>S%j_*AluAy?HgJ%*Yub*BcQP0fbpAV zuaJ~0zIQ16sy*`_#!W^x_bY&v)%GL)YWyF0TVD+EMK6D<(909wTO8v=nJzu;ZCa?k51!%y zc#34J%dphm!?tlxy40`tfQb(Jc2Tp(UObp#FQ9O6bK@~C@Z4#3-2tpiTsj#QP9eUh z6ym-tdP9%Lz&s-chP40-<9+I9>`R$Xwe)|gtpXQqX9(49KIJ4b|LcgUp~ zLmtf-f@UqB<|0i(YPgN z-rE(qrvkWqG@(7HF86|D@kn`^D6_nnvW4MR)>i6fk2trVgEIHz)0W*ah%yv)F2X!> zzR!EhelA0wuRkn(4$1gD6k+!u`ka9FxxQ`)^aWFElD|^3A!({nOJK*$FMCK^U(h+} z70B^xkh4LuMkOShc@G2wJdHDqH&B$vdtHtsPDjlUA6E5GYd}ywLn$E&S)h>?!}Jva z)k#`)L8*@GyQfyyZx(yx+u%G!@Fpu4@|6D{QdoNGL)(yxru(*{_+=Z&@EIiHGZ5u7 zc-YtJGt1m(rr&4KP-1xv4S*)UC#yU5TkbL>)*3P^ZH_wI4?&Lkx75zgVY){po49`o8HB=6C(;kA~G_j;juZ4#3A2qW@Z=*)ZlP4ij_ z_6jWwSh$ncoMa&M9!)=n5H(P_9bWdYnC!}EWXqytB^Qq$V(@}LWsK6`gVXj`$j`wf$1uLp0qj6mjXiicjz89C(UEK6Z z2N{as?mrg5)s5xB4VlR5&751_pu;QIA#k7>u_Bb2ry7^MqpY0*(x``M=!x>Yn&(WU zL@8$e#!ja>RbjMpBySJ2h$8j2C;9tTe#vjYMjJ|K!L zci>dnh)a8%(^&F}>0|hUn5}2D`Kh)`qBPMV#WDdE?aRi9t>NHNd&%{cGLpaoD@+K! zaG8EXT$AC#Dininf*PwMjG(jRvpkxe`lhNgk|IXsCh94YkMDMqjr^u=_j~f~!oJ@0R+l}VlYOx$bd@up2IUpZtLFU7XM#<{@0XmZriV*h<&0^MjtIzK@nT1FD&TKn1En~ZPZG} zJ8v^aQf^V^6RPsW^kll$;5(<^_&l^1BDBx`If)hm7tayf@i?5&TF#-d` zKbiBIcC+sM1+8B1o68<0rPhAFhMwji)>OBDue$mYfv)>CsM8u^KG3sd5Nhpp33J@& zeC<=QUa<)@!=28PgPMoiEF9tIk=0)5b*nN%mkJZ>T34g{G$&g{JlD zYW8@;Jr70Aa$CfH6=!A=KgIVAgKDQgjcVm-JP+0LeeUx(o{xwP73*c*59j$vh?QpZ zC}@w?+8eb%T66d=XCNUZqLeDt=Opxqxbf^1c;{u__%C1nkH%k8Yx<(`XDT!WXmS)9 zHY#=FfWaPCjcv=G?VND54|B)N3}C!n8|mLcWt>t!uAJ=*!o1QClPzDD|fZ_(i^hT@QLp4yQo$P`{_k!4Q#v^_F7}9n%$quRykN93EQ;(Y=-Z|`J5y0b7 zfe4Q;n${H_KeUinD(LirG+sBlWulz6EA20&Sw?!KOjr())~}Xz_Hp!aga?$vS zxJz5vB6JL~@9ca}VDB*ra9vXr)oN;{M{1JiM=xxu-7v49%| zxI{qNFQ}N- zJ~N$(xM*#N^DtRlnbY~)^>6>?{G+H}KjVL;&#z*u@s9D2g5Gsu=8Al+BRX^)0Ot|u zEbgN-^s-AmdwDFA$B@ll9?fyoC851M<4hit?&VRR$)i#5^6W#v=X=16MTWkfDq8RV zL}Wip8J8OOdGvL^9>?LyZs;SUEUnMm{&$vU_or1R1=0uwwmZspnkV$8F>>J693I_W z<|wtF5Mc8cA>eNQEMG$sScd0i^KUn@HnUAZ$8g}Tjfv+9J-(Ts>vi(4Dv8{ zr>IRqk4w5+fsbNv1%aRcjY8cXStHR2WK9U& zVEjkI%_@ujOpsxzDG_x3;AR@^KvI=t{5Kn4P)+YizzwYZU~v}K3?;=@B8e7uanfPY zY)h9DiJkz0FelM^6X}GlWFaB8J_#&kOK90(bb~L`+}Zy2U&2p`2Z{D`758mnv}ouY z(x7L>i1d|_-FO}rH95yb01-Dw%@tu;SP=J~o;%-{l+3=FqOu%x-Hat?4E1fYs`rT3A9+-v#!!&#*aR8DqOaNdS zUUc4(l&M{-8>V4mg>>9~yH(I-8!*r7joM`E26{i~YA$Q!vxalHyR3;@=U0@^Fb^jU zW**uoW0(h*-WC7w07+JI?AeNWEDMZ#A7Uo#%>zd5UqRg3>F;ofT%fM(Pws9nCKDoC zb9k8D-stDef;MjCeT0Kg`-S*kLv6cp35lh?cW6x@oQXl^+JtF-LNy4mJZS520cn=l zIN*(g+X4CdDQ^RP?x$2k&{;L0TxLOND#8C5e`Gq_4jPYg*iE8CPcy6Sea2!&WH;P! zkR(RqT?lgLe8Y__JjK2YJBcl}t)&PPXJ{1VonZ2+N@tY5%}Sahh`C<47IDSx1Q^rN z+<-IYL)zn70?Gx_M^XFh3!ge)9|wz0wpTQA3)dgt8wv+%+M`V!IwPyD-_B&FOJ8FH z>1wW261L7On)zv6u0xrqea~JYDe5S9=FF)|#+C`hFrQ0e?imBh#}r}csm z#l~=_Viop^;3375Gb~f?yDAs1v{bN61@i1xQZCQ1W`KDkmyo2G`K zTZ5ie!{w$8Iz*#}SzZmN*emAfHn~yzEQ&oGXfo(3o;t^L z_=J}ezmOBF${jFkzbu9T>uP!4jK>izyZl=DQacSC(GsM_Pht1xa`)$2{ZLzucEChS1wTBM@Y8L+0L6z+*Dv&C zrv`H*qv$$Z>yIqIt zh{2y`J}McJS0t~?Oh;CnoLFPdc&7YY2@ugR%$c>#gNb9J_FYo##*QfH+=38EB9e{I z^OiBp7SE2AZvL6?MYCV}Ky@MeT!=N2_a$4scl_SRW*_=7Z$DsCv_6e>Q_u)20bTfH zNS+?!t!clL_gze$*oC$`d*|k|5sYAe4HJn6gT9E}nHr~v;bBZp?8{p}x3DzPTLkZ~4~wda%8-rW9s0eDOl+66yR#ISGc)dBOSOU(@L)Sgxp?Y=J~a4XK7Bx9