diff --git a/.cirrus.yml b/.cirrus.yml index d942f851c95d..9b1c5a72c2cf 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -10,9 +10,9 @@ FreeBSD_task: BS: cmake matrix: freebsd_instance: - image_family: freebsd-13-2 + image_family: freebsd-14-0 freebsd_instance: - image_family: freebsd-12-4 + image_family: freebsd-13-2 prepare_script: - ./build/ci/cirrus_ci/ci.sh prepare configure_script: diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000000..e4b8a2f5e440 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,15 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + groups: + all-actions: + patterns: + - "*" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1d7b32e235a1..3ecc4434cd11 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,6 +2,9 @@ name: CI on: [push, pull_request] +permissions: + contents: read + jobs: MacOS: runs-on: macos-13 @@ -9,7 +12,7 @@ jobs: matrix: bs: [autotools, cmake] steps: - - uses: actions/checkout@master + - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: Install dependencies run: ./build/ci/github_actions/macos.sh prepare - name: Autogen @@ -32,6 +35,7 @@ jobs: SKIP_OPEN_FD_ERR_TEST: 1 IGNORE_TRAVERSALS_TEST4: 1 MAKE_ARGS: -j + CTEST_OUTPUT_ON_FAILURE: ON - name: Install run: ./build/ci/build.sh -a install env: @@ -41,7 +45,7 @@ jobs: run: ./build/ci/build.sh -a artifact env: BS: ${{ matrix.bs }} - - uses: actions/upload-artifact@v1 + - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: libarchive-macos-${{ matrix.bs }}-${{ github.sha }} path: libarchive.tar.xz @@ -53,7 +57,7 @@ jobs: bs: [autotools, cmake] crypto: [mbedtls, nettle, openssl] steps: - - uses: actions/checkout@master + - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: Update apt cache run: sudo apt-get update - name: Install dependencies @@ -78,6 +82,7 @@ jobs: BS: ${{ matrix.bs }} SKIP_OPEN_FD_ERR_TEST: 1 MAKE_ARGS: -j + CTEST_OUTPUT_ON_FAILURE: ON - name: Install run: ./build/ci/build.sh -a install env: @@ -86,14 +91,14 @@ jobs: run: ./build/ci/build.sh -a artifact env: BS: ${{ matrix.bs }} - - uses: actions/upload-artifact@v1 + - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: libarchive-ubuntu-${{ matrix.bs }}-${{ matrix.crypto }}-${{ github.sha }} path: libarchive.tar.xz Ubuntu-distcheck: runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@master + - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: Update package definitions run: sudo apt-get update - name: Install dependencies @@ -108,7 +113,7 @@ jobs: SKIP_OPEN_FD_ERR_TEST: 1 - name: Dist-Artifact run: ./build/ci/build.sh -a dist-artifact - - uses: actions/upload-artifact@v1 + - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: libarchive-${{ github.sha }} path: libarchive-dist.tar @@ -116,11 +121,16 @@ jobs: Windows: runs-on: windows-2022 strategy: + fail-fast: false matrix: be: [mingw-gcc, msvc] steps: - - uses: actions/checkout@master - - name: Install dependencies + - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 + - name: Install mingw + if: ${{ matrix.be=='mingw-gcc' }} + run: choco install mingw + shell: cmd + - name: Install library dependencies run: ./build/ci/github_actions/ci.cmd deplibs shell: cmd env: @@ -140,6 +150,7 @@ jobs: shell: cmd env: BE: ${{ matrix.be }} + CTEST_OUTPUT_ON_FAILURE: ON - name: Install run: ./build/ci/github_actions/ci.cmd install shell: cmd @@ -150,7 +161,7 @@ jobs: shell: cmd env: BE: ${{ matrix.be }} - - uses: actions/upload-artifact@v1 + - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: libarchive-windows-${{ matrix.be }}-${{ github.sha }} path: libarchive.zip diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml index e5c60e4b0de2..9dd1dc3ec1a0 100644 --- a/.github/workflows/cifuzz.yml +++ b/.github/workflows/cifuzz.yml @@ -1,5 +1,9 @@ name: CIFuzz on: [pull_request] + +permissions: + contents: read + jobs: Fuzzing: runs-on: ubuntu-latest @@ -17,7 +21,7 @@ jobs: fuzz-seconds: 600 dry-run: false - name: Upload Crash - uses: actions/upload-artifact@v1 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 if: failure() && steps.build.outcome == 'success' with: name: artifacts diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 1f219fc695a0..b9e4dcc48e5a 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -1,5 +1,8 @@ name: "CodeQL" +permissions: + contents: read + on: push: branches: [ "master", "3.5" ] @@ -14,7 +17,6 @@ jobs: runs-on: ubuntu-latest permissions: actions: read - contents: read security-events: write strategy: @@ -24,18 +26,18 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@05963f47d870e2cb19a537396c1f668a348c7d8f # v3.24.8 with: languages: ${{ matrix.language }} queries: +security-and-quality - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@05963f47d870e2cb19a537396c1f668a348c7d8f # v3.24.8 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@05963f47d870e2cb19a537396c1f668a348c7d8f # v3.24.8 with: category: "/language:${{ matrix.language }}" diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml new file mode 100644 index 000000000000..b6c4f17a9b31 --- /dev/null +++ b/.github/workflows/scorecard.yml @@ -0,0 +1,65 @@ +# This workflow uses actions that are not certified by GitHub. They are provided +# by a third-party and are governed by separate terms of service, privacy +# policy, and support documentation. + +name: Scorecard supply-chain security +on: + # For Branch-Protection check. Only the default branch is supported. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection + branch_protection_rule: + # To guarantee Maintained check is occasionally updated. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained + schedule: + - cron: '42 8 * * 0' + push: + branches: [ "master" ] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecard analysis + runs-on: ubuntu-latest + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Needed to publish results and get a badge (see publish_results below). + id-token: write + + steps: + - name: "Checkout code" + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@0864cf19026789058feabb7e87baa5f140aac736 # v2.3.1 + with: + results_file: results.sarif + results_format: sarif + # (Optional) "write" PAT token. Uncomment the `repo_token` line below if: + # you want to enable the Branch-Protection check on a *public* repository + # To create the PAT, follow the steps in + # https://github.com/ossf/scorecard-action#authentication-with-fine-grained-pat-optional + # repo_token: ${{ secrets.SCORECARD_TOKEN }} + + # - Publish results to OpenSSF REST API for easy access by consumers + # - Allows the repository to include the Scorecard badge. + # - See https://github.com/ossf/scorecard-action#publishing-results. + publish_results: true + + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF + # format to the repository Actions tab. + - name: "Upload artifact" + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard. + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@05963f47d870e2cb19a537396c1f668a348c7d8f # v3.24.8 + with: + sarif_file: results.sarif diff --git a/.gitignore b/.gitignore index 359b652368d0..8dc637ee132d 100644 --- a/.gitignore +++ b/.gitignore @@ -47,6 +47,7 @@ CMakeCache.txt CMakeFiles/ DartConfiguration.tcl cmake.tmp/ +.vscode/ doc/html/*.html doc/man/*.1 @@ -74,3 +75,5 @@ test-suite.log .sw? .*.sw? + +*.pdb diff --git a/CMakeLists.txt b/CMakeLists.txt index dc1fcc72a7fc..c0fbd70b38e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,6 +6,9 @@ endif() if(POLICY CMP0074) cmake_policy(SET CMP0074 NEW) #3.12.0 `find_package()`` uses ``_ROOT`` variables. endif() +if(POLICY CMP0075) + cmake_policy(SET CMP0075 NEW) #3.12.0 `check_include_file()`` and friends use ``CMAKE_REQUIRED_LIBRARIES``. +endif() # PROJECT(libarchive C) # @@ -20,8 +23,9 @@ endif() # Release : Release build # RelWithDebInfo : Release build with Debug Info # MinSizeRel : Release Min Size build +# None : No build type IF(NOT CMAKE_BUILD_TYPE) - SET(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build Type" FORCE) + SET(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build Type" FORCE) ENDIF(NOT CMAKE_BUILD_TYPE) # Set a value type to properly display CMAKE_BUILD_TYPE on GUI if the # value type is "UNINITIALIZED". @@ -31,12 +35,12 @@ IF("${cached_type}" STREQUAL "UNINITIALIZED") ENDIF("${cached_type}" STREQUAL "UNINITIALIZED") # Check the Build Type. IF(NOT "${CMAKE_BUILD_TYPE}" - MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel)\$") + MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel|None)\$") MESSAGE(FATAL_ERROR "Unknown keyword for CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}\n" - "Acceptable keywords: Debug,Release,RelWithDebInfo,MinSizeRel") + "Acceptable keywords: Debug,Release,RelWithDebInfo,MinSizeRel,None") ENDIF(NOT "${CMAKE_BUILD_TYPE}" - MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel)\$") + MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel|None)\$") # On MacOS, prefer MacPorts libraries to system libraries. # I haven't come up with a compelling argument for this to be conditional. @@ -124,8 +128,6 @@ IF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR # either of the following two, yet neither is supported as of 3.0.2 # - check_linker_flag - does not exist # - try_compile - does not support linker flags - # - # The CI fails with this on MacOS IF(NOT CMAKE_SYSTEM_NAME MATCHES "Darwin") # Place the functions and data into separate sections, allowing the linker # to garbage collect the unused ones. @@ -135,6 +137,9 @@ IF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR # Printing the discarded section is "too much", so enable on demand. #SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -Wl,--print-gc-sections") #SET(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} -Wl,--print-gc-sections") + ELSE() + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-dead_strip") + SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-dead_strip") ENDIF(NOT CMAKE_SYSTEM_NAME MATCHES "Darwin") ENDIF (CMAKE_C_COMPILER_ID MATCHES "^GNU$" OR CMAKE_C_COMPILER_ID MATCHES "^Clang$") @@ -216,6 +221,7 @@ OPTION(ENABLE_BZip2 "Enable the use of the system BZip2 library if found" ON) OPTION(ENABLE_LIBXML2 "Enable the use of the system libxml2 library if found" ON) OPTION(ENABLE_EXPAT "Enable the use of the system EXPAT library if found" ON) OPTION(ENABLE_PCREPOSIX "Enable the use of the system PCREPOSIX library if found" ON) +OPTION(ENABLE_PCRE2POSIX "Enable the use of the system PCRE2POSIX library if found" ON) OPTION(ENABLE_LIBGCC "Enable the use of the system LibGCC library if found" ON) # CNG is used for encrypt/decrypt Zip archives on Windows. OPTION(ENABLE_CNG "Enable the use of CNG(Crypto Next Generation)" ON) @@ -523,7 +529,7 @@ IF(LIBLZMA_FOUND) "#include \nint main() {return (int)lzma_version_number(); }" "WITHOUT_LZMA_API_STATIC;LZMA_API_STATIC") CHECK_C_SOURCE_COMPILES( - "#include \n#if LZMA_VERSION < 50020000\n#error unsupported\n#endif\nint main(void){lzma_stream_encoder_mt(0, 0); return 0;}" + "#include \n#if LZMA_VERSION < 50020000\n#error unsupported\n#endif\nint main(void){int ignored __attribute__((unused)); ignored = lzma_stream_encoder_mt(0, 0); return 0;}" HAVE_LZMA_STREAM_ENCODER_MT) IF(NOT WITHOUT_LZMA_API_STATIC AND LZMA_API_STATIC) ADD_DEFINITIONS(-DLZMA_API_STATIC) @@ -654,7 +660,7 @@ IF(ZSTD_FOUND) SET(CMAKE_REQUIRED_LIBRARIES ${ZSTD_LIBRARY}) SET(CMAKE_REQUIRED_INCLUDES ${ZSTD_INCLUDE_DIR}) CHECK_FUNCTION_EXISTS(ZSTD_decompressStream HAVE_LIBZSTD) - CHECK_FUNCTION_EXISTS(ZSTD_compressStream HAVE_LIBZSTD_COMPRESSOR) + CHECK_FUNCTION_EXISTS(ZSTD_compressStream HAVE_ZSTD_compressStream) # # TODO: test for static library. # @@ -1187,7 +1193,7 @@ ENDIF(ENABLE_ICONV) # # Find Libxml2 # -IF(ENABLE_LIBXML2) +IF(ENABLE_LIBXML2 AND HAVE_ICONV) FIND_PACKAGE(LibXml2) ELSE() SET(LIBXML2_FOUND FALSE) @@ -1348,6 +1354,68 @@ IF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCREPOSIX)$" MARK_AS_ADVANCED(CLEAR LIBGCC_LIBRARIES) ENDIF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCREPOSIX)$") +IF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCRE2POSIX)$") + # + # If requested, try finding library for PCRE2POSIX + # + IF(ENABLE_LIBGCC) + FIND_PACKAGE(LIBGCC) + ELSE() + MESSAGE(FATAL_ERROR "libgcc not found.") + SET(LIBGCC_FOUND FALSE) # Override cached value + ENDIF() + IF(ENABLE_PCRE2POSIX) + FIND_PACKAGE(PCRE2POSIX) + ELSE() + SET(PCRE2POSIX_FOUND FALSE) # Override cached value + ENDIF() + IF(PCRE2POSIX_FOUND) + INCLUDE_DIRECTORIES(${PCRE2_INCLUDE_DIR}) + LIST(APPEND ADDITIONAL_LIBS ${PCRE2POSIX_LIBRARIES}) + # Test if a macro is needed for the library. + TRY_MACRO_FOR_LIBRARY( + "${PCRE2_INCLUDE_DIR}" "${PCRE2POSIX_LIBRARIES}" + COMPILES + "#include \nint main() {regex_t r;return pcre2_regcomp(&r, \"\", 0);}" + "WITHOUT_PCRE2_STATIC;PCRE2_STATIC") + IF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC) + ADD_DEFINITIONS(-DPCRE2_STATIC) + ELSEIF(NOT WITHOUT_PCRE2_STATIC AND NOT PCRE2_STATIC AND PCRE2_FOUND) + # Determine if pcre2 static libraries are to be used. + LIST(APPEND ADDITIONAL_LIBS ${PCRE2_LIBRARIES}) + SET(TMP_LIBRARIES ${PCRE2POSIX_LIBRARIES} ${PCRE2_LIBRARIES}) + MESSAGE(STATUS "trying again with -lpcre2-8 included") + TRY_MACRO_FOR_LIBRARY( + "${PCRE2_INCLUDE_DIR}" "${TMP_LIBRARIES}" + COMPILES + "#include \nint main() {regex_t r;return pcre2_regcomp(&r, \"\", 0);}" + "WITHOUT_PCRE2_STATIC;PCRE2_STATIC") + IF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC) + ADD_DEFINITIONS(-DPCRE2_STATIC) + ELSEIF(NOT WITHOUT_PCRE2_STATIC AND NOT PCRE2_STATIC AND MSVC AND LIBGCC_FOUND) + # When doing a Visual Studio build using pcre2 static libraries + # built using the mingw toolchain, -lgcc is needed to resolve + # ___chkstk_ms. + MESSAGE(STATUS "Visual Studio build detected, trying again with -lgcc included") + LIST(APPEND ADDITIONAL_LIBS ${LIBGCC_LIBRARIES}) + SET(TMP_LIBRARIES ${PCRE2POSIX_LIBRARIES} ${PCRE2_LIBRARIES} ${LIBGCC_LIBRARIES}) + TRY_MACRO_FOR_LIBRARY( + "${PCRE2_INCLUDE_DIR}" "${TMP_LIBRARIES}" + COMPILES + "#include \nint main() {regex_t r;return pcre2_regcomp(&r, \"\", 0);}" + "WITHOUT_PCRE2_STATIC;PCRE2_STATIC") + IF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC) + ADD_DEFINITIONS(-DPCRE2_STATIC) + ENDIF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC) + ENDIF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC) + ENDIF(NOT WITHOUT_PCRE2_STATIC AND PCRE2_STATIC) + ENDIF(PCRE2POSIX_FOUND) + MARK_AS_ADVANCED(CLEAR PCRE2_INCLUDE_DIR) + MARK_AS_ADVANCED(CLEAR PCRE2POSIX_LIBRARIES) + MARK_AS_ADVANCED(CLEAR PCRE2_LIBRARIES) + MARK_AS_ADVANCED(CLEAR LIBGCC_LIBRARIES) +ENDIF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCRE2POSIX)$") + # # Check functions # diff --git a/Makefile.am b/Makefile.am index 83bbeee0b7e9..286f08694c43 100644 --- a/Makefile.am +++ b/Makefile.am @@ -289,7 +289,7 @@ endif # -no-undefined marks that libarchive doesn't rely on symbols # defined in the application. This is mandatory for cygwin. -libarchive_la_LDFLAGS= -no-undefined -version-info $(ARCHIVE_LIBTOOL_VERSION) $(GC_SECTIONS) +libarchive_la_LDFLAGS= -no-undefined -version-info $(ARCHIVE_LIBTOOL_VERSION) $(DEAD_CODE_REMOVAL) libarchive_la_LIBADD= $(LTLIBICONV) # Manpages to install @@ -454,6 +454,7 @@ libarchive_test_SOURCES= \ libarchive/test/test_read_filter_program.c \ libarchive/test/test_read_filter_program_signature.c \ libarchive/test/test_read_filter_uudecode.c \ + libarchive/test/test_read_filter_uudecode_raw.c \ libarchive/test/test_read_format_7zip.c \ libarchive/test/test_read_format_7zip_encryption_data.c \ libarchive/test/test_read_format_7zip_encryption_partially.c \ @@ -632,13 +633,15 @@ libarchive_test_SOURCES= \ libarchive/test/test_write_format_xar.c \ libarchive/test/test_write_format_xar_empty.c \ libarchive/test/test_write_format_zip.c \ + libarchive/test/test_write_format_zip64_stream.c \ libarchive/test/test_write_format_zip_compression_store.c \ - libarchive/test/test_write_format_zip_entry_size_unset.c \ libarchive/test/test_write_format_zip_empty.c \ libarchive/test/test_write_format_zip_empty_zip64.c \ + libarchive/test/test_write_format_zip_entry_size_unset.c \ libarchive/test/test_write_format_zip_file.c \ libarchive/test/test_write_format_zip_file_zip64.c \ libarchive/test/test_write_format_zip_large.c \ + libarchive/test/test_write_format_zip_stream.c \ libarchive/test/test_write_format_zip_zip64.c \ libarchive/test/test_write_open_memory.c \ libarchive/test/test_write_read_format_zip.c \ @@ -689,6 +692,8 @@ libarchive_test_EXTRA_DIST=\ libarchive/test/test_compat_lz4_B7BD.tar.lz4.uu \ libarchive/test/test_compat_lzip_1.tlz.uu \ libarchive/test/test_compat_lzip_2.tlz.uu \ + libarchive/test/test_compat_lzip_3.lz.uu \ + libarchive/test/test_compat_lzip_4.tlz.uu \ libarchive/test/test_compat_lzma_1.tlz.uu \ libarchive/test/test_compat_lzma_2.tlz.uu \ libarchive/test/test_compat_lzma_3.tlz.uu \ @@ -748,6 +753,8 @@ libarchive_test_EXTRA_DIST=\ libarchive/test/test_read_filter_lrzip.tar.lrz.uu \ libarchive/test/test_read_filter_lzop.tar.lzo.uu \ libarchive/test/test_read_filter_lzop_multiple_parts.tar.lzo.uu \ + libarchive/test/test_read_filter_uudecode_raw.uu \ + libarchive/test/test_read_filter_uudecode_base64_raw.uu \ libarchive/test/test_read_format_mtree_crash747.mtree.bz2.uu \ libarchive/test/test_read_format_mtree_noprint.mtree.uu \ libarchive/test/test_read_format_7zip_bcj2_bzip2.7z.uu \ @@ -790,6 +797,7 @@ libarchive_test_EXTRA_DIST=\ libarchive/test/test_read_format_7zip_ppmd.7z.uu \ libarchive/test/test_read_format_7zip_solid_zstd.7z.uu \ libarchive/test/test_read_format_7zip_symbolic_name.7z.uu \ + libarchive/test/test_read_format_7zip_win_attrib.7z.uu \ libarchive/test/test_read_format_7zip_zstd_arm.7z.uu \ libarchive/test/test_read_format_7zip_zstd_bcj.7z.uu \ libarchive/test/test_read_format_7zip_zstd_nobcj.7z.uu \ @@ -1046,7 +1054,7 @@ endif bsdtar_LDADD= libarchive.la libarchive_fe.la $(LTLIBICONV) bsdtar_CPPFLAGS= -I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe $(bsdtar_ccstatic) $(PLATFORMCPPFLAGS) -bsdtar_LDFLAGS= $(bsdtar_ldstatic) $(GC_SECTIONS) +bsdtar_LDFLAGS= $(bsdtar_ldstatic) $(DEAD_CODE_REMOVAL) bsdtar_EXTRA_DIST= \ tar/bsdtar.1 \ @@ -1106,6 +1114,7 @@ bsdtar_test_SOURCES= \ tar/test/test_option_exclude_vcs.c \ tar/test/test_option_fflags.c \ tar/test/test_option_gid_gname.c \ + tar/test/test_option_group.c \ tar/test/test_option_grzip.c \ tar/test/test_option_ignore_zeros.c \ tar/test/test_option_j.c \ @@ -1119,6 +1128,7 @@ bsdtar_test_SOURCES= \ tar/test/test_option_newer_than.c \ tar/test/test_option_nodump.c \ tar/test/test_option_older_than.c \ + tar/test/test_option_owner.c \ tar/test/test_option_passphrase.c \ tar/test/test_option_q.c \ tar/test/test_option_r.c \ @@ -1212,7 +1222,7 @@ endif bsdcpio_LDADD= libarchive_fe.la libarchive.la $(LTLIBICONV) bsdcpio_CPPFLAGS= -I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe $(bsdcpio_ccstatic) $(PLATFORMCPPFLAGS) -bsdcpio_LDFLAGS= $(bsdcpio_ldstatic) $(GC_SECTIONS) +bsdcpio_LDFLAGS= $(bsdcpio_ldstatic) $(DEAD_CODE_REMOVAL) bsdcpio_EXTRA_DIST= \ cpio/bsdcpio.1 \ @@ -1366,7 +1376,7 @@ endif bsdcat_LDADD= libarchive_fe.la libarchive.la $(LTLIBICONV) bsdcat_CPPFLAGS= -I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe $(bsdcat_ccstatic) $(PLATFORMCPPFLAGS) -bsdcat_LDFLAGS= $(bsdcat_ldstatic) $(GC_SECTIONS) +bsdcat_LDFLAGS= $(bsdcat_ldstatic) $(DEAD_CODE_REMOVAL) bsdcat_EXTRA_DIST= \ cat/bsdcat.1 \ @@ -1474,7 +1484,7 @@ endif bsdunzip_LDADD= libarchive_fe.la libarchive.la $(LTLIBICONV) bsdunzip_CPPFLAGS= -I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe $(bsdunzip_ccstatic) $(PLATFORMCPPFLAGS) -bsdunzip_LDFLAGS= $(bsdunzip_ldstatic) $(GC_SECTIONS) +bsdunzip_LDFLAGS= $(bsdunzip_ldstatic) $(DEAD_CODE_REMOVAL) bsdunzip_EXTRA_DIST= \ unzip/bsdunzip.1 \ @@ -1499,6 +1509,7 @@ bsdunzip_test_SOURCES= \ unzip/test/test.h \ unzip/test/test_0.c \ unzip/test/test_basic.c \ + unzip/test/test_doubledash.c \ unzip/test/test_glob.c \ unzip/test/test_not_exist.c \ unzip/test/test_singlefile.c \ @@ -1515,7 +1526,8 @@ bsdunzip_test_SOURCES= \ unzip/test/test_version.c \ unzip/test/test_x.c \ unzip/test/test_Z1.c \ - unzip/test/test_P_encryption.c + unzip/test/test_P_encryption.c \ + unzip/test/test_I.c bsdunzip_test_CPPFLAGS= \ -I$(top_srcdir)/libarchive -I$(top_srcdir)/libarchive_fe \ @@ -1543,4 +1555,5 @@ bsdunzip_test_EXTRA_DIST= \ unzip/test/test_encrypted.zip.uu \ unzip/test/test_singlefile.zip.uu \ unzip/test/test_t_bad.zip.uu \ + unzip/test/test_I.zip.uu \ unzip/test/CMakeLists.txt diff --git a/NEWS b/NEWS index 7509c9ce5fa1..f4395fd1c979 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,7 @@ +Apr 08, 2024: libarchive 3.7.3 released + +Sep 12, 2023: libarchive 3.7.2 released + Jul 29, 2023: libarchive 3.7.1 released Jul 18, 2023: libarchive 3.7.0 released diff --git a/build/ci/github_actions/ci.cmd b/build/ci/github_actions/ci.cmd index 742ede66ab9d..990475d1b8f0 100755 --- a/build/ci/github_actions/ci.cmd +++ b/build/ci/github_actions/ci.cmd @@ -1,8 +1,7 @@ @ECHO OFF -SET ZLIB_VERSION=1.2.13 +SET ZLIB_VERSION=1.3 SET BZIP2_VERSION=1ea1ac188ad4b9cb662e3f8314673c63df95a589 SET XZ_VERSION=5.4.4 -SET ZSTD_VERSION=1.5.5 IF NOT "%BE%"=="mingw-gcc" ( IF NOT "%BE%"=="msvc" ( ECHO Environment variable BE must be mingw-gcc or msvc @@ -10,9 +9,18 @@ IF NOT "%BE%"=="mingw-gcc" ( ) ) +REM v1.5.6 has a bug with the CMake files & MSVC +REM https://github.com/facebook/zstd/issues/3999 +REM Fall back to 1.5.5 for MSVC until fixed +IF "%BE%"=="msvc" ( + SET ZSTD_VERSION=1.5.5 +) ELSE ( + SET ZSTD_VERSION=1.5.6 +) + SET ORIGPATH=%PATH% IF "%BE%"=="mingw-gcc" ( - SET MINGWPATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\cmake\bin;C:\ProgramData\chocolatey\lib\mingw\tools\install\mingw64\bin + SET MINGWPATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\cmake\bin;C:\ProgramData\mingw64\mingw64\bin ) IF "%1"=="deplibs" ( diff --git a/build/cmake/FindPCRE2POSIX.cmake b/build/cmake/FindPCRE2POSIX.cmake new file mode 100644 index 000000000000..4104f3791aa8 --- /dev/null +++ b/build/cmake/FindPCRE2POSIX.cmake @@ -0,0 +1,34 @@ +# - Find pcre2posix +# Find the native PCRE2-8 and PCRE2-POSIX include and libraries +# +# PCRE2_INCLUDE_DIR - where to find pcre2posix.h, etc. +# PCRE2POSIX_LIBRARIES - List of libraries when using libpcre2-posix. +# PCRE2_LIBRARIES - List of libraries when using libpcre2-8. +# PCRE2POSIX_FOUND - True if libpcre2-posix found. +# PCRE2_FOUND - True if libpcre2-8 found. + +IF (PCRE2_INCLUDE_DIR) + # Already in cache, be silent + SET(PCRE2_FIND_QUIETLY TRUE) +ENDIF (PCRE2_INCLUDE_DIR) + +FIND_PATH(PCRE2_INCLUDE_DIR pcre2posix.h) +FIND_LIBRARY(PCRE2POSIX_LIBRARY NAMES pcre2-posix libpcre2-posix pcre2-posix-static) +FIND_LIBRARY(PCRE2_LIBRARY NAMES pcre2-8 libpcre2-8 pcre2-8-static) + +# handle the QUIETLY and REQUIRED arguments and set PCRE2POSIX_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(PCRE2POSIX DEFAULT_MSG PCRE2POSIX_LIBRARY PCRE2_INCLUDE_DIR) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(PCRE2 DEFAULT_MSG PCRE2_LIBRARY) + +IF(PCRE2POSIX_FOUND) + SET(PCRE2POSIX_LIBRARIES ${PCRE2POSIX_LIBRARY}) + SET(HAVE_LIBPCRE2POSIX 1) + SET(HAVE_PCRE2POSIX_H 1) +ENDIF(PCRE2POSIX_FOUND) + +IF(PCRE2_FOUND) + SET(PCRE2_LIBRARIES ${PCRE2_LIBRARY}) + SET(HAVE_LIBPCRE2 1) +ENDIF(PCRE2_FOUND) diff --git a/build/cmake/config.h.in b/build/cmake/config.h.in index 71d54a4cec71..045a6b41657e 100644 --- a/build/cmake/config.h.in +++ b/build/cmake/config.h.in @@ -753,6 +753,12 @@ typedef uint64_t uintmax_t; /* Define to 1 if you have the `pcreposix' library (-lpcreposix). */ #cmakedefine HAVE_LIBPCREPOSIX 1 +/* Define to 1 if you have the `pcre2-8' library (-lpcre2-8). */ +#cmakedefine HAVE_LIBPCRE2 1 + +/* Define to 1 if you have the `pcreposix' library (-lpcre2posix). */ +#cmakedefine HAVE_LIBPCRE2POSIX 1 + /* Define to 1 if you have the `xml2' library (-lxml2). */ #cmakedefine HAVE_LIBXML2 1 @@ -768,9 +774,8 @@ typedef uint64_t uintmax_t; /* Define to 1 if you have the `zstd' library (-lzstd). */ #cmakedefine HAVE_LIBZSTD 1 -/* Define to 1 if you have the `zstd' library (-lzstd) with compression - support. */ -#cmakedefine HAVE_LIBZSTD_COMPRESSOR 1 +/* Define to 1 if you have the ZSTD_compressStream function. */ +#cmakedefine HAVE_ZSTD_compressStream 1 /* Define to 1 if you have the header file. */ #cmakedefine HAVE_LIMITS_H 1 @@ -926,6 +931,9 @@ typedef uint64_t uintmax_t; /* Define to 1 if you have the header file. */ #cmakedefine HAVE_PCREPOSIX_H 1 +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_PCRE2POSIX_H 1 + /* Define to 1 if you have the `pipe' function. */ #cmakedefine HAVE_PIPE 1 diff --git a/build/utils/gen_archive_string_composition_h.sh b/build/utils/gen_archive_string_composition_h.sh index 558e9c0c7cb5..93012fe68ff9 100755 --- a/build/utils/gen_archive_string_composition_h.sh +++ b/build/utils/gen_archive_string_composition_h.sh @@ -39,9 +39,6 @@ cat > ${outfile} < #ifdef HAVE_STDLIB_H @@ -37,6 +36,9 @@ __FBSDID("$FreeBSD$"); #include #endif +#include +#include + #include "bsdcat.h" #include "err.h" @@ -48,7 +50,7 @@ static const char *bsdcat_current_path; static int exit_status = 0; -void +static __LA_NORETURN void usage(FILE *stream, int eval) { const char *p; @@ -58,7 +60,7 @@ usage(FILE *stream, int eval) exit(eval); } -static void +static __LA_NORETURN void version(void) { printf("bsdcat %s - %s \n", @@ -67,7 +69,15 @@ version(void) exit(0); } -void +static void +bsdcat_print_error(void) +{ + lafe_warnc(0, "%s: %s", + bsdcat_current_path, archive_error_string(a)); + exit_status = 1; +} + +static void bsdcat_next(void) { if (a != NULL) { @@ -82,15 +92,7 @@ bsdcat_next(void) archive_read_support_format_raw(a); } -void -bsdcat_print_error(void) -{ - lafe_warnc(0, "%s: %s", - bsdcat_current_path, archive_error_string(a)); - exit_status = 1; -} - -void +static void bsdcat_read_to_stdout(const char* filename) { int r; @@ -130,12 +132,16 @@ main(int argc, char **argv) switch (c) { case 'h': usage(stdout, 0); - break; + /* NOTREACHED */ + /* Fallthrough */ case OPTION_VERSION: version(); - break; + /* NOTREACHED */ + /* Fallthrough */ default: usage(stderr, 1); + /* Fallthrough */ + /* NOTREACHED */ } } diff --git a/cat/bsdcat.h b/cat/bsdcat.h index 6467d6e3d310..504757a44040 100644 --- a/cat/bsdcat.h +++ b/cat/bsdcat.h @@ -34,9 +34,6 @@ #include "config.h" #endif -#include -#include - struct bsdcat { /* Option parser state */ int getopt_state; @@ -53,9 +50,5 @@ enum { }; int bsdcat_getopt(struct bsdcat *); -void usage(FILE *stream, int eval); -void bsdcat_next(void); -void bsdcat_print_error(void); -void bsdcat_read_to_stdout(const char* filename); #endif diff --git a/cat/bsdcat_platform.h b/cat/bsdcat_platform.h index 10b711322c37..78a6113e6f01 100644 --- a/cat/bsdcat_platform.h +++ b/cat/bsdcat_platform.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/usr.bin/tar/bsdtar_platform.h,v 1.26 2008/12/06 07:37:14 kientzle Exp $ */ /* @@ -42,16 +40,6 @@ #include "config.h" #endif -/* Get a real definition for __FBSDID if we can */ -#if HAVE_SYS_CDEFS_H -#include -#endif - -/* If not, define it so as to avoid dangling semicolons. */ -#ifndef __FBSDID -#define __FBSDID(a) struct _undefined_hack -#endif - #ifdef HAVE_LIBARCHIVE /* If we're using the platform libarchive, include system headers. */ #include @@ -64,12 +52,14 @@ /* How to mark functions that don't return. */ /* This facilitates use of some newer static code analysis tools. */ -#undef __LA_DEAD +#undef __LA_NORETURN #if defined(__GNUC__) && (__GNUC__ > 2 || \ - (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) -#define __LA_DEAD __attribute__((__noreturn__)) -#else -#define __LA_DEAD + (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) +#define __LA_NORETURN __attribute__((__noreturn__)) +#elif defined(_MSC_VER) +#define __LA_NORETURN __declspec(noreturn) +#else +#define __LA_NORETURN #endif #endif /* !BSDCAT_PLATFORM_H_INCLUDED */ diff --git a/cat/cmdline.c b/cat/cmdline.c index 3c4b7a8c4b9e..ea1e0eed6d0a 100644 --- a/cat/cmdline.c +++ b/cat/cmdline.c @@ -28,7 +28,6 @@ */ #include "bsdcat_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include diff --git a/cat/test/test.h b/cat/test/test.h index 350bcad63464..ec83d476b6b8 100644 --- a/cat/test/test.h +++ b/cat/test/test.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ /* Every test program should #include "test.h" as the first thing. */ diff --git a/configure.ac b/configure.ac index 4a4bdd628639..503bb75ac9f8 100644 --- a/configure.ac +++ b/configure.ac @@ -4,8 +4,8 @@ dnl First, define all of the version numbers up front. dnl In particular, this allows the version macro to be used in AC_INIT dnl These first two version numbers are updated automatically on each release. -m4_define([LIBARCHIVE_VERSION_S],[3.7.2dev]) -m4_define([LIBARCHIVE_VERSION_N],[3007002]) +m4_define([LIBARCHIVE_VERSION_S],[3.7.3]) +m4_define([LIBARCHIVE_VERSION_N],[3007003]) dnl bsdtar and bsdcpio versioning tracks libarchive m4_define([BSDTAR_VERSION_S],LIBARCHIVE_VERSION_S()) @@ -461,7 +461,7 @@ if test "x$with_zstd" != "xno"; then AC_CHECK_HEADERS([zstd.h]) AC_CHECK_LIB(zstd,ZSTD_decompressStream) AC_CHECK_LIB(zstd,ZSTD_compressStream, - AC_DEFINE([HAVE_LIBZSTD_COMPRESSOR], [1], [Define to 1 if you have the `zstd' library (-lzstd) with compression support.])) + AC_DEFINE([HAVE_ZSTD_compressStream], [1], [Define to 1 if you have the `zstd' library (-lzstd) with compression support.])) fi AC_ARG_WITH([lzma], @@ -482,7 +482,7 @@ if test "x$with_lzma" != "xno"; then [#if LZMA_VERSION < 50020000] [#error unsupported] [#endif]], - [[lzma_stream_encoder_mt(0, 0);]])], + [[int ignored __attribute__((unused)); ignored = lzma_stream_encoder_mt(0, 0);]])], [ac_cv_lzma_has_mt=yes], [ac_cv_lzma_has_mt=no])]) if test "x$ac_cv_lzma_has_mt" != xno; then AC_DEFINE([HAVE_LZMA_STREAM_ENCODER_MT], [1], [Define to 1 if you have the `lzma_stream_encoder_mt' function.]) @@ -552,6 +552,7 @@ AC_ARG_ENABLE([posix-regex-lib], AS_HELP_STRING([--enable-posix-regex-lib=libc], [use libc POSIX regular expression support]) AS_HELP_STRING([--enable-posix-regex-lib=libregex], [use libregex POSIX regular expression support]) AS_HELP_STRING([--enable-posix-regex-lib=libpcreposix], [use libpcreposix POSIX regular expression support]) + AS_HELP_STRING([--enable-posix-regex-lib=libpcre2posix], [use libpcre2-posix POSIX regular expression support]) AS_HELP_STRING([--disable-posix-regex-lib], [don't enable POSIX regular expression support])], [], [enable_posix_regex_lib=auto]) @@ -603,6 +604,39 @@ if test -z $posix_regex_lib_found && (test "$enable_posix_regex_lib" = "auto" || posix_regex_lib_found=1 fi fi +if test -z $posix_regex_lib_found && (test "$enable_posix_regex_lib" = "auto" || test "$enable_posix_regex_lib" = "libpcre2posix"); then + AC_CHECK_HEADERS([pcre2posix.h]) + AC_CHECK_LIB(pcre2-posix,regcomp) + if test "x$ac_cv_lib_pcre2posix_regcomp" != xyes; then + AC_MSG_NOTICE(trying libpcre2posix check again with libpcre2-8) + unset ac_cv_lib_pcre2posix_regcomp + AC_CHECK_LIB(pcre2,pcre2_regexec) + AC_CHECK_LIB(pcre2-posix,pcre2_regcomp) + if test "x$ac_cv_lib_pcre2_pcre_exec" = xyes && test "x$ac_cv_lib_pcre2posix_regcomp" = xyes; then + AC_MSG_CHECKING(if PCRE2_STATIC needs to be defined) + AC_LINK_IFELSE( + [AC_LANG_SOURCE(#include + int main() { return pcre2_regcomp(NULL, NULL, 0); })], + [without_pcre2_static=yes], + [without_pcre2_static=no]) + AC_LINK_IFELSE( + [AC_LANG_SOURCE(#define PCRE2_STATIC + #include + int main() { return pcre2_regcomp(NULL, NULL, 0); })], + [with_pcre2_static=yes], + [with_pcre2_static=no]) + if test "x$without_pcre2_static" != xyes && test "x$with_pcre2_static" = xyes; then + AC_MSG_RESULT(yes) + AC_DEFINE([PCRE2_STATIC], [1], [Define to 1 if PCRE2_STATIC needs to be defined.]) + elif test "x$without_pcre2_static" = xyes || test "x$with_pcre2_static" = xyes; then + AC_MSG_RESULT(no) + fi + posix_regex_lib_found=1 + fi + else + posix_regex_lib_found=1 + fi +fi # TODO: Give the user the option of using a pre-existing system # libarchive. This will define HAVE_LIBARCHIVE which will cause @@ -614,21 +648,35 @@ fi # Checks for supported compiler flags AX_APPEND_COMPILE_FLAGS([-Wall -Wformat -Wformat-security]) -# Place the functions and data into separate sections, allowing the linker -# to garbage collect the unused ones. +# Place the functions and data into separate sections, allowing GNU style +# linkers to garbage collect the unused ones. save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,--gc-sections" AC_MSG_CHECKING([whether ld supports --gc-sections]) AC_LINK_IFELSE( [AC_LANG_SOURCE([static char UnusedFunc() { return 5; } int main() { return 0;}])], [AC_MSG_RESULT([yes]) - GC_SECTIONS="-Wl,--gc-sections"; + DEAD_CODE_REMOVAL="-Wl,--gc-sections"; AX_APPEND_COMPILE_FLAGS([-ffunction-sections -fdata-sections])], [AC_MSG_RESULT([no]) - GC_SECTIONS="";]) + DEAD_CODE_REMOVAL="";]) LDFLAGS=$save_LDFLAGS -AC_SUBST(GC_SECTIONS) +if test "$DEAD_CODE_REMOVAL" == ""; then + # Macos linkers have a -dead_strip flag, which is similar to --gc-sections. + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,-dead_strip" + AC_MSG_CHECKING([whether ld supports -dead_strip]) + AC_LINK_IFELSE( + [AC_LANG_SOURCE([static char UnusedFunc() { return 5; } int main() { return 0;}])], + [AC_MSG_RESULT([yes]) + DEAD_CODE_REMOVAL="-Wl,-dead_strip";], + [AC_MSG_RESULT([no]) + DEAD_CODE_REMOVAL="";]) + LDFLAGS=$save_LDFLAGS +fi + +AC_SUBST(DEAD_CODE_REMOVAL) # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST diff --git a/contrib/android/config/windows_host.h b/contrib/android/config/windows_host.h index 6550e5e82e2a..5210a4db5c7f 100644 --- a/contrib/android/config/windows_host.h +++ b/contrib/android/config/windows_host.h @@ -442,6 +442,12 @@ /* Define to 1 if you have the `pcreposix' library (-lpcreposix). */ /* #undef HAVE_LIBPCREPOSIX */ +/* Define to 1 if you have the `pcre2-8' library (-lpcre2-8). */ +/* #undef HAVE_LIBPCRE2 */ + +/* Define to 1 if you have the `pcre2-posix' library (-lpcre2-posix). */ +/* #undef HAVE_LIBPCRE2POSIX */ + /* Define to 1 if you have the `regex' library (-lregex). */ /* #undef HAVE_LIBREGEX */ @@ -593,6 +599,9 @@ /* Define to 1 if you have the header file. */ /* #undef HAVE_PCREPOSIX_H */ +/* Define to 1 if you have the header file. */ +/* #undef HAVE_PCRE2POSIX_H */ + /* Define to 1 if you have the `pipe' function. */ /* #undef HAVE_PIPE */ diff --git a/contrib/archivetest.c b/contrib/archivetest.c index a298f565439a..794221fbb524 100644 --- a/contrib/archivetest.c +++ b/contrib/archivetest.c @@ -83,6 +83,7 @@ static void printhelp() " -f filename Filename to verify\n" " -h Show this help\n" " -q Quiet mode\n" + " -r Enforce raw archive format\n" " -s Verify only headers (skip data)\n\n" "If no filename is specified, data is read from standard input.\n" "\n%s\n", archive_version_details()); @@ -110,15 +111,17 @@ int main(int argc, char *argv[]) const char *p; char buffer[4096]; int c; - int v, skip_data; + int v, skip_data, raw; int r = ARCHIVE_OK; int format_printed; + mode_t mode; filename = NULL; skip_data = 0; + raw = 0; v = 1; - while ((c = getopt (argc, argv, "f:hqs")) != -1) { + while ((c = getopt (argc, argv, "f:hrqs")) != -1) { switch (c) { case 'f': filename = optarg; @@ -129,6 +132,9 @@ int main(int argc, char *argv[]) case 'q': v = 0; break; + case 'r': + raw = 1; + break; case 's': skip_data = 1; break; @@ -153,7 +159,10 @@ int main(int argc, char *argv[]) a = archive_read_new(); archive_read_support_filter_all(a); - archive_read_support_format_all(a); + if (raw) + archive_read_support_format_raw(a); + else + archive_read_support_format_all(a); v_print(v, "Data source: "); @@ -191,11 +200,13 @@ int main(int argc, char *argv[]) if (r == ARCHIVE_EOF) break; p = archive_entry_pathname(entry); + mode = archive_entry_mode(entry); v_print(v, "Entry %d: %s, pathname", c, errnostr(r)); if (p == NULL || p[0] == '\0') v_print(v, " unreadable"); else v_print(v, ": %s", p); + v_print(v, ", mode: %o", mode); v_print(v, ", data: "); if (skip_data) { v_print(v, "skipping"); diff --git a/contrib/shar/Makefile b/contrib/shar/Makefile index 3bd94d4192cb..2e344fe0dc86 100644 --- a/contrib/shar/Makefile +++ b/contrib/shar/Makefile @@ -1,5 +1,3 @@ -# $FreeBSD$ - PROG= shar SRCS= shar.c tree.c diff --git a/contrib/shar/shar.1 b/contrib/shar/shar.1 index 31561978f05c..a50efead99c8 100644 --- a/contrib/shar/shar.1 +++ b/contrib/shar/shar.1 @@ -30,7 +30,6 @@ .\" SUCH DAMAGE. .\" .\" @(#)shar.1 8.1 (Berkeley) 6/6/93 -.\" $FreeBSD$ .\" .Dd April 17, 2008 .Dt SHAR 1 diff --git a/contrib/shar/shar.c b/contrib/shar/shar.c index 63161fc9ea94..1648ab0d2d05 100644 --- a/contrib/shar/shar.c +++ b/contrib/shar/shar.c @@ -24,11 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include -#ifdef __FBSDID -__FBSDID("$FreeBSD$"); -#endif - #include #include diff --git a/contrib/shar/tree.c b/contrib/shar/tree.c index a80d8366bdeb..666224c331d2 100644 --- a/contrib/shar/tree.c +++ b/contrib/shar/tree.c @@ -43,7 +43,6 @@ * regular dir or via fchdir(2) for a symlink). */ #include "tree_config.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_STAT_H #include diff --git a/contrib/shar/tree.h b/contrib/shar/tree.h index ff38f5346c1c..82e974507b4b 100644 --- a/contrib/shar/tree.h +++ b/contrib/shar/tree.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ /*- diff --git a/contrib/shar/tree_config.h b/contrib/shar/tree_config.h index 8dfd90baf685..6af27dcfbf64 100644 --- a/contrib/shar/tree_config.h +++ b/contrib/shar/tree_config.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #ifndef TREE_CONFIG_H_INCLUDED #define TREE_CONFIG_H_INCLUDED @@ -57,14 +55,6 @@ #error Oops: No config.h and no built-in configuration in bsdtar_platform.h. #endif /* !HAVE_CONFIG_H */ -/* No non-FreeBSD platform will have __FBSDID, so just define it here. */ -#ifdef __FreeBSD__ -#include /* For __FBSDID */ -#else -/* Just leaving this macro replacement empty leads to a dangling semicolon. */ -#define __FBSDID(a) struct _undefined_hack -#endif - #ifdef HAVE_LIBARCHIVE /* If we're using the platform libarchive, include system headers. */ #include diff --git a/contrib/untar.c b/contrib/untar.c index db2511886910..6d5e88e2f097 100644 --- a/contrib/untar.c +++ b/contrib/untar.c @@ -37,22 +37,28 @@ #include /* For mkdir() */ #if defined(_WIN32) && !defined(__CYGWIN__) -#define NUM_FORMAT "zu" -#include -#elif defined(__linux__) || defined(linux) || defined(__linux) -#define NUM_FORMAT "d" -#else -#define NUM_FORMAT "lu" -#endif /* defined(_WIN32) && !defined(__CYGWIN__) */ +#include +#endif -#define TO_STRING(x) #x -#define STR(x) TO_STRING(x) +#define BLOCKSIZE 512 -/* Parse an octal number, ignoring leading and trailing nonsense. */ +/* System call to create a directory. */ static int +system_mkdir(char *pathname, int mode) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + (void)mode; /* UNUSED */ + return _mkdir(pathname); +#else + return mkdir(pathname, mode); +#endif +} + +/* Parse an octal number, ignoring leading and trailing nonsense. */ +static unsigned long parseoct(const char *p, size_t n) { - int i = 0; + unsigned long i = 0; while ((*p < '0' || *p > '7') && n > 0) { ++p; @@ -72,7 +78,7 @@ static int is_end_of_archive(const char *p) { int n; - for (n = 511; n >= 0; --n) + for (n = 0; n < BLOCKSIZE; ++n) if (p[n] != '\0') return (0); return (1); @@ -90,12 +96,7 @@ create_dir(char *pathname, int mode) pathname[strlen(pathname) - 1] = '\0'; /* Try creating the directory. */ -#if defined(_WIN32) && !defined(__CYGWIN__) - r = _mkdir(pathname); -#else - r = mkdir(pathname, mode); -#endif - + r = system_mkdir(pathname, mode); if (r != 0) { /* On failure, try creating parent directory. */ p = strrchr(pathname, '/'); @@ -103,11 +104,7 @@ create_dir(char *pathname, int mode) *p = '\0'; create_dir(pathname, 0755); *p = '/'; -#if defined(_WIN32) && !defined(__CYGWIN__) - r = _mkdir(pathname); -#else - r = mkdir(pathname, mode); -#endif + r = system_mkdir(pathname, mode); } } if (r != 0) @@ -138,7 +135,7 @@ static int verify_checksum(const char *p) { int n, u = 0; - for (n = 0; n < 512; ++n) { + for (n = 0; n < BLOCKSIZE; ++n) { if (n < 148 || n > 155) /* Standard tar checksum adds unsigned bytes. */ u += ((unsigned char *)p)[n]; @@ -146,26 +143,25 @@ verify_checksum(const char *p) u += 0x20; } - return (u == parseoct(p + 148, 8)); + return (u == (int)parseoct(p + 148, 8)); } /* Extract a tar archive. */ static void untar(FILE *a, const char *path) { - enum { BUF_SIZE=512 }; - char buff[BUF_SIZE]; + char buff[BLOCKSIZE]; FILE *f = NULL; size_t bytes_read; - off_t filesize; + unsigned long filesize; printf("Extracting from %s\n", path); for (;;) { - bytes_read = fread(buff, 1, BUF_SIZE, a); - if (bytes_read < BUF_SIZE) { + bytes_read = fread(buff, 1, BLOCKSIZE, a); + if (bytes_read < BLOCKSIZE) { fprintf(stderr, - "Short read on %s: expected " STR(BUF_SIZE) ", got %"NUM_FORMAT"\n", - path, bytes_read); + "Short read on %s: expected %d, got %d\n", + path, BLOCKSIZE, (int)bytes_read); return; } if (is_end_of_archive(buff)) { @@ -178,51 +174,51 @@ untar(FILE *a, const char *path) } filesize = parseoct(buff + 124, 12); switch (buff[156]) { - case '1': - printf(" Ignoring hardlink %s\n", buff); - break; - case '2': - printf(" Ignoring symlink %s\n", buff); - break; - case '3': - printf(" Ignoring character device %s\n", buff); - break; - case '4': - printf(" Ignoring block device %s\n", buff); - break; - case '5': - printf(" Extracting dir %s\n", buff); - create_dir(buff, parseoct(buff + 100, 8)); - filesize = 0; - break; - case '6': - printf(" Ignoring FIFO %s\n", buff); - break; - default: - printf(" Extracting file %s\n", buff); - f = create_file(buff, parseoct(buff + 100, 8)); + case '1': + printf(" Ignoring hardlink %s\n", buff); + break; + case '2': + printf(" Ignoring symlink %s\n", buff); + break; + case '3': + printf(" Ignoring character device %s\n", buff); break; + case '4': + printf(" Ignoring block device %s\n", buff); + break; + case '5': + printf(" Extracting dir %s\n", buff); + create_dir(buff, (int)parseoct(buff + 100, 8)); + filesize = 0; + break; + case '6': + printf(" Ignoring FIFO %s\n", buff); + break; + default: + printf(" Extracting file %s\n", buff); + f = create_file(buff, (int)parseoct(buff + 100, 8)); + break; } while (filesize > 0) { - bytes_read = fread(buff, 1, BUF_SIZE, a); - if (bytes_read < BUF_SIZE) { + bytes_read = fread(buff, 1, BLOCKSIZE, a); + if (bytes_read < BLOCKSIZE) { fprintf(stderr, - "Short read on %s: Expected " STR(BUF_SIZE) ", got %"NUM_FORMAT"\n", - path, bytes_read); + "Short read on %s: Expected %d, got %d\n", + path, BLOCKSIZE, (int)bytes_read); return; } - if (filesize < BUF_SIZE) - bytes_read = filesize; + if (filesize < BLOCKSIZE) + bytes_read = (size_t)filesize; if (f != NULL) { if (fwrite(buff, 1, bytes_read, f) - != bytes_read) + != bytes_read) { fprintf(stderr, "Failed write\n"); fclose(f); f = NULL; } } - filesize -= (off_t)bytes_read; + filesize -= bytes_read; } if (f != NULL) { fclose(f); diff --git a/cpio/bsdcpio.1 b/cpio/bsdcpio.1 index 01b508e122f8..c52764a8c4f7 100644 --- a/cpio/bsdcpio.1 +++ b/cpio/bsdcpio.1 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd September 16, 2014 .Dt CPIO 1 .Os diff --git a/cpio/cmdline.c b/cpio/cmdline.c index 2683524e4ed0..312d762c8f46 100644 --- a/cpio/cmdline.c +++ b/cpio/cmdline.c @@ -26,7 +26,6 @@ #include "cpio_platform.h" -__FBSDID("$FreeBSD: src/usr.bin/cpio/cmdline.c,v 1.5 2008/12/06 07:30:40 kientzle Exp $"); #ifdef HAVE_ERRNO_H #include diff --git a/cpio/config_freebsd.h b/cpio/config_freebsd.h index 00c4c737f737..1cba09653cb5 100644 --- a/cpio/config_freebsd.h +++ b/cpio/config_freebsd.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/usr.bin/cpio/config_freebsd.h,v 1.3 2008/12/06 07:30:40 kientzle Exp $ */ /* A hand-tooled configuration for FreeBSD. */ diff --git a/cpio/cpio.c b/cpio/cpio.c index b02a142f842d..c9af535f6d0a 100644 --- a/cpio/cpio.c +++ b/cpio/cpio.c @@ -26,7 +26,6 @@ #include "cpio_platform.h" -__FBSDID("$FreeBSD: src/usr.bin/cpio/cpio.c,v 1.15 2008/12/06 07:30:40 kientzle Exp $"); #include #include @@ -108,22 +107,22 @@ static int entry_to_archive(struct cpio *, struct archive_entry *); static int file_to_archive(struct cpio *, const char *); static void free_cache(struct name_cache *cache); static void list_item_verbose(struct cpio *, struct archive_entry *); -static void long_help(void) __LA_DEAD; +static __LA_NORETURN void long_help(void); static const char *lookup_gname(struct cpio *, gid_t gid); static int lookup_gname_helper(struct cpio *, const char **name, id_t gid); static const char *lookup_uname(struct cpio *, uid_t uid); static int lookup_uname_helper(struct cpio *, const char **name, id_t uid); -static void mode_in(struct cpio *) __LA_DEAD; -static void mode_list(struct cpio *) __LA_DEAD; +static __LA_NORETURN void mode_in(struct cpio *); +static __LA_NORETURN void mode_list(struct cpio *); static void mode_out(struct cpio *); static void mode_pass(struct cpio *, const char *); static const char *remove_leading_slash(const char *); static int restore_time(struct cpio *, struct archive_entry *, const char *, int fd); -static void usage(void) __LA_DEAD; -static void version(void) __LA_DEAD; +static __LA_NORETURN void usage(void); +static __LA_NORETURN void version(void); static const char * passphrase_callback(struct archive *, void *); static void passphrase_free(char *); @@ -251,7 +250,7 @@ main(int argc, char *argv[]) break; case 'h': long_help(); - break; + /* NOTREACHED */ case 'I': /* NetBSD/OpenBSD */ cpio->filename = cpio->argument; break; @@ -358,7 +357,7 @@ main(int argc, char *argv[]) break; case OPTION_VERSION: /* GNU convention */ version(); - break; + /* NOTREACHED */ #if 0 /* * cpio_getopt() handles -W specially, so it's not @@ -427,7 +426,7 @@ main(int argc, char *argv[]) mode_list(cpio); else mode_in(cpio); - break; + /* NOTREACHED */ case 'p': if (*cpio->argv == NULL || **cpio->argv == '\0') lafe_errc(1, 0, diff --git a/cpio/cpio.h b/cpio/cpio.h index a71b6649d35f..3e97c0900b73 100644 --- a/cpio/cpio.h +++ b/cpio/cpio.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/usr.bin/cpio/cpio.h,v 1.7 2008/12/06 07:30:40 kientzle Exp $ */ #ifndef CPIO_H_INCLUDED diff --git a/cpio/cpio_platform.h b/cpio/cpio_platform.h index 58d2edbcd7a4..263404b40dab 100644 --- a/cpio/cpio_platform.h +++ b/cpio/cpio_platform.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/usr.bin/cpio/cpio_platform.h,v 1.2 2008/12/06 07:15:42 kientzle Exp $ */ /* @@ -46,16 +44,6 @@ #include "cpio_windows.h" #endif -/* Get a real definition for __FBSDID if we can */ -#if HAVE_SYS_CDEFS_H -#include -#endif - -/* If not, define it so as to avoid dangling semicolons. */ -#ifndef __FBSDID -#define __FBSDID(a) struct _undefined_hack -#endif - #ifdef HAVE_LIBARCHIVE /* If we're using the platform libarchive, include system headers. */ #include @@ -69,9 +57,11 @@ /* How to mark functions that don't return. */ #if defined(__GNUC__) && (__GNUC__ > 2 || \ (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) -#define __LA_DEAD __attribute__((__noreturn__)) +#define __LA_NORETURN __attribute__((__noreturn__)) +#elif defined(_MSC_VER) +#define __LA_NORETURN __declspec(noreturn) #else -#define __LA_DEAD +#define __LA_NORETURN #endif #endif /* !CPIO_PLATFORM_H_INCLUDED */ diff --git a/cpio/cpio_windows.c b/cpio/cpio_windows.c index 2809ca821e2c..c888a3897d56 100644 --- a/cpio/cpio_windows.c +++ b/cpio/cpio_windows.c @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #if defined(_WIN32) && !defined(__CYGWIN__) diff --git a/cpio/cpio_windows.h b/cpio/cpio_windows.h index 970a63df663d..6b88c389ab40 100644 --- a/cpio/cpio_windows.h +++ b/cpio/cpio_windows.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #ifndef CPIO_WINDOWS_H #define CPIO_WINDOWS_H 1 diff --git a/cpio/test/test.h b/cpio/test/test.h index 1dadf68890bf..f8f3a4038b57 100644 --- a/cpio/test/test.h +++ b/cpio/test/test.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ /* Every test program should #include "test.h" as the first thing. */ diff --git a/cpio/test/test_0.c b/cpio/test/test_0.c index fa52def7eaf3..c09df5e137c4 100644 --- a/cpio/test/test_0.c +++ b/cpio/test/test_0.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * This first test does basic sanity checks on the environment. For diff --git a/cpio/test/test_basic.c b/cpio/test/test_basic.c index 3d7d86a0ee78..993d555b831c 100644 --- a/cpio/test/test_basic.c +++ b/cpio/test/test_basic.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/cpio/test/test_basic.c,v 1.4 2008/08/25 06:39:29 kientzle Exp $"); static void verify_files(const char *msg) diff --git a/cpio/test/test_cmdline.c b/cpio/test/test_cmdline.c index 2dd7d651dc57..f4e05ee58599 100644 --- a/cpio/test/test_cmdline.c +++ b/cpio/test/test_cmdline.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Test the command-line parsing. diff --git a/cpio/test/test_extract_cpio_Z.c b/cpio/test/test_extract_cpio_Z.c index f908fc5b84f5..257d70d04211 100644 --- a/cpio/test/test_extract_cpio_Z.c +++ b/cpio/test/test_extract_cpio_Z.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_Z) { diff --git a/cpio/test/test_extract_cpio_bz2.c b/cpio/test/test_extract_cpio_bz2.c index 9525e63ae906..08fe1fe53468 100644 --- a/cpio/test/test_extract_cpio_bz2.c +++ b/cpio/test/test_extract_cpio_bz2.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_bz2) { diff --git a/cpio/test/test_extract_cpio_grz.c b/cpio/test/test_extract_cpio_grz.c index f1a080597e34..969b30e44de5 100644 --- a/cpio/test/test_extract_cpio_grz.c +++ b/cpio/test/test_extract_cpio_grz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_grz) { diff --git a/cpio/test/test_extract_cpio_gz.c b/cpio/test/test_extract_cpio_gz.c index 19cee510c857..16296146f87e 100644 --- a/cpio/test/test_extract_cpio_gz.c +++ b/cpio/test/test_extract_cpio_gz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_gz) { diff --git a/cpio/test/test_extract_cpio_lrz.c b/cpio/test/test_extract_cpio_lrz.c index 67667585e431..7ef213f74aac 100644 --- a/cpio/test/test_extract_cpio_lrz.c +++ b/cpio/test/test_extract_cpio_lrz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_lrz) { diff --git a/cpio/test/test_extract_cpio_lz.c b/cpio/test/test_extract_cpio_lz.c index 4454e7b191e9..bfdf87869b37 100644 --- a/cpio/test/test_extract_cpio_lz.c +++ b/cpio/test/test_extract_cpio_lz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_lz) { diff --git a/cpio/test/test_extract_cpio_lz4.c b/cpio/test/test_extract_cpio_lz4.c index c16247be2bef..f8cf5f8fab0d 100644 --- a/cpio/test/test_extract_cpio_lz4.c +++ b/cpio/test/test_extract_cpio_lz4.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_lz4) { diff --git a/cpio/test/test_extract_cpio_lzma.c b/cpio/test/test_extract_cpio_lzma.c index ae630d6119d8..81fc3c236ab5 100644 --- a/cpio/test/test_extract_cpio_lzma.c +++ b/cpio/test/test_extract_cpio_lzma.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_lzma) { diff --git a/cpio/test/test_extract_cpio_lzo.c b/cpio/test/test_extract_cpio_lzo.c index 99476af95318..d54d4f712374 100644 --- a/cpio/test/test_extract_cpio_lzo.c +++ b/cpio/test/test_extract_cpio_lzo.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_lzo) { diff --git a/cpio/test/test_extract_cpio_xz.c b/cpio/test/test_extract_cpio_xz.c index 60f1b5a9de84..faeea202e050 100644 --- a/cpio/test/test_extract_cpio_xz.c +++ b/cpio/test/test_extract_cpio_xz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_xz) { diff --git a/cpio/test/test_extract_cpio_zstd.c b/cpio/test/test_extract_cpio_zstd.c index 289f33d0583c..31421c3b60d7 100644 --- a/cpio/test/test_extract_cpio_zstd.c +++ b/cpio/test/test_extract_cpio_zstd.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_cpio_zstd) { diff --git a/cpio/test/test_format_newc.c b/cpio/test/test_format_newc.c index 6e3b9e359bbd..ee0087d4ca94 100644 --- a/cpio/test/test_format_newc.c +++ b/cpio/test/test_format_newc.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/cpio/test/test_format_newc.c,v 1.2 2008/08/22 02:09:10 kientzle Exp $"); /* Number of bytes needed to pad 'n' to multiple of 'block', assuming * that 'block' is a power of two. This trick can be more easily diff --git a/cpio/test/test_gcpio_compat.c b/cpio/test/test_gcpio_compat.c index 9bb988990e4c..82c71ec3cd21 100644 --- a/cpio/test/test_gcpio_compat.c +++ b/cpio/test/test_gcpio_compat.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/cpio/test/test_gcpio_compat.c,v 1.2 2008/08/22 02:27:06 kientzle Exp $"); static void unpack_test(const char *from, const char *options, const char *se) diff --git a/cpio/test/test_gcpio_compat_ref.bin.uu b/cpio/test/test_gcpio_compat_ref.bin.uu index 745d8ab7851a..f2ffad975644 100644 --- a/cpio/test/test_gcpio_compat_ref.bin.uu +++ b/cpio/test/test_gcpio_compat_ref.bin.uu @@ -1,4 +1,3 @@ -$FreeBSD$ begin 644 test_gcpio_compat_ref.bin MQW%9`*IWI('H`^@#`@````U'=YD%````"@!F:6QE```Q,C,T-38W.#D*QW%9 M`*IWI('H`^@#`@````U'=YD)````"@!L:6YK9FEL90``,3(S-#4V-S@Y"L=Q diff --git a/cpio/test/test_gcpio_compat_ref.crc.uu b/cpio/test/test_gcpio_compat_ref.crc.uu index df8dde05bd82..56ba62c9ed1f 100644 --- a/cpio/test/test_gcpio_compat_ref.crc.uu +++ b/cpio/test/test_gcpio_compat_ref.crc.uu @@ -1,4 +1,3 @@ -$FreeBSD$ begin 644 test_gcpio_compat_ref.crc M,# #endif -__FBSDID("$FreeBSD: src/usr.bin/cpio/test/test_option_a.c,v 1.3 2008/08/24 06:21:00 kientzle Exp $"); static struct { const char *name; diff --git a/cpio/test/test_option_b64encode.c b/cpio/test/test_option_b64encode.c index 7c15a8230606..501976c202a1 100644 --- a/cpio/test/test_option_b64encode.c +++ b/cpio/test/test_option_b64encode.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_b64encode) { diff --git a/cpio/test/test_option_c.c b/cpio/test/test_option_c.c index dfa62c13b13e..0b6bed2fac93 100644 --- a/cpio/test/test_option_c.c +++ b/cpio/test/test_option_c.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static int is_octal(const char *p, size_t l) diff --git a/cpio/test/test_option_d.c b/cpio/test/test_option_d.c index 9ff14539698f..b96430e4f37a 100644 --- a/cpio/test/test_option_d.c +++ b/cpio/test/test_option_d.c @@ -23,8 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); - DEFINE_TEST(test_option_d) { diff --git a/cpio/test/test_option_f.c b/cpio/test/test_option_f.c index 784e0858431b..72383884ac1e 100644 --- a/cpio/test/test_option_f.c +++ b/cpio/test/test_option_f.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Unpack the archive in a new dir. diff --git a/cpio/test/test_option_f.cpio.uu b/cpio/test/test_option_f.cpio.uu index 42c63c39685e..60b74173f413 100644 --- a/cpio/test/test_option_f.cpio.uu +++ b/cpio/test/test_option_f.cpio.uu @@ -1,4 +1,3 @@ -$FreeBSD$ begin 644 test_option_f.cpio M,# diff --git a/cpio/test/test_option_t.cpio.uu b/cpio/test/test_option_t.cpio.uu index 055fe747d06f..d0bf60bf7d9d 100644 --- a/cpio/test/test_option_t.cpio.uu +++ b/cpio/test/test_option_t.cpio.uu @@ -1,4 +1,3 @@ -$FreeBSD$ begin 644 test_option_t.cpio M,# #endif -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_u) { diff --git a/cpio/test/test_option_uuencode.c b/cpio/test/test_option_uuencode.c index a42a0e03096f..28662ddfb659 100644 --- a/cpio/test/test_option_uuencode.c +++ b/cpio/test/test_option_uuencode.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_uuencode) { diff --git a/cpio/test/test_option_xz.c b/cpio/test/test_option_xz.c index f0d3b33d45b8..9116ecace3a7 100644 --- a/cpio/test/test_option_xz.c +++ b/cpio/test/test_option_xz.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_xz) { diff --git a/cpio/test/test_option_y.c b/cpio/test/test_option_y.c index 989b5f1aaf6e..a78dff8cf4ea 100644 --- a/cpio/test/test_option_y.c +++ b/cpio/test/test_option_y.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/cpio/test/test_option_y.c,v 1.2 2008/08/24 06:21:00 kientzle Exp $"); DEFINE_TEST(test_option_y) { diff --git a/cpio/test/test_option_z.c b/cpio/test/test_option_z.c index 803232d045c2..9a1500d77f32 100644 --- a/cpio/test/test_option_z.c +++ b/cpio/test/test_option_z.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_z) { diff --git a/cpio/test/test_option_zstd.c b/cpio/test/test_option_zstd.c index 29b8c78b94aa..10c3ed9784e8 100644 --- a/cpio/test/test_option_zstd.c +++ b/cpio/test/test_option_zstd.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_zstd) { diff --git a/cpio/test/test_owner_parse.c b/cpio/test/test_owner_parse.c index bef02da7badf..fc6f18943f5d 100644 --- a/cpio/test/test_owner_parse.c +++ b/cpio/test/test_owner_parse.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #include "../cpio.h" #include "err.h" diff --git a/cpio/test/test_passthrough_dotdot.c b/cpio/test/test_passthrough_dotdot.c index bb04341a4c79..831c1f81c1cb 100644 --- a/cpio/test/test_passthrough_dotdot.c +++ b/cpio/test/test_passthrough_dotdot.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/cpio/test/test_passthrough_dotdot.c,v 1.4 2008/08/24 06:21:00 kientzle Exp $"); /* * Verify that "cpio -p .." works. diff --git a/cpio/test/test_passthrough_reverse.c b/cpio/test/test_passthrough_reverse.c index 674e52bc0a18..7ae0e6602a34 100644 --- a/cpio/test/test_passthrough_reverse.c +++ b/cpio/test/test_passthrough_reverse.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/cpio/test/test_passthrough_reverse.c,v 1.2 2008/08/24 06:21:00 kientzle Exp $"); /* * As reported by Bernd Walter: Some people are in the habit of diff --git a/libarchive/CMakeLists.txt b/libarchive/CMakeLists.txt index f7fdfb68a103..b79091cac582 100644 --- a/libarchive/CMakeLists.txt +++ b/libarchive/CMakeLists.txt @@ -252,6 +252,7 @@ ENDIF(BUILD_SHARED_LIBS) # archive_static is a static library ADD_LIBRARY(archive_static STATIC ${libarchive_SOURCES} ${include_HEADERS}) +TARGET_INCLUDE_DIRECTORIES(archive_static PUBLIC .) TARGET_LINK_LIBRARIES(archive_static ${ADDITIONAL_LIBS}) SET_TARGET_PROPERTIES(archive_static PROPERTIES COMPILE_DEFINITIONS LIBARCHIVE_STATIC) diff --git a/libarchive/archive.h b/libarchive/archive.h index 854fefdd64e0..2e3a9f31cd33 100644 --- a/libarchive/archive.h +++ b/libarchive/archive.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/lib/libarchive/archive.h.in,v 1.50 2008/05/26 17:00:22 kientzle Exp $ */ #ifndef ARCHIVE_H_INCLUDED @@ -36,7 +34,7 @@ * assert that ARCHIVE_VERSION_NUMBER >= 2012108. */ /* Note: Compiler will complain if this does not match archive_entry.h! */ -#define ARCHIVE_VERSION_NUMBER 3007002 +#define ARCHIVE_VERSION_NUMBER 3007003 #include #include /* for wchar_t */ @@ -157,7 +155,7 @@ __LA_DECL int archive_version_number(void); /* * Textual name/version of the library, useful for version displays. */ -#define ARCHIVE_VERSION_ONLY_STRING "3.7.2dev" +#define ARCHIVE_VERSION_ONLY_STRING "3.7.3" #define ARCHIVE_VERSION_STRING "libarchive " ARCHIVE_VERSION_ONLY_STRING __LA_DECL const char * archive_version_string(void); @@ -535,6 +533,10 @@ __LA_DECL int archive_read_open_filenames(struct archive *, const char **_filenames, size_t _block_size); __LA_DECL int archive_read_open_filename_w(struct archive *, const wchar_t *_filename, size_t _block_size); +#if defined(_WIN32) && !defined(__CYGWIN__) +__LA_DECL int archive_read_open_filenames_w(struct archive *, + const wchar_t **_filenames, size_t _block_size); +#endif /* archive_read_open_file() is a deprecated synonym for ..._open_filename(). */ __LA_DECL int archive_read_open_file(struct archive *, const char *_filename, size_t _block_size) __LA_DEPRECATED; diff --git a/libarchive/archive_acl.c b/libarchive/archive_acl.c index ead7e36e49ec..254324c71309 100644 --- a/libarchive/archive_acl.c +++ b/libarchive/archive_acl.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_acl_private.h b/libarchive/archive_acl_private.h index af108162c664..750b4dd7d898 100644 --- a/libarchive/archive_acl_private.h +++ b/libarchive/archive_acl_private.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #ifndef ARCHIVE_ACL_PRIVATE_H_INCLUDED diff --git a/libarchive/archive_check_magic.c b/libarchive/archive_check_magic.c index 1f40072f81d8..d12f0c496e27 100644 --- a/libarchive/archive_check_magic.c +++ b/libarchive/archive_check_magic.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_check_magic.c 201089 2009-12-28 02:20:23Z kientzle $"); #ifdef HAVE_SYS_TYPES_H #include @@ -62,7 +61,7 @@ errmsg(const char *m) } } -static __LA_DEAD void +static __LA_NORETURN void diediedie(void) { #if defined(_WIN32) && !defined(__CYGWIN__) && defined(_DEBUG) @@ -99,13 +98,12 @@ archive_handle_type_name(unsigned m) } } - -static char * +static void write_all_states(char *buff, unsigned int states) { unsigned int lowbit; - buff[0] = '\0'; + *buff = '\0'; /* A trick for computing the lowest set bit. */ while ((lowbit = states & (1 + ~states)) != 0) { @@ -114,7 +112,6 @@ write_all_states(char *buff, unsigned int states) if (states != 0) strcat(buff, "/"); } - return buff; } /* @@ -160,16 +157,19 @@ __archive_check_magic(struct archive *a, unsigned int magic, if ((a->state & state) == 0) { /* If we're already FATAL, don't overwrite the error. */ - if (a->state != ARCHIVE_STATE_FATAL) + if (a->state != ARCHIVE_STATE_FATAL) { + write_all_states(states1, a->state); + write_all_states(states2, state); archive_set_error(a, -1, "INTERNAL ERROR: Function '%s' invoked with" " archive structure in state '%s'," " should be in state '%s'", function, - write_all_states(states1, a->state), - write_all_states(states2, state)); + states1, + states2); + } a->state = ARCHIVE_STATE_FATAL; return (ARCHIVE_FATAL); } - return ARCHIVE_OK; + return (ARCHIVE_OK); } diff --git a/libarchive/archive_cmdline.c b/libarchive/archive_cmdline.c index 5c519cd17f1b..2e5428cae516 100644 --- a/libarchive/archive_cmdline.c +++ b/libarchive/archive_cmdline.c @@ -25,8 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_STRING_H # include #endif diff --git a/libarchive/archive_cmdline_private.h b/libarchive/archive_cmdline_private.h index 57a19494fd7a..7495dfed55dd 100644 --- a/libarchive/archive_cmdline_private.h +++ b/libarchive/archive_cmdline_private.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #ifndef ARCHIVE_CMDLINE_PRIVATE_H diff --git a/libarchive/archive_crc32.h b/libarchive/archive_crc32.h index 4f1aed305930..98a4e2cf8f7f 100644 --- a/libarchive/archive_crc32.h +++ b/libarchive/archive_crc32.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/archive_crc32.h 201102 2009-12-28 03:11:36Z kientzle $ */ #ifndef ARCHIVE_CRC32_H diff --git a/libarchive/archive_cryptor.c b/libarchive/archive_cryptor.c index 112baf161348..437dba06be62 100644 --- a/libarchive/archive_cryptor.c +++ b/libarchive/archive_cryptor.c @@ -424,8 +424,8 @@ static int aes_ctr_release(archive_crypto_ctx *ctx) { EVP_CIPHER_CTX_free(ctx->ctx); - memset(ctx->key, 0, ctx->key_len); - memset(ctx->nonce, 0, sizeof(ctx->nonce)); + OPENSSL_cleanse(ctx->key, ctx->key_len); + OPENSSL_cleanse(ctx->nonce, sizeof(ctx->nonce)); return 0; } diff --git a/libarchive/archive_digest.c b/libarchive/archive_digest.c index 08a9aeb02320..3776831b21c9 100644 --- a/libarchive/archive_digest.c +++ b/libarchive/archive_digest.c @@ -110,7 +110,7 @@ win_crypto_Update(Digest_CTX *ctx, const unsigned char *buf, size_t len) #if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA BCryptHashData(ctx->hHash, (PUCHAR)(uintptr_t)buf, - len, 0); + (ULONG)len, 0); #else CryptHashData(ctx->hash, (unsigned char *)(uintptr_t)buf, diff --git a/libarchive/archive_endian.h b/libarchive/archive_endian.h index e6d3f2ce5e70..83b2efa531ef 100644 --- a/libarchive/archive_endian.h +++ b/libarchive/archive_endian.h @@ -23,8 +23,6 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: head/lib/libarchive/archive_endian.h 201085 2009-12-28 02:17:15Z kientzle $ - * * Borrowed from FreeBSD's */ diff --git a/libarchive/archive_entry.3 b/libarchive/archive_entry.3 index 2f62a4be233e..0fc0f8cc2fe6 100644 --- a/libarchive/archive_entry.3 +++ b/libarchive/archive_entry.3 @@ -23,8 +23,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_ENTRY 3 .Os diff --git a/libarchive/archive_entry.c b/libarchive/archive_entry.c index ae6dc333619a..9463233e6a42 100644 --- a/libarchive/archive_entry.c +++ b/libarchive/archive_entry.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_entry.c 201096 2009-12-28 02:41:27Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include @@ -372,6 +371,12 @@ archive_entry_filetype(struct archive_entry *entry) return (AE_IFMT & entry->acl.mode); } +int +archive_entry_filetype_is_set(struct archive_entry *entry) +{ + return (entry->ae_set & AE_SET_FILETYPE); +} + void archive_entry_fflags(struct archive_entry *entry, unsigned long *set, unsigned long *clear) @@ -425,6 +430,12 @@ archive_entry_gid(struct archive_entry *entry) return (entry->ae_stat.aest_gid); } +int +archive_entry_gid_is_set(struct archive_entry *entry) +{ + return (entry->ae_set & AE_SET_GID); +} + const char * archive_entry_gname(struct archive_entry *entry) { @@ -631,6 +642,12 @@ archive_entry_perm(struct archive_entry *entry) return (~AE_IFMT & entry->acl.mode); } +int +archive_entry_perm_is_set(struct archive_entry *entry) +{ + return (entry->ae_set & AE_SET_PERM); +} + dev_t archive_entry_rdev(struct archive_entry *entry) { @@ -759,6 +776,12 @@ archive_entry_uid(struct archive_entry *entry) return (entry->ae_stat.aest_uid); } +int +archive_entry_uid_is_set(struct archive_entry *entry) +{ + return (entry->ae_set & AE_SET_UID); +} + const char * archive_entry_uname(struct archive_entry *entry) { @@ -827,6 +850,7 @@ archive_entry_set_filetype(struct archive_entry *entry, unsigned int type) entry->stat_valid = 0; entry->acl.mode &= ~AE_IFMT; entry->acl.mode |= AE_IFMT & type; + entry->ae_set |= AE_SET_FILETYPE; } void @@ -861,6 +885,7 @@ archive_entry_set_gid(struct archive_entry *entry, la_int64_t g) { entry->stat_valid = 0; entry->ae_stat.aest_gid = g; + entry->ae_set |= AE_SET_GID; } void @@ -1145,6 +1170,7 @@ archive_entry_set_mode(struct archive_entry *entry, mode_t m) { entry->stat_valid = 0; entry->acl.mode = m; + entry->ae_set |= AE_SET_PERM | AE_SET_FILETYPE; } void @@ -1220,6 +1246,7 @@ archive_entry_set_perm(struct archive_entry *entry, mode_t p) entry->stat_valid = 0; entry->acl.mode &= AE_IFMT; entry->acl.mode |= ~AE_IFMT & p; + entry->ae_set |= AE_SET_PERM; } void @@ -1354,6 +1381,7 @@ archive_entry_set_uid(struct archive_entry *entry, la_int64_t u) { entry->stat_valid = 0; entry->ae_stat.aest_uid = u; + entry->ae_set |= AE_SET_UID; } void diff --git a/libarchive/archive_entry.h b/libarchive/archive_entry.h index e4c0ab344eba..df9cb765f7e8 100644 --- a/libarchive/archive_entry.h +++ b/libarchive/archive_entry.h @@ -22,15 +22,13 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/archive_entry.h 201096 2009-12-28 02:41:27Z kientzle $ */ #ifndef ARCHIVE_ENTRY_H_INCLUDED #define ARCHIVE_ENTRY_H_INCLUDED /* Note: Compiler will complain if this does not match archive.h! */ -#define ARCHIVE_VERSION_NUMBER 3007002 +#define ARCHIVE_VERSION_NUMBER 3007003 /* * Note: archive_entry.h is for use outside of libarchive; the @@ -251,11 +249,13 @@ __LA_DECL int archive_entry_dev_is_set(struct archive_entry *); __LA_DECL dev_t archive_entry_devmajor(struct archive_entry *); __LA_DECL dev_t archive_entry_devminor(struct archive_entry *); __LA_DECL __LA_MODE_T archive_entry_filetype(struct archive_entry *); +__LA_DECL int archive_entry_filetype_is_set(struct archive_entry *); __LA_DECL void archive_entry_fflags(struct archive_entry *, unsigned long * /* set */, unsigned long * /* clear */); __LA_DECL const char *archive_entry_fflags_text(struct archive_entry *); __LA_DECL la_int64_t archive_entry_gid(struct archive_entry *); +__LA_DECL int archive_entry_gid_is_set(struct archive_entry *); __LA_DECL const char *archive_entry_gname(struct archive_entry *); __LA_DECL const char *archive_entry_gname_utf8(struct archive_entry *); __LA_DECL const wchar_t *archive_entry_gname_w(struct archive_entry *); @@ -274,6 +274,7 @@ __LA_DECL const char *archive_entry_pathname(struct archive_entry *); __LA_DECL const char *archive_entry_pathname_utf8(struct archive_entry *); __LA_DECL const wchar_t *archive_entry_pathname_w(struct archive_entry *); __LA_DECL __LA_MODE_T archive_entry_perm(struct archive_entry *); +__LA_DECL int archive_entry_perm_is_set(struct archive_entry *); __LA_DECL dev_t archive_entry_rdev(struct archive_entry *); __LA_DECL dev_t archive_entry_rdevmajor(struct archive_entry *); __LA_DECL dev_t archive_entry_rdevminor(struct archive_entry *); @@ -287,6 +288,7 @@ __LA_DECL const char *archive_entry_symlink_utf8(struct archive_entry *); __LA_DECL int archive_entry_symlink_type(struct archive_entry *); __LA_DECL const wchar_t *archive_entry_symlink_w(struct archive_entry *); __LA_DECL la_int64_t archive_entry_uid(struct archive_entry *); +__LA_DECL int archive_entry_uid_is_set(struct archive_entry *); __LA_DECL const char *archive_entry_uname(struct archive_entry *); __LA_DECL const char *archive_entry_uname_utf8(struct archive_entry *); __LA_DECL const wchar_t *archive_entry_uname_w(struct archive_entry *); diff --git a/libarchive/archive_entry_copy_bhfi.c b/libarchive/archive_entry_copy_bhfi.c index 77bf38e450f2..d5317a5eab5b 100644 --- a/libarchive/archive_entry_copy_bhfi.c +++ b/libarchive/archive_entry_copy_bhfi.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #include "archive_private.h" #include "archive_entry.h" diff --git a/libarchive/archive_entry_copy_stat.c b/libarchive/archive_entry_copy_stat.c index ac83868e8f8a..f9c2e8469b1e 100644 --- a/libarchive/archive_entry_copy_stat.c +++ b/libarchive/archive_entry_copy_stat.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_entry_copy_stat.c 189466 2009-03-07 00:52:02Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include diff --git a/libarchive/archive_entry_link_resolver.c b/libarchive/archive_entry_link_resolver.c index c7d59497a7cf..6c6173430250 100644 --- a/libarchive/archive_entry_link_resolver.c +++ b/libarchive/archive_entry_link_resolver.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_entry_link_resolver.c 201100 2009-12-28 03:05:31Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include diff --git a/libarchive/archive_entry_locale.h b/libarchive/archive_entry_locale.h index 803c0368bb69..1b90c57eabf2 100644 --- a/libarchive/archive_entry_locale.h +++ b/libarchive/archive_entry_locale.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #ifndef ARCHIVE_ENTRY_LOCALE_H_INCLUDED diff --git a/libarchive/archive_entry_private.h b/libarchive/archive_entry_private.h index cf4deb24ec83..3423966c60f3 100644 --- a/libarchive/archive_entry_private.h +++ b/libarchive/archive_entry_private.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/archive_entry_private.h 201096 2009-12-28 02:41:27Z kientzle $ */ #ifndef ARCHIVE_ENTRY_PRIVATE_H_INCLUDED @@ -147,6 +145,10 @@ struct archive_entry { #define AE_SET_SIZE 64 #define AE_SET_INO 128 #define AE_SET_DEV 256 +#define AE_SET_PERM 512 +#define AE_SET_FILETYPE 1024 +#define AE_SET_UID 2048 +#define AE_SET_GID 4096 /* * Use aes here so that we get transparent mbs<->wcs conversions. diff --git a/libarchive/archive_entry_sparse.c b/libarchive/archive_entry_sparse.c index 74917b37b804..b81684d18730 100644 --- a/libarchive/archive_entry_sparse.c +++ b/libarchive/archive_entry_sparse.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #include "archive.h" #include "archive_entry.h" diff --git a/libarchive/archive_entry_stat.c b/libarchive/archive_entry_stat.c index 71a407b1f8b3..c4906838ed0f 100644 --- a/libarchive/archive_entry_stat.c +++ b/libarchive/archive_entry_stat.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_entry_stat.c 201100 2009-12-28 03:05:31Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include diff --git a/libarchive/archive_entry_strmode.c b/libarchive/archive_entry_strmode.c index af2517a32199..5faa2faeefa0 100644 --- a/libarchive/archive_entry_strmode.c +++ b/libarchive/archive_entry_strmode.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: src/lib/libarchive/archive_entry_strmode.c,v 1.4 2008/06/15 05:14:01 kientzle Exp $"); #ifdef HAVE_SYS_STAT_H #include diff --git a/libarchive/archive_entry_time.3 b/libarchive/archive_entry_time.3 index d0563eaef43a..0f1dbb025127 100644 --- a/libarchive/archive_entry_time.3 +++ b/libarchive/archive_entry_time.3 @@ -23,8 +23,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_ENTRY_TIME 3 .Os diff --git a/libarchive/archive_entry_xattr.c b/libarchive/archive_entry_xattr.c index 5fe726b99d0c..14848a5ab2c4 100644 --- a/libarchive/archive_entry_xattr.c +++ b/libarchive/archive_entry_xattr.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_entry_xattr.c 201096 2009-12-28 02:41:27Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include diff --git a/libarchive/archive_getdate.c b/libarchive/archive_getdate.c index 20ab1b1588fe..69eebb0a079f 100644 --- a/libarchive/archive_getdate.c +++ b/libarchive/archive_getdate.c @@ -28,10 +28,6 @@ */ #include "archive_platform.h" -#ifdef __FreeBSD__ -#include -__FBSDID("$FreeBSD$"); -#endif #include #include diff --git a/libarchive/archive_getdate.h b/libarchive/archive_getdate.h index 900a8f692e98..cfd49ddf7ebb 100644 --- a/libarchive/archive_getdate.h +++ b/libarchive/archive_getdate.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #ifndef ARCHIVE_GETDATE_H_INCLUDED diff --git a/libarchive/archive_match.c b/libarchive/archive_match.c index 04747b1f6663..fc8a4ce8127b 100644 --- a/libarchive/archive_match.c +++ b/libarchive/archive_match.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_options.c b/libarchive/archive_options.c index 6496025a5f6b..92647c9b41c1 100644 --- a/libarchive/archive_options.c +++ b/libarchive/archive_options.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_options_private.h b/libarchive/archive_options_private.h index 9a7f8080d2f6..3e49222dabdf 100644 --- a/libarchive/archive_options_private.h +++ b/libarchive/archive_options_private.h @@ -27,8 +27,6 @@ #define ARCHIVE_OPTIONS_PRIVATE_H_INCLUDED #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #include "archive_private.h" typedef int (*option_handler)(struct archive *a, diff --git a/libarchive/archive_pack_dev.c b/libarchive/archive_pack_dev.c index d95444d979f2..3c6209b98405 100644 --- a/libarchive/archive_pack_dev.c +++ b/libarchive/archive_pack_dev.c @@ -33,13 +33,6 @@ #include "archive_platform.h" -#if HAVE_SYS_CDEFS_H -#include -#endif -#if !defined(lint) -__RCSID("$NetBSD$"); -#endif /* not lint */ - #ifdef HAVE_LIMITS_H #include #endif diff --git a/libarchive/archive_pathmatch.c b/libarchive/archive_pathmatch.c index 0867a268eefe..19e0889ffe55 100644 --- a/libarchive/archive_pathmatch.c +++ b/libarchive/archive_pathmatch.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_STRING_H #include diff --git a/libarchive/archive_pathmatch.h b/libarchive/archive_pathmatch.h index 9995142921e5..3f406ff7435f 100644 --- a/libarchive/archive_pathmatch.h +++ b/libarchive/archive_pathmatch.h @@ -22,8 +22,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #ifndef ARCHIVE_PATHMATCH_H diff --git a/libarchive/archive_platform.h b/libarchive/archive_platform.h index 1038932ace72..24e8b50323d0 100644 --- a/libarchive/archive_platform.h +++ b/libarchive/archive_platform.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/archive_platform.h 201090 2009-12-28 02:22:04Z kientzle $ */ /* !!ONLY FOR USE INTERNALLY TO LIBARCHIVE!! */ @@ -87,19 +85,6 @@ * headers as required. */ -/* Get a real definition for __FBSDID or __RCSID if we can */ -#if HAVE_SYS_CDEFS_H -#include -#endif - -/* If not, define them so as to avoid dangling semicolons. */ -#ifndef __FBSDID -#define __FBSDID(a) struct _undefined_hack -#endif -#ifndef __RCSID -#define __RCSID(a) struct _undefined_hack -#endif - /* Try to get standard C99-style integer type definitions. */ #if HAVE_INTTYPES_H #include diff --git a/libarchive/archive_platform_acl.h b/libarchive/archive_platform_acl.h index 264e6de375a1..48556f87feed 100644 --- a/libarchive/archive_platform_acl.h +++ b/libarchive/archive_platform_acl.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ /* !!ONLY FOR USE INTERNALLY TO LIBARCHIVE!! */ diff --git a/libarchive/archive_platform_xattr.h b/libarchive/archive_platform_xattr.h index ad4b90ab7b2a..2ae222f61ef8 100644 --- a/libarchive/archive_platform_xattr.h +++ b/libarchive/archive_platform_xattr.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ /* !!ONLY FOR USE INTERNALLY TO LIBARCHIVE!! */ diff --git a/libarchive/archive_private.h b/libarchive/archive_private.h index b2a2cda250eb..0f05169b7d25 100644 --- a/libarchive/archive_private.h +++ b/libarchive/archive_private.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/archive_private.h 201098 2009-12-28 02:58:14Z kientzle $ */ #ifndef ARCHIVE_PRIVATE_H_INCLUDED @@ -40,10 +38,12 @@ #include "archive_string.h" #if defined(__GNUC__) && (__GNUC__ > 2 || \ - (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) -#define __LA_DEAD __attribute__((__noreturn__)) + (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) +#define __LA_NORETURN __attribute__((__noreturn__)) +#elif defined(_MSC_VER) +#define __LA_NORETURN __declspec(noreturn) #else -#define __LA_DEAD +#define __LA_NORETURN #endif #if defined(__GNUC__) && (__GNUC__ > 2 || \ @@ -153,7 +153,7 @@ int __archive_check_magic(struct archive *, unsigned int magic, return ARCHIVE_FATAL; \ } while (0) -void __archive_errx(int retvalue, const char *msg) __LA_DEAD; +__LA_NORETURN void __archive_errx(int retvalue, const char *msg); void __archive_ensure_cloexec_flag(int fd); int __archive_mktemp(const char *tmpdir); diff --git a/libarchive/archive_random.c b/libarchive/archive_random.c index 301765acd830..8c48d2d3b5a9 100644 --- a/libarchive/archive_random.c +++ b/libarchive/archive_random.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_STDLIB_H #include @@ -93,7 +92,7 @@ archive_random(void *buf, size_t nbytes) status = BCryptOpenAlgorithmProvider(&hAlg, BCRYPT_RNG_ALGORITHM, NULL, 0); if (!BCRYPT_SUCCESS(status)) return ARCHIVE_FAILED; - status = BCryptGenRandom(hAlg, buf, nbytes, 0); + status = BCryptGenRandom(hAlg, buf, (ULONG)nbytes, 0); BCryptCloseAlgorithmProvider(hAlg, 0); if (!BCRYPT_SUCCESS(status)) return ARCHIVE_FAILED; diff --git a/libarchive/archive_read.3 b/libarchive/archive_read.3 index cbedd0a19129..c81c98be2759 100644 --- a/libarchive/archive_read.3 +++ b/libarchive/archive_read.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_READ 3 .Os diff --git a/libarchive/archive_read.c b/libarchive/archive_read.c index 45a38aed02b6..d71fc2b7cc04 100644 --- a/libarchive/archive_read.c +++ b/libarchive/archive_read.c @@ -32,7 +32,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read.c 201157 2009-12-29 05:30:23Z kientzle $"); #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_read_add_passphrase.3 b/libarchive/archive_read_add_passphrase.3 index ca60d4fc62f7..c35cfeb34cd5 100644 --- a/libarchive/archive_read_add_passphrase.3 +++ b/libarchive/archive_read_add_passphrase.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd September 14, 2014 .Dt ARCHIVE_READ_ADD_PASSPHRASE 3 .Os diff --git a/libarchive/archive_read_add_passphrase.c b/libarchive/archive_read_add_passphrase.c index f0b1ab93300f..c67d1df3d1b8 100644 --- a/libarchive/archive_read_add_passphrase.c +++ b/libarchive/archive_read_add_passphrase.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_read_append_filter.c b/libarchive/archive_read_append_filter.c index 25dc4b2a2b7f..74eead83e0e7 100644 --- a/libarchive/archive_read_append_filter.c +++ b/libarchive/archive_read_append_filter.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_read_data.3 b/libarchive/archive_read_data.3 index 78c0c9000419..694f29264ec1 100644 --- a/libarchive/archive_read_data.3 +++ b/libarchive/archive_read_data.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_READ_DATA 3 .Os diff --git a/libarchive/archive_read_data_into_fd.c b/libarchive/archive_read_data_into_fd.c index f16ca5c82b15..8fd5e12442bc 100644 --- a/libarchive/archive_read_data_into_fd.c +++ b/libarchive/archive_read_data_into_fd.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_data_into_fd.c,v 1.16 2008/05/23 05:01:29 cperciva Exp $"); #ifdef HAVE_SYS_TYPES_H #include diff --git a/libarchive/archive_read_disk.3 b/libarchive/archive_read_disk.3 index 8b568d7b0568..7cde3c232713 100644 --- a/libarchive/archive_read_disk.3 +++ b/libarchive/archive_read_disk.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd April 3, 2017 .Dt ARCHIVE_READ_DISK 3 .Os diff --git a/libarchive/archive_read_disk_entry_from_file.c b/libarchive/archive_read_disk_entry_from_file.c index ab0270bc2850..d89f435554f6 100644 --- a/libarchive/archive_read_disk_entry_from_file.c +++ b/libarchive/archive_read_disk_entry_from_file.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD"); /* This is the tree-walking code for POSIX systems. */ #if !defined(_WIN32) || defined(__CYGWIN__) diff --git a/libarchive/archive_read_disk_posix.c b/libarchive/archive_read_disk_posix.c index 8d5c32f0385e..76a4fa44de72 100644 --- a/libarchive/archive_read_disk_posix.c +++ b/libarchive/archive_read_disk_posix.c @@ -29,7 +29,6 @@ #if !defined(_WIN32) || defined(__CYGWIN__) #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_PARAM_H #include diff --git a/libarchive/archive_read_disk_private.h b/libarchive/archive_read_disk_private.h index bc8abc15d15c..cf8da99a029b 100644 --- a/libarchive/archive_read_disk_private.h +++ b/libarchive/archive_read_disk_private.h @@ -22,8 +22,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/archive_read_disk_private.h 201105 2009-12-28 03:20:54Z kientzle $ */ #ifndef ARCHIVE_READ_DISK_PRIVATE_H_INCLUDED diff --git a/libarchive/archive_read_disk_set_standard_lookup.c b/libarchive/archive_read_disk_set_standard_lookup.c index c7fd2471ecbe..3512d343f65b 100644 --- a/libarchive/archive_read_disk_set_standard_lookup.c +++ b/libarchive/archive_read_disk_set_standard_lookup.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_disk_set_standard_lookup.c 201109 2009-12-28 03:30:31Z kientzle $"); #ifdef HAVE_SYS_TYPES_H #include diff --git a/libarchive/archive_read_disk_windows.c b/libarchive/archive_read_disk_windows.c index f92a78a21edd..6b551f4bb0a7 100644 --- a/libarchive/archive_read_disk_windows.c +++ b/libarchive/archive_read_disk_windows.c @@ -25,7 +25,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #if defined(_WIN32) && !defined(__CYGWIN__) @@ -2439,6 +2438,7 @@ archive_read_disk_entry_from_file(struct archive *_a, return (ARCHIVE_OK); } + r = ARCHIVE_OK; if ((a->flags & ARCHIVE_READDISK_NO_SPARSE) == 0) { r = setup_sparse_from_disk(a, entry, h); if (fd < 0) diff --git a/libarchive/archive_read_extract.3 b/libarchive/archive_read_extract.3 index 858f39742553..f3feb5ad551b 100644 --- a/libarchive/archive_read_extract.3 +++ b/libarchive/archive_read_extract.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_READ_EXTRACT 3 .Os diff --git a/libarchive/archive_read_extract.c b/libarchive/archive_read_extract.c index b7973fa8e006..d2159c64cd83 100644 --- a/libarchive/archive_read_extract.c +++ b/libarchive/archive_read_extract.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_extract.c,v 1.61 2008/05/26 17:00:22 kientzle Exp $"); #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_read_extract2.c b/libarchive/archive_read_extract2.c index 4febd8ce056f..e11cac1590e9 100644 --- a/libarchive/archive_read_extract2.c +++ b/libarchive/archive_read_extract2.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_extract.c,v 1.61 2008/05/26 17:00:22 kientzle Exp $"); #ifdef HAVE_SYS_TYPES_H #include diff --git a/libarchive/archive_read_filter.3 b/libarchive/archive_read_filter.3 index 4f5c3518a6ca..72ff240fd393 100644 --- a/libarchive/archive_read_filter.3 +++ b/libarchive/archive_read_filter.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd June 9, 2020 .Dt ARCHIVE_READ_FILTER 3 .Os diff --git a/libarchive/archive_read_format.3 b/libarchive/archive_read_format.3 index f3804ce3796a..990293c83131 100644 --- a/libarchive/archive_read_format.3 +++ b/libarchive/archive_read_format.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_READ_FORMAT 3 .Os diff --git a/libarchive/archive_read_free.3 b/libarchive/archive_read_free.3 index 8371c3a0c60c..7dc121fcaea3 100644 --- a/libarchive/archive_read_free.3 +++ b/libarchive/archive_read_free.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_READ_FREE 3 .Os diff --git a/libarchive/archive_read_header.3 b/libarchive/archive_read_header.3 index 1e97f3a27507..024dc41da831 100644 --- a/libarchive/archive_read_header.3 +++ b/libarchive/archive_read_header.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_READ_HEADER 3 .Os diff --git a/libarchive/archive_read_new.3 b/libarchive/archive_read_new.3 index 8bb6b848b06a..c2b5cddef098 100644 --- a/libarchive/archive_read_new.3 +++ b/libarchive/archive_read_new.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_READ_NEW 3 .Os diff --git a/libarchive/archive_read_open.3 b/libarchive/archive_read_open.3 index f67677823bd0..081b7114bea6 100644 --- a/libarchive/archive_read_open.3 +++ b/libarchive/archive_read_open.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_READ_OPEN 3 .Os diff --git a/libarchive/archive_read_open_fd.c b/libarchive/archive_read_open_fd.c index f59cd07fe6c0..3ee2423d300e 100644 --- a/libarchive/archive_read_open_fd.c +++ b/libarchive/archive_read_open_fd.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_open_fd.c 201103 2009-12-28 03:13:49Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include diff --git a/libarchive/archive_read_open_file.c b/libarchive/archive_read_open_file.c index 03719e8bff0c..dcf1d4698569 100644 --- a/libarchive/archive_read_open_file.c +++ b/libarchive/archive_read_open_file.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_open_file.c 201093 2009-12-28 02:28:44Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include diff --git a/libarchive/archive_read_open_filename.c b/libarchive/archive_read_open_filename.c index 561289b694be..dd2e16022844 100644 --- a/libarchive/archive_read_open_filename.c +++ b/libarchive/archive_read_open_filename.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_open_filename.c 201093 2009-12-28 02:28:44Z kientzle $"); #ifdef HAVE_SYS_IOCTL_H #include @@ -155,55 +154,73 @@ archive_read_open_filenames(struct archive *a, const char **filenames, return (ARCHIVE_FATAL); } +/* + * This function is an implementation detail of archive_read_open_filename_w, + * which is exposed as a separate API on Windows. + */ +#if !defined(_WIN32) || defined(__CYGWIN__) +static +#endif int -archive_read_open_filename_w(struct archive *a, const wchar_t *wfilename, +archive_read_open_filenames_w(struct archive *a, const wchar_t **wfilenames, size_t block_size) { - struct read_file_data *mine = (struct read_file_data *)calloc(1, - sizeof(*mine) + wcslen(wfilename) * sizeof(wchar_t)); - if (!mine) + struct read_file_data *mine; + const wchar_t *wfilename = NULL; + if (wfilenames) + wfilename = *(wfilenames++); + + archive_clear_error(a); + do { - archive_set_error(a, ENOMEM, "No memory"); - return (ARCHIVE_FATAL); - } - mine->fd = -1; - mine->block_size = block_size; + if (wfilename == NULL) + wfilename = L""; + mine = (struct read_file_data *)calloc(1, + sizeof(*mine) + wcslen(wfilename) * sizeof(wchar_t)); + if (mine == NULL) + goto no_memory; + mine->block_size = block_size; + mine->fd = -1; - if (wfilename == NULL || wfilename[0] == L'\0') { - mine->filename_type = FNT_STDIN; - } else { + if (wfilename == NULL || wfilename[0] == L'\0') { + mine->filename_type = FNT_STDIN; + } else { #if defined(_WIN32) && !defined(__CYGWIN__) - mine->filename_type = FNT_WCS; - wcscpy(mine->filename.w, wfilename); + mine->filename_type = FNT_WCS; + wcscpy(mine->filename.w, wfilename); #else - /* - * POSIX system does not support a wchar_t interface for - * open() system call, so we have to translate a wchar_t - * filename to multi-byte one and use it. - */ - struct archive_string fn; - - archive_string_init(&fn); - if (archive_string_append_from_wcs(&fn, wfilename, - wcslen(wfilename)) != 0) { - if (errno == ENOMEM) - archive_set_error(a, errno, - "Can't allocate memory"); - else - archive_set_error(a, EINVAL, - "Failed to convert a wide-character" - " filename to a multi-byte filename"); + /* + * POSIX system does not support a wchar_t interface for + * open() system call, so we have to translate a wchar_t + * filename to multi-byte one and use it. + */ + struct archive_string fn; + + archive_string_init(&fn); + if (archive_string_append_from_wcs(&fn, wfilename, + wcslen(wfilename)) != 0) { + if (errno == ENOMEM) + archive_set_error(a, errno, + "Can't allocate memory"); + else + archive_set_error(a, EINVAL, + "Failed to convert a wide-character" + " filename to a multi-byte filename"); + archive_string_free(&fn); + free(mine); + return (ARCHIVE_FATAL); + } + mine->filename_type = FNT_MBS; + strcpy(mine->filename.m, fn.s); archive_string_free(&fn); - free(mine); - return (ARCHIVE_FATAL); - } - mine->filename_type = FNT_MBS; - strcpy(mine->filename.m, fn.s); - archive_string_free(&fn); #endif - } - if (archive_read_append_callback_data(a, mine) != (ARCHIVE_OK)) - return (ARCHIVE_FATAL); + } + if (archive_read_append_callback_data(a, mine) != (ARCHIVE_OK)) + return (ARCHIVE_FATAL); + if (wfilenames == NULL) + break; + wfilename = *(wfilenames++); + } while (wfilename != NULL && wfilename[0] != '\0'); archive_read_set_open_callback(a, file_open); archive_read_set_read_callback(a, file_read); archive_read_set_skip_callback(a, file_skip); @@ -212,6 +229,19 @@ archive_read_open_filename_w(struct archive *a, const wchar_t *wfilename, archive_read_set_seek_callback(a, file_seek); return (archive_read_open1(a)); +no_memory: + archive_set_error(a, ENOMEM, "No memory"); + return (ARCHIVE_FATAL); +} + +int +archive_read_open_filename_w(struct archive *a, const wchar_t *wfilename, + size_t block_size) +{ + const wchar_t *wfilenames[2]; + wfilenames[0] = wfilename; + wfilenames[1] = NULL; + return archive_read_open_filenames_w(a, wfilenames, block_size); } static int diff --git a/libarchive/archive_read_open_memory.c b/libarchive/archive_read_open_memory.c index 311be47046a2..a057ce643890 100644 --- a/libarchive/archive_read_open_memory.c +++ b/libarchive/archive_read_open_memory.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_open_memory.c,v 1.6 2007/07/06 15:51:59 kientzle Exp $"); #include #include diff --git a/libarchive/archive_read_private.h b/libarchive/archive_read_private.h index 383405d52908..0c374f487eba 100644 --- a/libarchive/archive_read_private.h +++ b/libarchive/archive_read_private.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/archive_read_private.h 201088 2009-12-28 02:18:55Z kientzle $ */ #ifndef ARCHIVE_READ_PRIVATE_H_INCLUDED diff --git a/libarchive/archive_read_set_format.c b/libarchive/archive_read_set_format.c index 796dcdcced11..c74361b20c13 100644 --- a/libarchive/archive_read_set_format.c +++ b/libarchive/archive_read_set_format.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_read_set_options.3 b/libarchive/archive_read_set_options.3 index 162b79da48f4..ef18dfaa271a 100644 --- a/libarchive/archive_read_set_options.3 +++ b/libarchive/archive_read_set_options.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd January 31, 2020 .Dt ARCHIVE_READ_OPTIONS 3 .Os diff --git a/libarchive/archive_read_set_options.c b/libarchive/archive_read_set_options.c index 2bd9b811eaf4..c0a4b420734e 100644 --- a/libarchive/archive_read_set_options.c +++ b/libarchive/archive_read_set_options.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #include "archive_read_private.h" #include "archive_options_private.h" diff --git a/libarchive/archive_read_support_filter_all.c b/libarchive/archive_read_support_filter_all.c index edb508c1dfd8..cb46d120d102 100644 --- a/libarchive/archive_read_support_filter_all.c +++ b/libarchive/archive_read_support_filter_all.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #include "archive.h" #include "archive_private.h" diff --git a/libarchive/archive_read_support_filter_by_code.c b/libarchive/archive_read_support_filter_by_code.c index 94c4af695f4d..ce50d8cdf884 100644 --- a/libarchive/archive_read_support_filter_by_code.c +++ b/libarchive/archive_read_support_filter_by_code.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #include "archive.h" #include "archive_private.h" diff --git a/libarchive/archive_read_support_filter_bzip2.c b/libarchive/archive_read_support_filter_bzip2.c index 9158e668eb42..0392d450a203 100644 --- a/libarchive/archive_read_support_filter_bzip2.c +++ b/libarchive/archive_read_support_filter_bzip2.c @@ -25,8 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_ERRNO_H #include #endif @@ -192,7 +190,7 @@ bzip2_reader_init(struct archive_read_filter *self) self->code = ARCHIVE_FILTER_BZIP2; self->name = "bzip2"; - state = (struct private_data *)calloc(sizeof(*state), 1); + state = (struct private_data *)calloc(1, sizeof(*state)); out_block = (unsigned char *)malloc(out_block_size); if (state == NULL || out_block == NULL) { archive_set_error(&self->archive->archive, ENOMEM, diff --git a/libarchive/archive_read_support_filter_compress.c b/libarchive/archive_read_support_filter_compress.c index 05b80a576ac1..29ae72abef71 100644 --- a/libarchive/archive_read_support_filter_compress.c +++ b/libarchive/archive_read_support_filter_compress.c @@ -64,7 +64,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include @@ -218,7 +217,7 @@ compress_bidder_init(struct archive_read_filter *self) self->code = ARCHIVE_FILTER_COMPRESS; self->name = "compress (.Z)"; - state = (struct private_data *)calloc(sizeof(*state), 1); + state = (struct private_data *)calloc(1, sizeof(*state)); out_block = malloc(out_block_size); if (state == NULL || out_block == NULL) { free(out_block); diff --git a/libarchive/archive_read_support_filter_grzip.c b/libarchive/archive_read_support_filter_grzip.c index d4d1737cd97e..15b6757cb90c 100644 --- a/libarchive/archive_read_support_filter_grzip.c +++ b/libarchive/archive_read_support_filter_grzip.c @@ -25,9 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - - #ifdef HAVE_ERRNO_H #include #endif diff --git a/libarchive/archive_read_support_filter_gzip.c b/libarchive/archive_read_support_filter_gzip.c index 4135a6361802..152ea9bdbd7c 100644 --- a/libarchive/archive_read_support_filter_gzip.c +++ b/libarchive/archive_read_support_filter_gzip.c @@ -25,9 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - - #ifdef HAVE_ERRNO_H #include #endif @@ -310,7 +307,7 @@ gzip_bidder_init(struct archive_read_filter *self) self->code = ARCHIVE_FILTER_GZIP; self->name = "gzip"; - state = (struct private_data *)calloc(sizeof(*state), 1); + state = (struct private_data *)calloc(1, sizeof(*state)); out_block = (unsigned char *)malloc(out_block_size); if (state == NULL || out_block == NULL) { free(out_block); diff --git a/libarchive/archive_read_support_filter_lrzip.c b/libarchive/archive_read_support_filter_lrzip.c index a2389894f1d8..a562d538ed81 100644 --- a/libarchive/archive_read_support_filter_lrzip.c +++ b/libarchive/archive_read_support_filter_lrzip.c @@ -25,9 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - - #ifdef HAVE_ERRNO_H #include #endif diff --git a/libarchive/archive_read_support_filter_lz4.c b/libarchive/archive_read_support_filter_lz4.c index d0fc1a83e462..bccf4fb8f82d 100644 --- a/libarchive/archive_read_support_filter_lz4.c +++ b/libarchive/archive_read_support_filter_lz4.c @@ -25,8 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_ERRNO_H #include #endif @@ -225,7 +223,7 @@ lz4_reader_init(struct archive_read_filter *self) self->code = ARCHIVE_FILTER_LZ4; self->name = "lz4"; - state = (struct private_data *)calloc(sizeof(*state), 1); + state = (struct private_data *)calloc(1, sizeof(*state)); if (state == NULL) { archive_set_error(&self->archive->archive, ENOMEM, "Can't allocate data for lz4 decompression"); @@ -449,8 +447,8 @@ lz4_filter_read_descriptor(struct archive_read_filter *self) chsum = __archive_xxhash.XXH32(read_buf, (int)descriptor_bytes -1, 0); chsum = (chsum >> 8) & 0xff; chsum_verifier = read_buf[descriptor_bytes-1] & 0xff; - if (chsum != chsum_verifier) #ifndef DONT_FAIL_ON_CRC_ERROR + if (chsum != chsum_verifier) goto malformed_error; #endif @@ -522,8 +520,8 @@ lz4_filter_read_data_block(struct archive_read_filter *self, const void **p) read_buf + 4, (int)compressed_size, 0); unsigned int chsum_block = archive_le32dec(read_buf + 4 + compressed_size); - if (chsum != chsum_block) #ifndef DONT_FAIL_ON_CRC_ERROR + if (chsum != chsum_block) goto malformed_error; #endif } diff --git a/libarchive/archive_read_support_filter_lzop.c b/libarchive/archive_read_support_filter_lzop.c index 4ebdd3bf3eb1..e971063dc68f 100644 --- a/libarchive/archive_read_support_filter_lzop.c +++ b/libarchive/archive_read_support_filter_lzop.c @@ -26,8 +26,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_UNISTD_H #include #endif @@ -187,7 +185,7 @@ lzop_bidder_init(struct archive_read_filter *self) self->code = ARCHIVE_FILTER_LZOP; self->name = "lzop"; - state = (struct read_lzop *)calloc(sizeof(*state), 1); + state = (struct read_lzop *)calloc(1, sizeof(*state)); if (state == NULL) { archive_set_error(&self->archive->archive, ENOMEM, "Can't allocate data for lzop decompression"); @@ -282,8 +280,8 @@ consume_header(struct archive_read_filter *self) checksum = crc32(crc32(0, NULL, 0), p, len); else checksum = adler32(adler32(0, NULL, 0), p, len); - if (archive_be32dec(p + len) != checksum) #ifndef DONT_FAIL_ON_CRC_ERROR + if (archive_be32dec(p + len) != checksum) goto corrupted; #endif __archive_read_filter_consume(self->upstream, len + 4); diff --git a/libarchive/archive_read_support_filter_none.c b/libarchive/archive_read_support_filter_none.c index 95e5cfdb15dc..9eb8e54ae960 100644 --- a/libarchive/archive_read_support_filter_none.c +++ b/libarchive/archive_read_support_filter_none.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #include "archive.h" #include "archive_private.h" diff --git a/libarchive/archive_read_support_filter_program.c b/libarchive/archive_read_support_filter_program.c index 885b2c2056e6..0482c57c18eb 100644 --- a/libarchive/archive_read_support_filter_program.c +++ b/libarchive/archive_read_support_filter_program.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_WAIT_H # include diff --git a/libarchive/archive_read_support_filter_rpm.c b/libarchive/archive_read_support_filter_rpm.c index 67a979cd78f6..87e9f2ec1939 100644 --- a/libarchive/archive_read_support_filter_rpm.c +++ b/libarchive/archive_read_support_filter_rpm.c @@ -141,7 +141,7 @@ rpm_bidder_init(struct archive_read_filter *self) self->code = ARCHIVE_FILTER_RPM; self->name = "rpm"; - rpm = (struct rpm *)calloc(sizeof(*rpm), 1); + rpm = (struct rpm *)calloc(1, sizeof(*rpm)); if (rpm == NULL) { archive_set_error(&self->archive->archive, ENOMEM, "Can't allocate data for rpm"); diff --git a/libarchive/archive_read_support_filter_uu.c b/libarchive/archive_read_support_filter_uu.c index 209b2a1593a0..689ceb8f8760 100644 --- a/libarchive/archive_read_support_filter_uu.c +++ b/libarchive/archive_read_support_filter_uu.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include @@ -37,6 +36,7 @@ __FBSDID("$FreeBSD$"); #endif #include "archive.h" +#include "archive_entry.h" #include "archive_private.h" #include "archive_read_private.h" @@ -57,12 +57,17 @@ struct uudecode { #define ST_UUEND 2 #define ST_READ_BASE64 3 #define ST_IGNORE 4 + mode_t mode; + int mode_set; + char *name; }; static int uudecode_bidder_bid(struct archive_read_filter_bidder *, struct archive_read_filter *filter); static int uudecode_bidder_init(struct archive_read_filter *); +static int uudecode_read_header(struct archive_read_filter *, + struct archive_entry *entry); static ssize_t uudecode_filter_read(struct archive_read_filter *, const void **); static int uudecode_filter_close(struct archive_read_filter *); @@ -355,6 +360,7 @@ static const struct archive_read_filter_vtable uudecode_reader_vtable = { .read = uudecode_filter_read, .close = uudecode_filter_close, + .read_header = uudecode_read_header }; static int @@ -367,7 +373,7 @@ uudecode_bidder_init(struct archive_read_filter *self) self->code = ARCHIVE_FILTER_UU; self->name = "uu"; - uudecode = (struct uudecode *)calloc(sizeof(*uudecode), 1); + uudecode = (struct uudecode *)calloc(1, sizeof(*uudecode)); out_buff = malloc(OUT_BUFF_SIZE); in_buff = malloc(IN_BUFF_SIZE); if (uudecode == NULL || out_buff == NULL || in_buff == NULL) { @@ -385,6 +391,8 @@ uudecode_bidder_init(struct archive_read_filter *self) uudecode->in_allocated = IN_BUFF_SIZE; uudecode->out_buff = out_buff; uudecode->state = ST_FIND_HEAD; + uudecode->mode_set = 0; + uudecode->name = NULL; self->vtable = &uudecode_reader_vtable; return (ARCHIVE_OK); @@ -430,6 +438,22 @@ ensure_in_buff_size(struct archive_read_filter *self, return (ARCHIVE_OK); } +static int +uudecode_read_header(struct archive_read_filter *self, struct archive_entry *entry) +{ + + struct uudecode *uudecode; + uudecode = (struct uudecode *)self->data; + + if (uudecode->mode_set != 0) + archive_entry_set_mode(entry, S_IFREG | uudecode->mode); + + if (uudecode->name != NULL) + archive_entry_set_pathname(entry, uudecode->name); + + return (ARCHIVE_OK); +} + static ssize_t uudecode_filter_read(struct archive_read_filter *self, const void **buff) { @@ -439,7 +463,7 @@ uudecode_filter_read(struct archive_read_filter *self, const void **buff) ssize_t avail_in, ravail; ssize_t used; ssize_t total; - ssize_t len, llen, nl; + ssize_t len, llen, nl, namelen; uudecode = (struct uudecode *)self->data; @@ -544,6 +568,28 @@ uudecode_filter_read(struct archive_read_filter *self, const void **buff) uudecode->state = ST_READ_UU; else uudecode->state = ST_READ_BASE64; + uudecode->mode = (mode_t)( + ((int)(b[l] - '0') * 64) + + ((int)(b[l+1] - '0') * 8) + + (int)(b[l+2] - '0')); + uudecode->mode_set = 1; + namelen = len - nl - 4 - l; + if (namelen > 1) { + if (uudecode->name != NULL) + free(uudecode->name); + uudecode->name = malloc(namelen + 1); + if (uudecode->name == NULL) { + archive_set_error( + &self->archive->archive, + ENOMEM, + "Can't allocate data for uudecode"); + return (ARCHIVE_FATAL); + } + strncpy(uudecode->name, + (const char *)(b + l + 4), + namelen); + uudecode->name[namelen] = '\0'; + } } break; case ST_READ_UU: @@ -676,6 +722,7 @@ uudecode_filter_close(struct archive_read_filter *self) uudecode = (struct uudecode *)self->data; free(uudecode->in_buff); free(uudecode->out_buff); + free(uudecode->name); free(uudecode); return (ARCHIVE_OK); diff --git a/libarchive/archive_read_support_filter_xz.c b/libarchive/archive_read_support_filter_xz.c index e313d39c0cf2..e55fb00edb34 100644 --- a/libarchive/archive_read_support_filter_xz.c +++ b/libarchive/archive_read_support_filter_xz.c @@ -26,8 +26,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_ERRNO_H #include #endif @@ -478,7 +476,7 @@ xz_lzma_bidder_init(struct archive_read_filter *self) struct private_data *state; int ret; - state = (struct private_data *)calloc(sizeof(*state), 1); + state = (struct private_data *)calloc(1, sizeof(*state)); out_block = (unsigned char *)malloc(out_block_size); if (state == NULL || out_block == NULL) { archive_set_error(&self->archive->archive, ENOMEM, @@ -656,13 +654,16 @@ xz_filter_read(struct archive_read_filter *self, const void **p) struct private_data *state; size_t decompressed; ssize_t avail_in; + int64_t member_in; int ret; state = (struct private_data *)self->data; + redo: /* Empty our output buffer. */ state->stream.next_out = state->out_block; state->stream.avail_out = state->out_block_size; + member_in = state->member_in; /* Try to fill the output buffer. */ while (state->stream.avail_out > 0 && !state->eof) { @@ -707,9 +708,18 @@ xz_filter_read(struct archive_read_filter *self, const void **p) decompressed = state->stream.next_out - state->out_block; state->total_out += decompressed; state->member_out += decompressed; - if (decompressed == 0) + if (decompressed == 0) { + if (member_in != state->member_in && + self->code == ARCHIVE_FILTER_LZIP && + state->eof) { + ret = lzip_tail(self); + if (ret != ARCHIVE_OK) + return (ret); + if (!state->eof) + goto redo; + } *p = NULL; - else { + } else { *p = state->out_block; if (self->code == ARCHIVE_FILTER_LZIP) { state->crc32 = lzma_crc32(state->out_block, diff --git a/libarchive/archive_read_support_filter_zstd.c b/libarchive/archive_read_support_filter_zstd.c index 1959b5ac3991..f7326d2430d3 100644 --- a/libarchive/archive_read_support_filter_zstd.c +++ b/libarchive/archive_read_support_filter_zstd.c @@ -25,8 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_ERRNO_H #include #endif @@ -177,7 +175,7 @@ zstd_bidder_init(struct archive_read_filter *self) self->code = ARCHIVE_FILTER_ZSTD; self->name = "zstd"; - state = (struct private_data *)calloc(sizeof(*state), 1); + state = (struct private_data *)calloc(1, sizeof(*state)); out_block = (unsigned char *)malloc(out_block_size); dstream = ZSTD_createDStream(); diff --git a/libarchive/archive_read_support_format_7zip.c b/libarchive/archive_read_support_format_7zip.c index b171bea01a2f..92495e628f9a 100644 --- a/libarchive/archive_read_support_format_7zip.c +++ b/libarchive/archive_read_support_format_7zip.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include @@ -116,6 +115,30 @@ __FBSDID("$FreeBSD$"); #define kEncodedHeader 0x17 #define kDummy 0x19 +// Check that some windows file attribute constants are defined. +// Reference: https://learn.microsoft.com/en-us/windows/win32/fileio/file-attribute-constants +#ifndef FILE_ATTRIBUTE_READONLY +#define FILE_ATTRIBUTE_READONLY 0x00000001 +#endif + +#ifndef FILE_ATTRIBUTE_HIDDEN +#define FILE_ATTRIBUTE_HIDDEN 0x00000002 +#endif + +#ifndef FILE_ATTRIBUTE_SYSTEM +#define FILE_ATTRIBUTE_SYSTEM 0x00000004 +#endif + +#ifndef FILE_ATTRIBUTE_DIRECTORY +#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 +#endif + +// This value is defined in 7zip with the comment "trick for Unix". +// +// 7z archives created on unix have this bit set in the high 16 bits of +// the attr field along with the unix permissions. +#define FILE_ATTRIBUTE_UNIX_EXTENSION 0x8000 + struct _7z_digests { unsigned char *defineds; uint32_t *digests; @@ -739,6 +762,37 @@ archive_read_format_7zip_read_header(struct archive_read *a, archive_entry_set_size(entry, 0); } + // These attributes are supported by the windows implementation of archive_write_disk. + const int supported_attrs = FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM; + + if (zip_entry->attr & supported_attrs) { + char *fflags_text, *ptr; + /* allocate for "rdonly,hidden,system," */ + fflags_text = malloc(22 * sizeof(char)); + if (fflags_text != NULL) { + ptr = fflags_text; + if (zip_entry->attr & FILE_ATTRIBUTE_READONLY) { + strcpy(ptr, "rdonly,"); + ptr = ptr + 7; + } + if (zip_entry->attr & FILE_ATTRIBUTE_HIDDEN) { + strcpy(ptr, "hidden,"); + ptr = ptr + 7; + } + if (zip_entry->attr & FILE_ATTRIBUTE_SYSTEM) { + strcpy(ptr, "system,"); + ptr = ptr + 7; + } + if (ptr > fflags_text) { + /* Delete trailing comma */ + *(ptr - 1) = '\0'; + archive_entry_copy_fflags_text(entry, + fflags_text); + } + free(fflags_text); + } + } + /* If there's no body, force read_data() to return EOF immediately. */ if (zip->entry_bytes_remaining < 1) zip->end_of_entry = 1; @@ -1333,6 +1387,7 @@ init_decompression(struct archive_read *a, struct _7zip *zip, case _7Z_IA64: case _7Z_ARM: case _7Z_ARMTHUMB: + case _7Z_ARM64: case _7Z_SPARC: case _7Z_DELTA: archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, @@ -2666,6 +2721,28 @@ read_Header(struct archive_read *a, struct _7z_header_info *h, entries[i].flg |= HAS_STREAM; /* The high 16 bits of attributes is a posix file mode. */ entries[i].mode = entries[i].attr >> 16; + + if (!(entries[i].attr & FILE_ATTRIBUTE_UNIX_EXTENSION)) { + // Only windows permissions specified for this entry. Translate to + // reasonable corresponding unix permissions. + + if (entries[i].attr & FILE_ATTRIBUTE_DIRECTORY) { + if (entries[i].attr & FILE_ATTRIBUTE_READONLY) { + // Read-only directory. + entries[i].mode = AE_IFDIR | 0555; + } else { + // Read-write directory. + entries[i].mode = AE_IFDIR | 0755; + } + } else if (entries[i].attr & FILE_ATTRIBUTE_READONLY) { + // Readonly file. + entries[i].mode = AE_IFREG | 0444; + } else { + // Assume read-write file. + entries[i].mode = AE_IFREG | 0644; + } + } + if (entries[i].flg & HAS_STREAM) { if ((size_t)sindex >= si->ss.unpack_streams) return (-1); @@ -2706,7 +2783,7 @@ read_Header(struct archive_read *a, struct _7z_header_info *h, } entries[i].ssIndex = -1; } - if (entries[i].attr & 0x01) + if (entries[i].attr & FILE_ATTRIBUTE_READONLY) entries[i].mode &= ~0222;/* Read only. */ if ((entries[i].flg & HAS_STREAM) == 0 && indexInFolder == 0) { @@ -2973,8 +3050,8 @@ slurp_central_directory(struct archive_read *a, struct _7zip *zip, /* Check the EncodedHeader CRC.*/ if (r == 0 && zip->header_crc32 != next_header_crc) { - archive_set_error(&a->archive, -1, #ifndef DONT_FAIL_ON_CRC_ERROR + archive_set_error(&a->archive, -1, "Damaged 7-Zip archive"); r = -1; #endif diff --git a/libarchive/archive_read_support_format_all.c b/libarchive/archive_read_support_format_all.c index dea558bbfcc2..5a4e1ab675a5 100644 --- a/libarchive/archive_read_support_format_all.c +++ b/libarchive/archive_read_support_format_all.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_support_format_all.c 174991 2007-12-30 04:58:22Z kientzle $"); #include "archive.h" #include "archive_private.h" diff --git a/libarchive/archive_read_support_format_ar.c b/libarchive/archive_read_support_format_ar.c index 296b7db04114..ca8effb0b0ee 100644 --- a/libarchive/archive_read_support_format_ar.c +++ b/libarchive/archive_read_support_format_ar.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_support_format_ar.c 201101 2009-12-28 03:06:27Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include diff --git a/libarchive/archive_read_support_format_by_code.c b/libarchive/archive_read_support_format_by_code.c index 89e96f1f591f..7ed045f5688c 100644 --- a/libarchive/archive_read_support_format_by_code.c +++ b/libarchive/archive_read_support_format_by_code.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_read_support_format_cpio.c b/libarchive/archive_read_support_format_cpio.c index 9adcfd335b12..dcff23f694a7 100644 --- a/libarchive/archive_read_support_format_cpio.c +++ b/libarchive/archive_read_support_format_cpio.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_support_format_cpio.c 201163 2009-12-29 05:50:34Z kientzle $"); #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_read_support_format_empty.c b/libarchive/archive_read_support_format_empty.c index 53fb6cc4743b..0dccd9d9baba 100644 --- a/libarchive/archive_read_support_format_empty.c +++ b/libarchive/archive_read_support_format_empty.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_support_format_empty.c 191524 2009-04-26 18:24:14Z kientzle $"); #include "archive.h" #include "archive_entry.h" diff --git a/libarchive/archive_read_support_format_iso9660.c b/libarchive/archive_read_support_format_iso9660.c index f5414be2a565..db5cdb67f1cf 100644 --- a/libarchive/archive_read_support_format_iso9660.c +++ b/libarchive/archive_read_support_format_iso9660.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_support_format_iso9660.c 201246 2009-12-30 05:30:35Z kientzle $"); #ifdef HAVE_ERRNO_H #include @@ -3015,6 +3014,11 @@ heap_add_entry(struct archive_read *a, struct heap_queue *heap, uint64_t file_key, parent_key; int hole, parent; + /* Reserve 16 bits for possible key collisions (needed for linked items) */ + /* For ISO files with more than 65535 entries, reordering will still occur */ + key <<= 16; + key += heap->used & 0xFFFF; + /* Expand our pending files list as necessary. */ if (heap->used >= heap->allocated) { struct file_info **new_pending_files; diff --git a/libarchive/archive_read_support_format_mtree.c b/libarchive/archive_read_support_format_mtree.c index a5fa30e3c2b6..630cff6e3999 100644 --- a/libarchive/archive_read_support_format_mtree.c +++ b/libarchive/archive_read_support_format_mtree.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_support_format_mtree.c 201165 2009-12-29 05:52:13Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include diff --git a/libarchive/archive_read_support_format_rar.c b/libarchive/archive_read_support_format_rar.c index 16b6e6eed8df..99a11d170074 100644 --- a/libarchive/archive_read_support_format_rar.c +++ b/libarchive/archive_read_support_format_rar.c @@ -734,7 +734,7 @@ archive_read_support_format_rar(struct archive *_a) archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW, "archive_read_support_format_rar"); - rar = (struct rar *)calloc(sizeof(*rar), 1); + rar = (struct rar *)calloc(1, sizeof(*rar)); if (rar == NULL) { archive_set_error(&a->archive, ENOMEM, "Can't allocate rar data"); diff --git a/libarchive/archive_read_support_format_rar5.c b/libarchive/archive_read_support_format_rar5.c index 1f9099439412..e8846a5b0d0d 100644 --- a/libarchive/archive_read_support_format_rar5.c +++ b/libarchive/archive_read_support_format_rar5.c @@ -495,6 +495,11 @@ uint8_t bf_is_table_present(const struct compressed_block_header* hdr) { return (hdr->block_flags_u8 >> 7) & 1; } +static inline +uint8_t bf_is_last_block(const struct compressed_block_header* hdr) { + return (hdr->block_flags_u8 >> 6) & 1; +} + static inline struct rar5* get_context(struct archive_read* a) { return (struct rar5*) a->format->data; } @@ -3757,7 +3762,12 @@ static int do_uncompress_file(struct archive_read* a) { if(rar->cstate.last_write_ptr == rar->cstate.write_ptr) { /* The block didn't generate any new data, - * so just process a new block. */ + * so just process a new block if this one + * wasn't the last block in the file. */ + if (bf_is_last_block(&rar->last_block_hdr)) { + return ARCHIVE_EOF; + } + continue; } diff --git a/libarchive/archive_read_support_format_raw.c b/libarchive/archive_read_support_format_raw.c index ec0520b60a6c..efdbf276baf7 100644 --- a/libarchive/archive_read_support_format_raw.c +++ b/libarchive/archive_read_support_format_raw.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_support_format_raw.c 201107 2009-12-28 03:25:33Z kientzle $"); #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_read_support_format_tar.c b/libarchive/archive_read_support_format_tar.c index 93c3fd585731..e5058ee82d4d 100644 --- a/libarchive/archive_read_support_format_tar.c +++ b/libarchive/archive_read_support_format_tar.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_support_format_tar.c 201161 2009-12-29 05:44:39Z kientzle $"); #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_read_support_format_warc.c b/libarchive/archive_read_support_format_warc.c index 61ab29ea145d..c49d44eba5e5 100644 --- a/libarchive/archive_read_support_format_warc.c +++ b/libarchive/archive_read_support_format_warc.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); /** * WARC is standardised by ISO TC46/SC4/WG12 and currently available as diff --git a/libarchive/archive_read_support_format_xar.c b/libarchive/archive_read_support_format_xar.c index ec9cb1981f3d..fd63594373cb 100644 --- a/libarchive/archive_read_support_format_xar.c +++ b/libarchive/archive_read_support_format_xar.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include @@ -623,8 +622,8 @@ read_toc(struct archive_read *a) (size_t)xar->toc_chksum_size, NULL, 0); __archive_read_consume(a, xar->toc_chksum_size); xar->offset += xar->toc_chksum_size; - if (r != ARCHIVE_OK) #ifndef DONT_FAIL_ON_CRC_ERROR + if (r != ARCHIVE_OK) return (ARCHIVE_FATAL); #endif } diff --git a/libarchive/archive_read_support_format_zip.c b/libarchive/archive_read_support_format_zip.c index c3b9b5755e58..212bfff9fa7b 100644 --- a/libarchive/archive_read_support_format_zip.c +++ b/libarchive/archive_read_support_format_zip.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_read_support_format_zip.c 201102 2009-12-28 03:11:36Z kientzle $"); /* * The definitive documentation of the Zip file format is: @@ -119,7 +118,7 @@ struct trad_enc_ctx { /* Bits used in zip_flags. */ #define ZIP_ENCRYPTED (1 << 0) -#define ZIP_LENGTH_AT_END (1 << 3) +#define ZIP_LENGTH_AT_END (1 << 3) /* Also called "Streaming bit" */ #define ZIP_STRONG_ENCRYPTED (1 << 6) #define ZIP_UTF8_NAME (1 << 11) /* See "7.2 Single Password Symmetric Encryption Method" @@ -166,8 +165,8 @@ struct zip { int64_t entry_compressed_bytes_read; int64_t entry_uncompressed_bytes_read; - /* Running CRC32 of the decompressed data */ - unsigned long entry_crc32; + /* Running CRC32 of the decompressed and decrypted data */ + unsigned long computed_crc32; unsigned long (*crc32func)(unsigned long, const void *, size_t); char ignore_crc32; @@ -945,7 +944,7 @@ zip_read_local_file_header(struct archive_read *a, struct archive_entry *entry, zip->end_of_entry = 0; zip->entry_uncompressed_bytes_read = 0; zip->entry_compressed_bytes_read = 0; - zip->entry_crc32 = zip->crc32func(0, NULL, 0); + zip->computed_crc32 = zip->crc32func(0, NULL, 0); /* Setup default conversion. */ if (zip->sconv == NULL && !zip->init_default_conversion) { @@ -1140,7 +1139,8 @@ zip_read_local_file_header(struct archive_read *a, struct archive_entry *entry, "Inconsistent CRC32 values"); ret = ARCHIVE_WARN; } - if (zip_entry->compressed_size == 0) { + if (zip_entry->compressed_size == 0 + || zip_entry->compressed_size == 0xffffffff) { zip_entry->compressed_size = zip_entry_central_dir.compressed_size; } else if (zip_entry->compressed_size @@ -1284,7 +1284,8 @@ zip_read_local_file_header(struct archive_read *a, struct archive_entry *entry, return ARCHIVE_FATAL; } } else if (0 == (zip_entry->zip_flags & ZIP_LENGTH_AT_END) - || zip_entry->uncompressed_size > 0) { + || (zip_entry->uncompressed_size > 0 + && zip_entry->uncompressed_size != 0xffffffff)) { /* Set the size only if it's meaningful. */ archive_entry_set_size(entry, zip_entry->uncompressed_size); } @@ -1343,25 +1344,267 @@ check_authentication_code(struct archive_read *a, const void *_p) } /* - * Read "uncompressed" data. There are three cases: - * 1) We know the size of the data. This is always true for the - * seeking reader (we've examined the Central Directory already). - * 2) ZIP_LENGTH_AT_END was set, but only the CRC was deferred. - * Info-ZIP seems to do this; we know the size but have to grab - * the CRC from the data descriptor afterwards. - * 3) We're streaming and ZIP_LENGTH_AT_END was specified and - * we have no size information. In this case, we can do pretty - * well by watching for the data descriptor record. The data - * descriptor is 16 bytes and includes a computed CRC that should - * provide a strong check. + * The Zip end-of-file marker is inherently ambiguous. The specification + * in APPNOTE.TXT allows any of four possible formats, and there is no + * guaranteed-correct way for a reader to know a priori which one the writer + * will have used. The four formats are: + * 1. 32-bit format with an initial PK78 marker + * 2. 32-bit format without that marker + * 3. 64-bit format with the marker + * 4. 64-bit format without the marker * - * TODO: Technically, the PK\007\010 signature is optional. - * In the original spec, the data descriptor contained CRC - * and size fields but had no leading signature. In practice, - * newer writers seem to provide the signature pretty consistently. + * Mark Adler's `sunzip` streaming unzip program solved this ambiguity + * by just looking at every possible combination and accepting the + * longest one that matches the expected values. His approach always + * consumes the longest possible matching EOF marker, based on an + * analysis of all the possible failures and how the values could + * overlap. * - * For uncompressed data, the PK\007\010 marker seems essential - * to be sure we've actually seen the end of the entry. + * For example, suppose both of the first two formats listed + * above match. In that case, we know the next four + * 32-bit words match this pattern: + * ``` + * [PK\07\08] [CRC32] [compressed size] [uncompressed size] + * ``` + * but we know they must also match this pattern: + * ``` + * [CRC32] [compressed size] [uncompressed size] [other PK marker] + * ``` + * + * Since the first word here matches both the PK78 signature in the + * first form and the CRC32 in the second, we know those two values + * are equal, the CRC32 must be exactly 0x08074b50. Similarly, the + * compressed and uncompressed size must also be exactly this value. + * So we know these four words are all 0x08074b50. If we were to + * accept the shorter pattern, it would be immediately followed by + * another PK78 marker, which is not possible in a well-formed ZIP + * archive unless there is garbage between entries. This implies we + * should not accept the shorter form in such a case; we should accept + * the longer form. + * + * If the second and third possibilities above both match, we + * have a slightly different situation. The following words + * must match both the 32-bit format + * ``` + * [CRC32] [compressed size] [uncompressed size] [other PK marker] + * ``` + * and the 64-bit format + * ``` + * [CRC32] [compressed low] [compressed high] [uncompressed low] [uncompressed high] [other PK marker] + * ``` + * Since the 32-bit and 64-bit compressed sizes both match, the + * actualy size must fit in 32 bits, which implies the high-order + * word of the compressed size is zero. So we know the uncompressed + * low word is zero, which again implies that if we accept the shorter + * format, there will not be a valid PK marker following it. + * + * Similar considerations rule out the shorter form in every other + * possibly-ambiguous pair. So if two of the four possible formats + * match, we should accept the longer option. + * + * If none of the four formats matches, we know the archive must be + * corrupted in some fashion. In particular, it's possible that the + * length-at-end bit was incorrect and we should not really be looking + * for an EOF marker at all. To allow for this possibility, we + * evaluate the following words to collect data for a later error + * report but do not consume any bytes. We instead rely on the later + * search for a new PK marker to re-sync to the next well-formed + * entry. + */ +static void +consume_end_of_file_marker(struct archive_read *a, struct zip *zip) +{ + const char *marker; + const char *p; + uint64_t compressed32, uncompressed32; + uint64_t compressed64, uncompressed64; + uint64_t compressed_actual, uncompressed_actual; + uint32_t crc32_actual; + const uint32_t PK78 = 0x08074B50ULL; + uint8_t crc32_ignored, crc32_may_be_zero; + + /* If there shouldn't be a marker, don't consume it. */ + if ((zip->entry->zip_flags & ZIP_LENGTH_AT_END) == 0) { + return; + } + + /* The longest Zip end-of-file record is 24 bytes. Since an + * end-of-file record can never appear at the end of the + * archive, we know 24 bytes will be available unless + * the archive is severely truncated. */ + if (NULL == (marker = __archive_read_ahead(a, 24, NULL))) { + return; + } + p = marker; + + /* The end-of-file record comprises: + * = Optional PK\007\010 marker + * = 4-byte CRC32 + * = Compressed size + * = Uncompressed size + * + * The last two fields are either both 32 bits or both 64 + * bits. We check all possible layouts and accept any one + * that gives us a complete match, else we make a best-effort + * attempt to parse out the pieces. + */ + + /* CRC32 checking can be tricky: + * * Test suites sometimes ignore the CRC32 + * * AES AE-2 always writes zero for the CRC32 + * * AES AE-1 sometimes writes zero for the CRC32 + */ + crc32_ignored = zip->ignore_crc32; + crc32_may_be_zero = 0; + crc32_actual = zip->computed_crc32; + if (zip->hctx_valid) { + switch (zip->entry->aes_extra.vendor) { + case AES_VENDOR_AE_2: + crc32_actual = 0; + break; + case AES_VENDOR_AE_1: + default: + crc32_may_be_zero = 1; + break; + } + } + + /* Values computed from the actual data in the archive. */ + compressed_actual = (uint64_t)zip->entry_compressed_bytes_read; + uncompressed_actual = (uint64_t)zip->entry_uncompressed_bytes_read; + + + /* Longest: PK78 marker, all 64-bit fields (24 bytes total) */ + if (archive_le32dec(p) == PK78 + && ((archive_le32dec(p + 4) == crc32_actual) + || (crc32_may_be_zero && (archive_le32dec(p + 4) == 0)) + || crc32_ignored) + && (archive_le64dec(p + 8) == compressed_actual) + && (archive_le64dec(p + 16) == uncompressed_actual)) { + if (!crc32_ignored) { + zip->entry->crc32 = crc32_actual; + } + zip->entry->compressed_size = compressed_actual; + zip->entry->uncompressed_size = uncompressed_actual; + zip->unconsumed += 24; + return; + } + + /* No PK78 marker, 64-bit fields (20 bytes total) */ + if (((archive_le32dec(p) == crc32_actual) + || (crc32_may_be_zero && (archive_le32dec(p + 4) == 0)) + || crc32_ignored) + && (archive_le64dec(p + 4) == compressed_actual) + && (archive_le64dec(p + 12) == uncompressed_actual)) { + if (!crc32_ignored) { + zip->entry->crc32 = crc32_actual; + } + zip->entry->compressed_size = compressed_actual; + zip->entry->uncompressed_size = uncompressed_actual; + zip->unconsumed += 20; + return; + } + + /* PK78 marker and 32-bit fields (16 bytes total) */ + if (archive_le32dec(p) == PK78 + && ((archive_le32dec(p + 4) == crc32_actual) + || (crc32_may_be_zero && (archive_le32dec(p + 4) == 0)) + || crc32_ignored) + && (archive_le32dec(p + 8) == compressed_actual) + && (archive_le32dec(p + 12) == uncompressed_actual)) { + if (!crc32_ignored) { + zip->entry->crc32 = crc32_actual; + } + zip->entry->compressed_size = compressed_actual; + zip->entry->uncompressed_size = uncompressed_actual; + zip->unconsumed += 16; + return; + } + + /* Shortest: No PK78 marker, all 32-bit fields (12 bytes total) */ + if (((archive_le32dec(p) == crc32_actual) + || (crc32_may_be_zero && (archive_le32dec(p + 4) == 0)) + || crc32_ignored) + && (archive_le32dec(p + 4) == compressed_actual) + && (archive_le32dec(p + 8) == uncompressed_actual)) { + if (!crc32_ignored) { + zip->entry->crc32 = crc32_actual; + } + zip->entry->compressed_size = compressed_actual; + zip->entry->uncompressed_size = uncompressed_actual; + zip->unconsumed += 12; + return; + } + + /* If none of the above patterns gives us a full exact match, + * then there's something definitely amiss. The fallback code + * below will parse out some plausible values for error + * reporting purposes. Note that this won't actually + * consume anything: + * + * = If there really is a marker here, the logic to resync to + * the next entry will suffice to skip it. + * + * = There might not really be a marker: Corruption or bugs + * may have set the length-at-end bit without a marker ever + * having actually been written. In this case, we + * explicitly should not consume any bytes, since that would + * prevent us from correctly reading the next entry. + */ + if (archive_le32dec(p) == PK78) { + p += 4; /* Ignore PK78 if it appears to be present */ + } + zip->entry->crc32 = archive_le32dec(p); /* Parse CRC32 */ + p += 4; + + /* Consider both 32- and 64-bit interpretations */ + compressed32 = archive_le32dec(p); + uncompressed32 = archive_le32dec(p + 4); + compressed64 = archive_le64dec(p); + uncompressed64 = archive_le64dec(p + 8); + + /* The earlier patterns may have failed because of CRC32 + * mismatch, so it's still possible that both sizes match. + * Try to match as many as we can... + */ + if (compressed32 == compressed_actual + && uncompressed32 == uncompressed_actual) { + /* Both 32-bit fields match */ + zip->entry->compressed_size = compressed32; + zip->entry->uncompressed_size = uncompressed32; + } else if (compressed64 == compressed_actual + || uncompressed64 == uncompressed_actual) { + /* One or both 64-bit fields match */ + zip->entry->compressed_size = compressed64; + zip->entry->uncompressed_size = uncompressed64; + } else { + /* Zero or one 32-bit fields match */ + zip->entry->compressed_size = compressed32; + zip->entry->uncompressed_size = uncompressed32; + } +} + +/* + * Read "uncompressed" data. + * + * This is straightforward if we know the size of the data. This is + * always true for the seeking reader (we've examined the Central + * Directory already), and will often be true for the streaming reader + * (the writer was writing uncompressed so probably knows the size). + * + * If we don't know the size, then life is more interesting. Note + * that a careful reading of the Zip specification says that a writer + * must use ZIP_LENGTH_AT_END if it cannot write the CRC into the + * local header. And if it uses ZIP_LENGTH_AT_END, then it is + * prohibited from storing the sizes in the local header. This + * prevents fully-compliant streaming writers from providing any size + * clues to a streaming reader. In this case, we have to scan the + * data as we read to try to locate the end-of-file marker. + * + * We assume here that the end-of-file marker always has the + * PK\007\010 signature. Although it's technically optional, newer + * writers seem to provide it pretty consistently, and it's not clear + * how to efficiently recognize an end-of-file marker that lacks it. * * Returns ARCHIVE_OK if successful, ARCHIVE_FATAL otherwise, sets * zip->end_of_entry if it consumes all of the data. @@ -1373,18 +1616,18 @@ zip_read_data_none(struct archive_read *a, const void **_buff, struct zip *zip; const char *buff; ssize_t bytes_avail; + ssize_t trailing_extra; int r; (void)offset; /* UNUSED */ zip = (struct zip *)(a->format->data); + trailing_extra = zip->hctx_valid ? AUTH_CODE_SIZE : 0; if (zip->entry->zip_flags & ZIP_LENGTH_AT_END) { const char *p; - ssize_t grabbing_bytes = 24; + ssize_t grabbing_bytes = 24 + trailing_extra; - if (zip->hctx_valid) - grabbing_bytes += AUTH_CODE_SIZE; /* Grab at least 24 bytes. */ buff = __archive_read_ahead(a, grabbing_bytes, &bytes_avail); if (bytes_avail < grabbing_bytes) { @@ -1399,44 +1642,19 @@ zip_read_data_none(struct archive_read *a, const void **_buff, } /* Check for a complete PK\007\010 signature, followed * by the correct 4-byte CRC. */ - p = buff; - if (zip->hctx_valid) - p += AUTH_CODE_SIZE; + p = buff + trailing_extra; if (p[0] == 'P' && p[1] == 'K' && p[2] == '\007' && p[3] == '\010' - && (archive_le32dec(p + 4) == zip->entry_crc32 + && (archive_le32dec(p + 4) == zip->computed_crc32 || zip->ignore_crc32 || (zip->hctx_valid && zip->entry->aes_extra.vendor == AES_VENDOR_AE_2))) { - if (zip->entry->flags & LA_USED_ZIP64) { - uint64_t compressed, uncompressed; - zip->entry->crc32 = archive_le32dec(p + 4); - compressed = archive_le64dec(p + 8); - uncompressed = archive_le64dec(p + 16); - if (compressed > INT64_MAX || uncompressed > - INT64_MAX) { - archive_set_error(&a->archive, - ARCHIVE_ERRNO_FILE_FORMAT, - "Overflow of 64-bit file sizes"); - return ARCHIVE_FAILED; - } - zip->entry->compressed_size = compressed; - zip->entry->uncompressed_size = uncompressed; - zip->unconsumed = 24; - } else { - zip->entry->crc32 = archive_le32dec(p + 4); - zip->entry->compressed_size = - archive_le32dec(p + 8); - zip->entry->uncompressed_size = - archive_le32dec(p + 12); - zip->unconsumed = 16; - } + zip->end_of_entry = 1; if (zip->hctx_valid) { r = check_authentication_code(a, buff); if (r != ARCHIVE_OK) return (r); } - zip->end_of_entry = 1; return (ARCHIVE_OK); } /* If not at EOF, ensure we consume at least one byte. */ @@ -1452,11 +1670,10 @@ zip_read_data_none(struct archive_read *a, const void **_buff, else if (p[3] == '\007') { p += 1; } else if (p[3] == '\010' && p[2] == '\007' && p[1] == 'K' && p[0] == 'P') { - if (zip->hctx_valid) - p -= AUTH_CODE_SIZE; break; } else { p += 4; } } + p -= trailing_extra; bytes_avail = p - buff; } else { if (zip->entry_bytes_remaining == 0) { @@ -1499,59 +1716,15 @@ zip_read_data_none(struct archive_read *a, const void **_buff, bytes_avail = dec_size; buff = (const char *)zip->decrypted_buffer; } - *size = bytes_avail; zip->entry_bytes_remaining -= bytes_avail; zip->entry_uncompressed_bytes_read += bytes_avail; zip->entry_compressed_bytes_read += bytes_avail; zip->unconsumed += bytes_avail; + *size = bytes_avail; *_buff = buff; return (ARCHIVE_OK); } -static int -consume_optional_marker(struct archive_read *a, struct zip *zip) -{ - if (zip->end_of_entry && (zip->entry->zip_flags & ZIP_LENGTH_AT_END)) { - const char *p; - - if (NULL == (p = __archive_read_ahead(a, 24, NULL))) { - archive_set_error(&a->archive, - ARCHIVE_ERRNO_FILE_FORMAT, - "Truncated ZIP end-of-file record"); - return (ARCHIVE_FATAL); - } - /* Consume the optional PK\007\010 marker. */ - if (p[0] == 'P' && p[1] == 'K' && - p[2] == '\007' && p[3] == '\010') { - p += 4; - zip->unconsumed = 4; - } - if (zip->entry->flags & LA_USED_ZIP64) { - uint64_t compressed, uncompressed; - zip->entry->crc32 = archive_le32dec(p); - compressed = archive_le64dec(p + 4); - uncompressed = archive_le64dec(p + 12); - if (compressed > INT64_MAX || - uncompressed > INT64_MAX) { - archive_set_error(&a->archive, - ARCHIVE_ERRNO_FILE_FORMAT, - "Overflow of 64-bit file sizes"); - return ARCHIVE_FAILED; - } - zip->entry->compressed_size = compressed; - zip->entry->uncompressed_size = uncompressed; - zip->unconsumed += 20; - } else { - zip->entry->crc32 = archive_le32dec(p); - zip->entry->compressed_size = archive_le32dec(p + 4); - zip->entry->uncompressed_size = archive_le32dec(p + 8); - zip->unconsumed += 12; - } - } - - return (ARCHIVE_OK); -} - #if HAVE_LZMA_H && HAVE_LIBLZMA static int zipx_xz_init(struct archive_read *a, struct zip *zip) @@ -1803,10 +1976,6 @@ zip_read_data_zipx_xz(struct archive_read *a, const void **buff, *size = zip->zipx_lzma_stream.total_out; *buff = zip->uncompressed_buffer; - ret = consume_optional_marker(a, zip); - if (ret != ARCHIVE_OK) - return (ret); - return (ARCHIVE_OK); } @@ -1871,8 +2040,6 @@ zip_read_data_zipx_lzma_alone(struct archive_read *a, const void **buff, /* This case is optional in lzma alone format. It can happen, * but most of the files don't have it. (GitHub #1257) */ case LZMA_STREAM_END: - lzma_end(&zip->zipx_lzma_stream); - zip->zipx_lzma_valid = 0; if((int64_t) zip->zipx_lzma_stream.total_in != zip->entry_bytes_remaining) { @@ -1906,21 +2073,18 @@ zip_read_data_zipx_lzma_alone(struct archive_read *a, const void **buff, zip->end_of_entry = 1; } - /* Return values. */ - *size = zip->zipx_lzma_stream.total_out; - *buff = zip->uncompressed_buffer; - - /* Behave the same way as during deflate decompression. */ - ret = consume_optional_marker(a, zip); - if (ret != ARCHIVE_OK) - return (ret); - /* Free lzma decoder handle because we'll no longer need it. */ + /* This cannot be folded into LZMA_STREAM_END handling above + * because the stream end marker is not required in this format. */ if(zip->end_of_entry) { lzma_end(&zip->zipx_lzma_stream); zip->zipx_lzma_valid = 0; } + /* Return values. */ + *size = zip->zipx_lzma_stream.total_out; + *buff = zip->uncompressed_buffer; + /* If we're here, then we're good! */ return (ARCHIVE_OK); } @@ -2078,10 +2242,6 @@ zip_read_data_zipx_ppmd(struct archive_read *a, const void **buff, ++consumed_bytes; } while(consumed_bytes < zip->uncompressed_buffer_size); - /* Update pointers for libarchive. */ - *buff = zip->uncompressed_buffer; - *size = consumed_bytes; - /* Update pointers so we can continue decompression in another call. */ zip->entry_bytes_remaining -= zip->zipx_ppmd_read_compressed; zip->entry_compressed_bytes_read += zip->zipx_ppmd_read_compressed; @@ -2093,10 +2253,9 @@ zip_read_data_zipx_ppmd(struct archive_read *a, const void **buff, zip->ppmd8_valid = 0; } - /* Seek for optional marker, same way as in each zip entry. */ - ret = consume_optional_marker(a, zip); - if (ret != ARCHIVE_OK) - return ret; + /* Update pointers for libarchive. */ + *buff = zip->uncompressed_buffer; + *size = consumed_bytes; return ARCHIVE_OK; } @@ -2238,11 +2397,6 @@ zip_read_data_zipx_bzip2(struct archive_read *a, const void **buff, *size = total_out; *buff = zip->uncompressed_buffer; - /* Seek for optional marker, like in other entries. */ - r = consume_optional_marker(a, zip); - if(r != ARCHIVE_OK) - return r; - return ARCHIVE_OK; } @@ -2373,11 +2527,6 @@ zip_read_data_zipx_zstd(struct archive_read *a, const void **buff, *size = total_out; *buff = zip->uncompressed_buffer; - /* Seek for optional marker, like in other entries. */ - r = consume_optional_marker(a, zip); - if(r != ARCHIVE_OK) - return r; - return ARCHIVE_OK; } #endif @@ -2413,7 +2562,7 @@ zip_read_data_deflate(struct archive_read *a, const void **buff, size_t *size, int64_t *offset) { struct zip *zip; - ssize_t bytes_avail; + ssize_t bytes_avail, to_consume = 0; const void *compressed_buff, *sp; int r; @@ -2534,34 +2683,33 @@ zip_read_data_deflate(struct archive_read *a, const void **buff, } /* Consume as much as the compressor actually used. */ - bytes_avail = zip->stream.total_in; + to_consume = zip->stream.total_in; + __archive_read_consume(a, to_consume); + zip->entry_bytes_remaining -= to_consume; + zip->entry_compressed_bytes_read += to_consume; + zip->entry_uncompressed_bytes_read += zip->stream.total_out; + if (zip->tctx_valid || zip->cctx_valid) { - zip->decrypted_bytes_remaining -= bytes_avail; + zip->decrypted_bytes_remaining -= to_consume; if (zip->decrypted_bytes_remaining == 0) zip->decrypted_ptr = zip->decrypted_buffer; else - zip->decrypted_ptr += bytes_avail; + zip->decrypted_ptr += to_consume; } - /* Calculate compressed data as much as we used.*/ if (zip->hctx_valid) - archive_hmac_sha1_update(&zip->hctx, sp, bytes_avail); - __archive_read_consume(a, bytes_avail); - zip->entry_bytes_remaining -= bytes_avail; - zip->entry_compressed_bytes_read += bytes_avail; - - *size = zip->stream.total_out; - zip->entry_uncompressed_bytes_read += zip->stream.total_out; - *buff = zip->uncompressed_buffer; + archive_hmac_sha1_update(&zip->hctx, sp, to_consume); - if (zip->end_of_entry && zip->hctx_valid) { - r = check_authentication_code(a, NULL); - if (r != ARCHIVE_OK) - return (r); + if (zip->end_of_entry) { + if (zip->hctx_valid) { + r = check_authentication_code(a, NULL); + if (r != ARCHIVE_OK) { + return (r); + } + } } - r = consume_optional_marker(a, zip); - if (r != ARCHIVE_OK) - return (r); + *size = zip->stream.total_out; + *buff = zip->uncompressed_buffer; return (ARCHIVE_OK); } @@ -3029,13 +3177,27 @@ archive_read_format_zip_read_data(struct archive_read *a, } if (r != ARCHIVE_OK) return (r); - /* Update checksum */ - if (*size) - zip->entry_crc32 = zip->crc32func(zip->entry_crc32, *buff, - (unsigned)*size); - /* If we hit the end, swallow any end-of-data marker. */ + if (*size > 0) { + zip->computed_crc32 = zip->crc32func(zip->computed_crc32, *buff, + (unsigned)*size); + } + /* If we hit the end, swallow any end-of-data marker and + * verify the final check values. */ if (zip->end_of_entry) { - /* Check file size, CRC against these values. */ + consume_end_of_file_marker(a, zip); + + /* Check computed CRC against header */ + if ((!zip->hctx_valid || + zip->entry->aes_extra.vendor != AES_VENDOR_AE_2) && + zip->entry->crc32 != zip->computed_crc32 + && !zip->ignore_crc32) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, + "ZIP bad CRC: 0x%lx should be 0x%lx", + (unsigned long)zip->computed_crc32, + (unsigned long)zip->entry->crc32); + return (ARCHIVE_FAILED); + } + /* Check file size against header. */ if (zip->entry->compressed_size != zip->entry_compressed_bytes_read) { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, @@ -3043,7 +3205,7 @@ archive_read_format_zip_read_data(struct archive_read *a, "(read %jd, expected %jd)", (intmax_t)zip->entry_compressed_bytes_read, (intmax_t)zip->entry->compressed_size); - return (ARCHIVE_WARN); + return (ARCHIVE_FAILED); } /* Size field only stores the lower 32 bits of the actual * size. */ @@ -3054,18 +3216,7 @@ archive_read_format_zip_read_data(struct archive_read *a, "(read %jd, expected %jd)\n", (intmax_t)zip->entry_uncompressed_bytes_read, (intmax_t)zip->entry->uncompressed_size); - return (ARCHIVE_WARN); - } - /* Check computed CRC against header */ - if ((!zip->hctx_valid || - zip->entry->aes_extra.vendor != AES_VENDOR_AE_2) && - zip->entry->crc32 != zip->entry_crc32 - && !zip->ignore_crc32) { - archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, - "ZIP bad CRC: 0x%lx should be 0x%lx", - (unsigned long)zip->entry_crc32, - (unsigned long)zip->entry->crc32); - return (ARCHIVE_WARN); + return (ARCHIVE_FAILED); } } diff --git a/libarchive/archive_string.c b/libarchive/archive_string.c index accf52631a89..f39677ad7a26 100644 --- a/libarchive/archive_string.c +++ b/libarchive/archive_string.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_string.c 201095 2009-12-28 02:33:22Z kientzle $"); /* * Basic resizable string support, to simplify manipulating arbitrary-sized @@ -553,6 +552,8 @@ archive_wstring_append_from_mbs_in_codepage(struct archive_wstring *dest, } else mbflag = MB_PRECOMPOSED; + mbflag |= MB_ERR_INVALID_CHARS; + buffsize = dest->length + length + 1; do { /* Allocate memory for WCS. */ @@ -1527,7 +1528,7 @@ get_current_codepage(void) p = strrchr(locale, '.'); if (p == NULL) return (GetACP()); - if (strcmp(p+1, "utf8") == 0) + if ((strcmp(p+1, "utf8") == 0) || (strcmp(p+1, "UTF-8") == 0)) return CP_UTF8; cp = my_atoi(p+1); if ((int)cp <= 0) @@ -4227,6 +4228,17 @@ archive_mstring_update_utf8(struct archive *a, struct archive_mstring *aes, if (sc == NULL) return (-1);/* Couldn't allocate memory for sc. */ r = archive_strcpy_l(&(aes->aes_mbs), utf8, sc); + +#if defined(_WIN32) && !defined(__CYGWIN__) + /* On failure, make an effort to convert UTF8 to WCS as the active code page + * may not be able to represent all characters in the string */ + if (r != 0) { + if (archive_wstring_append_from_mbs_in_codepage(&(aes->aes_wcs), + aes->aes_utf8.s, aes->aes_utf8.length, sc) == 0) + aes->aes_set = AES_SET_UTF8 | AES_SET_WCS; + } +#endif + if (a == NULL) free_sconv_object(sc); if (r != 0) diff --git a/libarchive/archive_string.h b/libarchive/archive_string.h index 49d7d3064a3d..e8987867d3ce 100644 --- a/libarchive/archive_string.h +++ b/libarchive/archive_string.h @@ -21,9 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/archive_string.h 201092 2009-12-28 02:26:06Z kientzle $ - * */ #ifndef ARCHIVE_STRING_H_INCLUDED diff --git a/libarchive/archive_string_composition.h b/libarchive/archive_string_composition.h index d0ac340961a0..e917036f1167 100644 --- a/libarchive/archive_string_composition.h +++ b/libarchive/archive_string_composition.h @@ -22,8 +22,6 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD$ - * */ /* diff --git a/libarchive/archive_string_sprintf.c b/libarchive/archive_string_sprintf.c index 969a5603a49e..c785e12bdf6d 100644 --- a/libarchive/archive_string_sprintf.c +++ b/libarchive/archive_string_sprintf.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_string_sprintf.c 189435 2009-03-06 05:14:55Z kientzle $"); /* * The use of printf()-family functions can be troublesome diff --git a/libarchive/archive_util.3 b/libarchive/archive_util.3 index d5d4e7dfd7d5..3aa508f25aa2 100644 --- a/libarchive/archive_util.3 +++ b/libarchive/archive_util.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_UTIL 3 .Os diff --git a/libarchive/archive_util.c b/libarchive/archive_util.c index 40603c483a60..32d4bd40988c 100644 --- a/libarchive/archive_util.c +++ b/libarchive/archive_util.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_util.c 201098 2009-12-28 02:58:14Z kientzle $"); #ifdef HAVE_SYS_TYPES_H #include diff --git a/libarchive/archive_version_details.c b/libarchive/archive_version_details.c index bfb20eab2027..29be24f3222e 100644 --- a/libarchive/archive_version_details.c +++ b/libarchive/archive_version_details.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_util.c 201098 2009-12-28 02:58:14Z kientzle $"); #ifdef HAVE_STDLIB_H #include diff --git a/libarchive/archive_virtual.c b/libarchive/archive_virtual.c index f509ee5c672d..97e0b8a0d7b7 100644 --- a/libarchive/archive_virtual.c +++ b/libarchive/archive_virtual.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_virtual.c 201098 2009-12-28 02:58:14Z kientzle $"); #include "archive.h" #include "archive_entry.h" diff --git a/libarchive/archive_windows.c b/libarchive/archive_windows.c index ebc5eefb800a..bb540da011f7 100644 --- a/libarchive/archive_windows.c +++ b/libarchive/archive_windows.c @@ -22,8 +22,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ /* diff --git a/libarchive/archive_windows.h b/libarchive/archive_windows.h index 47b7cb8e379f..6b7006a00a1e 100644 --- a/libarchive/archive_windows.h +++ b/libarchive/archive_windows.h @@ -23,8 +23,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ /* diff --git a/libarchive/archive_write.3 b/libarchive/archive_write.3 index e7f7f1384ee8..227e4e028449 100644 --- a/libarchive/archive_write.3 +++ b/libarchive/archive_write.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_WRITE 3 .Os diff --git a/libarchive/archive_write.c b/libarchive/archive_write.c index ec3c95c56685..b70bc785c738 100644 --- a/libarchive/archive_write.c +++ b/libarchive/archive_write.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write.c 201099 2009-12-28 03:03:00Z kientzle $"); /* * This file contains the "essential" portions of the write API, that @@ -115,7 +114,7 @@ archive_write_new(void) /* Initialize a block of nulls for padding purposes. */ a->null_length = 1024; - nulls = (unsigned char *)calloc(1, a->null_length); + nulls = (unsigned char *)calloc(a->null_length, sizeof(unsigned char)); if (nulls == NULL) { free(a); return (NULL); diff --git a/libarchive/archive_write_add_filter.c b/libarchive/archive_write_add_filter.c index 203f4142b5c9..aa962515a044 100644 --- a/libarchive/archive_write_add_filter.c +++ b/libarchive/archive_write_add_filter.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_TYPES_H #include diff --git a/libarchive/archive_write_add_filter_b64encode.c b/libarchive/archive_write_add_filter_b64encode.c index 87fdb73ecb09..084d195402bc 100644 --- a/libarchive/archive_write_add_filter_b64encode.c +++ b/libarchive/archive_write_add_filter_b64encode.c @@ -25,8 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_ERRNO_H #include #endif diff --git a/libarchive/archive_write_add_filter_by_name.c b/libarchive/archive_write_add_filter_by_name.c index ffa633c96371..fc62458c56ee 100644 --- a/libarchive/archive_write_add_filter_by_name.c +++ b/libarchive/archive_write_add_filter_by_name.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_TYPES_H #include diff --git a/libarchive/archive_write_add_filter_bzip2.c b/libarchive/archive_write_add_filter_bzip2.c index 3e5c0891ae85..561e11b5d70a 100644 --- a/libarchive/archive_write_add_filter_bzip2.c +++ b/libarchive/archive_write_add_filter_bzip2.c @@ -26,8 +26,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_compression_bzip2.c 201091 2009-12-28 02:22:41Z kientzle $"); - #ifdef HAVE_ERRNO_H #include #endif diff --git a/libarchive/archive_write_add_filter_compress.c b/libarchive/archive_write_add_filter_compress.c index 3ed269fce943..78afebda3e35 100644 --- a/libarchive/archive_write_add_filter_compress.c +++ b/libarchive/archive_write_add_filter_compress.c @@ -58,8 +58,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_compression_compress.c 201111 2009-12-28 03:33:05Z kientzle $"); - #ifdef HAVE_ERRNO_H #include #endif diff --git a/libarchive/archive_write_add_filter_grzip.c b/libarchive/archive_write_add_filter_grzip.c index 371102d74c05..f8bb886061e5 100644 --- a/libarchive/archive_write_add_filter_grzip.c +++ b/libarchive/archive_write_add_filter_grzip.c @@ -25,8 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_ERRNO_H #include #endif diff --git a/libarchive/archive_write_add_filter_gzip.c b/libarchive/archive_write_add_filter_gzip.c index 8670d5ca7403..a7fabbfa6bd5 100644 --- a/libarchive/archive_write_add_filter_gzip.c +++ b/libarchive/archive_write_add_filter_gzip.c @@ -25,8 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_compression_gzip.c 201081 2009-12-28 02:04:42Z kientzle $"); - #ifdef HAVE_ERRNO_H #include #endif diff --git a/libarchive/archive_write_add_filter_lrzip.c b/libarchive/archive_write_add_filter_lrzip.c index e215f8903259..fe974c93d5d0 100644 --- a/libarchive/archive_write_add_filter_lrzip.c +++ b/libarchive/archive_write_add_filter_lrzip.c @@ -25,8 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_ERRNO_H #include #endif diff --git a/libarchive/archive_write_add_filter_lz4.c b/libarchive/archive_write_add_filter_lz4.c index 6ac450357d28..24061a169521 100644 --- a/libarchive/archive_write_add_filter_lz4.c +++ b/libarchive/archive_write_add_filter_lz4.c @@ -25,8 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_ERRNO_H #include #endif diff --git a/libarchive/archive_write_add_filter_lzop.c b/libarchive/archive_write_add_filter_lzop.c index 3bd9062e4d32..8580e58844af 100644 --- a/libarchive/archive_write_add_filter_lzop.c +++ b/libarchive/archive_write_add_filter_lzop.c @@ -25,7 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); //#undef HAVE_LZO_LZOCONF_H //#undef HAVE_LZO_LZO1X_H diff --git a/libarchive/archive_write_add_filter_none.c b/libarchive/archive_write_add_filter_none.c index 3c06c642e735..b7aa6d4bcd3c 100644 --- a/libarchive/archive_write_add_filter_none.c +++ b/libarchive/archive_write_add_filter_none.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_compression_none.c 201080 2009-12-28 02:03:54Z kientzle $"); #include "archive.h" diff --git a/libarchive/archive_write_add_filter_program.c b/libarchive/archive_write_add_filter_program.c index c096e7227ba4..c661cc7f412f 100644 --- a/libarchive/archive_write_add_filter_program.c +++ b/libarchive/archive_write_add_filter_program.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_compression_program.c 201104 2009-12-28 03:14:30Z kientzle $"); #ifdef HAVE_SYS_WAIT_H # include diff --git a/libarchive/archive_write_add_filter_uuencode.c b/libarchive/archive_write_add_filter_uuencode.c index 1ad458921928..42dec8def1f1 100644 --- a/libarchive/archive_write_add_filter_uuencode.c +++ b/libarchive/archive_write_add_filter_uuencode.c @@ -25,8 +25,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_ERRNO_H #include #endif diff --git a/libarchive/archive_write_add_filter_xz.c b/libarchive/archive_write_add_filter_xz.c index 04bee90efa46..18da08274d92 100644 --- a/libarchive/archive_write_add_filter_xz.c +++ b/libarchive/archive_write_add_filter_xz.c @@ -26,8 +26,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_compression_xz.c 201108 2009-12-28 03:28:21Z kientzle $"); - #ifdef HAVE_ERRNO_H #include #endif diff --git a/libarchive/archive_write_add_filter_zstd.c b/libarchive/archive_write_add_filter_zstd.c index 584cfb668f05..94249accd08b 100644 --- a/libarchive/archive_write_add_filter_zstd.c +++ b/libarchive/archive_write_add_filter_zstd.c @@ -1,5 +1,6 @@ /*- * Copyright (c) 2017 Sean Purcell + * Copyright (c) 2023-2024 Klara, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -25,9 +26,6 @@ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - - #ifdef HAVE_ERRNO_H #include #endif @@ -54,15 +52,18 @@ __FBSDID("$FreeBSD$"); struct private_data { int compression_level; int threads; -#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR + int long_distance; +#if HAVE_ZSTD_H && HAVE_ZSTD_compressStream enum { running, finishing, resetting, } state; int frame_per_file; - size_t min_frame_size; - size_t max_frame_size; + size_t min_frame_in; + size_t max_frame_in; + size_t min_frame_out; + size_t max_frame_out; size_t cur_frame; size_t cur_frame_in; size_t cur_frame_out; @@ -81,8 +82,11 @@ struct private_data { #define CLEVEL_STD_MAX 19 /* without using --ultra */ #define CLEVEL_MAX 22 +#define LONG_STD 27 + #define MINVER_NEGCLEVEL 10304 #define MINVER_MINCLEVEL 10306 +#define MINVER_LONG 10302 static int archive_compressor_zstd_options(struct archive_write_filter *, const char *, const char *); @@ -92,7 +96,7 @@ static int archive_compressor_zstd_write(struct archive_write_filter *, static int archive_compressor_zstd_flush(struct archive_write_filter *); static int archive_compressor_zstd_close(struct archive_write_filter *); static int archive_compressor_zstd_free(struct archive_write_filter *); -#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR +#if HAVE_ZSTD_H && HAVE_ZSTD_compressStream static int drive_compressor(struct archive_write_filter *, struct private_data *, int, const void *, size_t); #endif @@ -125,10 +129,13 @@ archive_write_add_filter_zstd(struct archive *_a) f->name = "zstd"; data->compression_level = CLEVEL_DEFAULT; data->threads = 0; -#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR + data->long_distance = 0; +#if HAVE_ZSTD_H && HAVE_ZSTD_compressStream data->frame_per_file = 0; - data->min_frame_size = 0; - data->max_frame_size = SIZE_MAX; + data->min_frame_in = 0; + data->max_frame_in = SIZE_MAX; + data->min_frame_out = 0; + data->max_frame_out = SIZE_MAX; data->cur_frame_in = 0; data->cur_frame_out = 0; data->cstream = ZSTD_createCStream(); @@ -157,7 +164,7 @@ static int archive_compressor_zstd_free(struct archive_write_filter *f) { struct private_data *data = (struct private_data *)f->data; -#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR +#if HAVE_ZSTD_H && HAVE_ZSTD_compressStream ZSTD_freeCStream(data->cstream); free(data->out.dst); #else @@ -168,7 +175,8 @@ archive_compressor_zstd_free(struct archive_write_filter *f) return (ARCHIVE_OK); } -static int string_to_number(const char *string, intmax_t *numberp) +static int +string_to_number(const char *string, intmax_t *numberp) { char *end; @@ -182,6 +190,41 @@ static int string_to_number(const char *string, intmax_t *numberp) return (ARCHIVE_OK); } +static int +string_to_size(const char *string, size_t *numberp) +{ + uintmax_t number; + char *end; + unsigned int shift = 0; + + if (string == NULL || *string == '\0' || *string == '-') + return (ARCHIVE_WARN); + number = strtoumax(string, &end, 10); + if (end > string) { + if (*end == 'K' || *end == 'k') { + shift = 10; + end++; + } else if (*end == 'M' || *end == 'm') { + shift = 20; + end++; + } else if (*end == 'G' || *end == 'g') { + shift = 30; + end++; + } + if (*end == 'B' || *end == 'b') { + end++; + } + } + if (end == string || *end != '\0' || errno == EOVERFLOW) { + return (ARCHIVE_WARN); + } + if (number > (uintmax_t)SIZE_MAX >> shift) { + return (ARCHIVE_WARN); + } + *numberp = (size_t)(number << shift); + return (ARCHIVE_OK); +} + /* * Set write options. */ @@ -199,7 +242,7 @@ archive_compressor_zstd_options(struct archive_write_filter *f, const char *key, /* If we don't have the library, hard-code the max level */ int minimum = CLEVEL_MIN; int maximum = CLEVEL_MAX; -#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR +#if HAVE_ZSTD_H && HAVE_ZSTD_compressStream maximum = ZSTD_maxCLevel(); #if ZSTD_VERSION_NUMBER >= MINVER_MINCLEVEL if (ZSTD_versionNumber() >= MINVER_MINCLEVEL) { @@ -226,32 +269,59 @@ archive_compressor_zstd_options(struct archive_write_filter *f, const char *key, } data->threads = (int)threads; return (ARCHIVE_OK); -#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR +#if HAVE_ZSTD_H && HAVE_ZSTD_compressStream } else if (strcmp(key, "frame-per-file") == 0) { data->frame_per_file = 1; return (ARCHIVE_OK); - } else if (strcmp(key, "min-frame-size") == 0) { - intmax_t min_frame_size; - if (string_to_number(value, &min_frame_size) != ARCHIVE_OK) { + } else if (strcmp(key, "min-frame-in") == 0) { + if (string_to_size(value, &data->min_frame_in) != ARCHIVE_OK) { return (ARCHIVE_WARN); } - if (min_frame_size < 0) { + return (ARCHIVE_OK); + } else if (strcmp(key, "min-frame-out") == 0 || + strcmp(key, "min-frame-size") == 0) { + if (string_to_size(value, &data->min_frame_out) != ARCHIVE_OK) { return (ARCHIVE_WARN); } - data->min_frame_size = min_frame_size; return (ARCHIVE_OK); - } else if (strcmp(key, "max-frame-size") == 0) { - intmax_t max_frame_size; - if (string_to_number(value, &max_frame_size) != ARCHIVE_OK) { + } else if (strcmp(key, "max-frame-in") == 0 || + strcmp(key, "max-frame-size") == 0) { + if (string_to_size(value, &data->max_frame_in) != ARCHIVE_OK || + data->max_frame_in < 1024) { return (ARCHIVE_WARN); } - if (max_frame_size < 1024) { + return (ARCHIVE_OK); + } else if (strcmp(key, "max-frame-out") == 0) { + if (string_to_size(value, &data->max_frame_out) != ARCHIVE_OK || + data->max_frame_out < 1024) { return (ARCHIVE_WARN); } - data->max_frame_size = max_frame_size; return (ARCHIVE_OK); #endif } + else if (strcmp(key, "long") == 0) { + intmax_t long_distance; + if (string_to_number(value, &long_distance) != ARCHIVE_OK) { + return (ARCHIVE_WARN); + } +#if HAVE_ZSTD_H && HAVE_ZSTD_compressStream && ZSTD_VERSION_NUMBER >= MINVER_LONG + ZSTD_bounds bounds = ZSTD_cParam_getBounds(ZSTD_c_windowLog); + if (ZSTD_isError(bounds.error)) { + int max_distance = ((int)(sizeof(size_t) == 4 ? 30 : 31)); + if (((int)long_distance) < 10 || (int)long_distance > max_distance) + return (ARCHIVE_WARN); + } else { + if ((int)long_distance < bounds.lowerBound || (int)long_distance > bounds.upperBound) + return (ARCHIVE_WARN); + } +#else + int max_distance = ((int)(sizeof(size_t) == 4 ? 30 : 31)); + if (((int)long_distance) < 10 || (int)long_distance > max_distance) + return (ARCHIVE_WARN); +#endif + data->long_distance = (int)long_distance; + return (ARCHIVE_OK); + } /* Note: The "warn" return is just to inform the options * supervisor that we didn't handle it. It will generate @@ -259,7 +329,7 @@ archive_compressor_zstd_options(struct archive_write_filter *f, const char *key, return (ARCHIVE_WARN); } -#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR +#if HAVE_ZSTD_H && HAVE_ZSTD_compressStream /* * Setup callback. */ @@ -301,6 +371,10 @@ archive_compressor_zstd_open(struct archive_write_filter *f) ZSTD_CCtx_setParameter(data->cstream, ZSTD_c_nbWorkers, data->threads); +#if ZSTD_VERSION_NUMBER >= MINVER_LONG + ZSTD_CCtx_setParameter(data->cstream, ZSTD_c_windowLog, data->long_distance); +#endif + return (ARCHIVE_OK); } @@ -324,9 +398,12 @@ archive_compressor_zstd_flush(struct archive_write_filter *f) { struct private_data *data = (struct private_data *)f->data; - if (data->frame_per_file && data->state == running && - data->cur_frame_out > data->min_frame_size) - data->state = finishing; + if (data->frame_per_file && data->state == running) { + if (data->cur_frame_in > data->min_frame_in && + data->cur_frame_out > data->min_frame_out) { + data->state = finishing; + } + } return (drive_compressor(f, data, 1, NULL, 0)); } @@ -385,9 +462,11 @@ drive_compressor(struct archive_write_filter *f, data->total_in += in.pos - ipos; data->cur_frame_in += in.pos - ipos; data->cur_frame_out += data->out.pos - opos; - if (data->state == running && - data->cur_frame_in >= data->max_frame_size) { - data->state = finishing; + if (data->state == running) { + if (data->cur_frame_in >= data->max_frame_in || + data->cur_frame_out >= data->max_frame_out) { + data->state = finishing; + } } if (data->out.pos == data->out.size || (flush && data->out.pos > 0)) { @@ -406,7 +485,7 @@ drive_compressor(struct archive_write_filter *f, return (ARCHIVE_FATAL); } -#else /* HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR */ +#else /* HAVE_ZSTD_H && HAVE_ZSTD_compressStream */ static int archive_compressor_zstd_open(struct archive_write_filter *f) @@ -433,6 +512,10 @@ archive_compressor_zstd_open(struct archive_write_filter *f) archive_string_sprintf(&as, " --threads=%d", data->threads); } + if (data->long_distance != 0) { + archive_string_sprintf(&as, " --long=%d", data->long_distance); + } + f->write = archive_compressor_zstd_write; r = __archive_write_program_open(f, data->pdata, as.s); archive_string_free(&as); @@ -464,4 +547,4 @@ archive_compressor_zstd_close(struct archive_write_filter *f) return __archive_write_program_close(f, data->pdata); } -#endif /* HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR */ +#endif /* HAVE_ZSTD_H && HAVE_ZSTD_compressStream */ diff --git a/libarchive/archive_write_blocksize.3 b/libarchive/archive_write_blocksize.3 index 4973f9990566..3508851cefab 100644 --- a/libarchive/archive_write_blocksize.3 +++ b/libarchive/archive_write_blocksize.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_WRITE_BLOCKSIZE 3 .Os diff --git a/libarchive/archive_write_data.3 b/libarchive/archive_write_data.3 index bc208b45d53a..9f239f7c9ece 100644 --- a/libarchive/archive_write_data.3 +++ b/libarchive/archive_write_data.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 28, 2017 .Dt ARCHIVE_WRITE_DATA 3 .Os diff --git a/libarchive/archive_write_disk.3 b/libarchive/archive_write_disk.3 index 97f3fcde9f88..b046168c338c 100644 --- a/libarchive/archive_write_disk.3 +++ b/libarchive/archive_write_disk.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd January 19, 2020 .Dt ARCHIVE_WRITE_DISK 3 .Os diff --git a/libarchive/archive_write_disk_posix.c b/libarchive/archive_write_disk_posix.c index c8c2e1058c91..58265ee0dc11 100644 --- a/libarchive/archive_write_disk_posix.c +++ b/libarchive/archive_write_disk_posix.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #if !defined(_WIN32) || defined(__CYGWIN__) diff --git a/libarchive/archive_write_disk_private.h b/libarchive/archive_write_disk_private.h index 557d7e2bf34f..3efe2bad336a 100644 --- a/libarchive/archive_write_disk_private.h +++ b/libarchive/archive_write_disk_private.h @@ -22,8 +22,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/archive_write_disk_private.h 201086 2009-12-28 02:17:53Z kientzle $ */ #ifndef ARCHIVE_WRITE_DISK_PRIVATE_H_INCLUDED diff --git a/libarchive/archive_write_disk_set_standard_lookup.c b/libarchive/archive_write_disk_set_standard_lookup.c index 5fccdb9dc658..964169898e45 100644 --- a/libarchive/archive_write_disk_set_standard_lookup.c +++ b/libarchive/archive_write_disk_set_standard_lookup.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_disk_set_standard_lookup.c 201083 2009-12-28 02:09:57Z kientzle $"); #ifdef HAVE_SYS_TYPES_H #include diff --git a/libarchive/archive_write_disk_windows.c b/libarchive/archive_write_disk_windows.c index 7b9ea74937cb..774151ae22b9 100644 --- a/libarchive/archive_write_disk_windows.c +++ b/libarchive/archive_write_disk_windows.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #if defined(_WIN32) && !defined(__CYGWIN__) @@ -2595,7 +2594,7 @@ set_times(struct archive_write_disk *a, { #define EPOC_TIME ARCHIVE_LITERAL_ULL(116444736000000000) #define WINTIME(sec, nsec) ((Int32x32To64(sec, 10000000) + EPOC_TIME)\ - + (((nsec)/1000)*10)) + + ((nsec)/100)) HANDLE hw = 0; ULARGE_INTEGER wintm; diff --git a/libarchive/archive_write_filter.3 b/libarchive/archive_write_filter.3 index c83eb77b6a5e..b39cabe04782 100644 --- a/libarchive/archive_write_filter.3 +++ b/libarchive/archive_write_filter.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd August 14, 2014 .Dt ARCHIVE_WRITE_FILTER 3 .Os diff --git a/libarchive/archive_write_finish_entry.3 b/libarchive/archive_write_finish_entry.3 index 5797e16a6dbc..574d6008581e 100644 --- a/libarchive/archive_write_finish_entry.3 +++ b/libarchive/archive_write_finish_entry.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 28, 2017 .Dt ARCHIVE_WRITE_FINISH_ENTRY 3 .Os diff --git a/libarchive/archive_write_format.3 b/libarchive/archive_write_format.3 index 653089f7795d..9e331368aeef 100644 --- a/libarchive/archive_write_format.3 +++ b/libarchive/archive_write_format.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 14, 2013 .Dt ARCHIVE_WRITE_FORMAT 3 .Os diff --git a/libarchive/archive_write_free.3 b/libarchive/archive_write_free.3 index 5210e2a633de..f6b84eae918f 100644 --- a/libarchive/archive_write_free.3 +++ b/libarchive/archive_write_free.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_WRITE_FREE 3 .Os diff --git a/libarchive/archive_write_header.3 b/libarchive/archive_write_header.3 index 2217b1871bba..9c6ecec4e097 100644 --- a/libarchive/archive_write_header.3 +++ b/libarchive/archive_write_header.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_WRITE_HEADER 3 .Os diff --git a/libarchive/archive_write_new.3 b/libarchive/archive_write_new.3 index 788cbb855985..15a7c40703bf 100644 --- a/libarchive/archive_write_new.3 +++ b/libarchive/archive_write_new.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd February 2, 2012 .Dt ARCHIVE_WRITE_NEW 3 .Os diff --git a/libarchive/archive_write_open.3 b/libarchive/archive_write_open.3 index 6bceb964f582..b12d097028c0 100644 --- a/libarchive/archive_write_open.3 +++ b/libarchive/archive_write_open.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd November 12, 2020 .Dt ARCHIVE_WRITE_OPEN 3 .Os diff --git a/libarchive/archive_write_open_fd.c b/libarchive/archive_write_open_fd.c index b8d491faa273..a58ae047967b 100644 --- a/libarchive/archive_write_open_fd.c +++ b/libarchive/archive_write_open_fd.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_open_fd.c 201093 2009-12-28 02:28:44Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include diff --git a/libarchive/archive_write_open_file.c b/libarchive/archive_write_open_file.c index bf5b55a672e9..d787da3af388 100644 --- a/libarchive/archive_write_open_file.c +++ b/libarchive/archive_write_open_file.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_open_file.c,v 1.19 2007/01/09 08:05:56 kientzle Exp $"); #ifdef HAVE_SYS_STAT_H #include diff --git a/libarchive/archive_write_open_filename.c b/libarchive/archive_write_open_filename.c index 9ceefb19bc9d..7dc73d55f43e 100644 --- a/libarchive/archive_write_open_filename.c +++ b/libarchive/archive_write_open_filename.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_open_filename.c 191165 2009-04-17 00:39:35Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include diff --git a/libarchive/archive_write_open_memory.c b/libarchive/archive_write_open_memory.c index a8a0b817fc25..609cc47d964a 100644 --- a/libarchive/archive_write_open_memory.c +++ b/libarchive/archive_write_open_memory.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_open_memory.c,v 1.3 2007/01/09 08:05:56 kientzle Exp $"); #include #include diff --git a/libarchive/archive_write_private.h b/libarchive/archive_write_private.h index 6522e6521beb..abd5a8ddcd85 100644 --- a/libarchive/archive_write_private.h +++ b/libarchive/archive_write_private.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/archive_write_private.h 201155 2009-12-29 05:20:12Z kientzle $ */ #ifndef ARCHIVE_WRITE_PRIVATE_H_INCLUDED diff --git a/libarchive/archive_write_set_format.c b/libarchive/archive_write_set_format.c index 1f65fa4a77eb..f636cff74714 100644 --- a/libarchive/archive_write_set_format.c +++ b/libarchive/archive_write_set_format.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format.c 201168 2009-12-29 06:15:32Z kientzle $"); #ifdef HAVE_SYS_TYPES_H #include diff --git a/libarchive/archive_write_set_format_7zip.c b/libarchive/archive_write_set_format_7zip.c index 1e40601c4e28..c0ea9d6b1548 100644 --- a/libarchive/archive_write_set_format_7zip.c +++ b/libarchive/archive_write_set_format_7zip.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include @@ -91,6 +90,26 @@ __FBSDID("$FreeBSD$"); #define kAttributes 0x15 #define kEncodedHeader 0x17 +// Check that some windows file attribute constants are defined. +// Reference: https://learn.microsoft.com/en-us/windows/win32/fileio/file-attribute-constants +#ifndef FILE_ATTRIBUTE_READONLY +#define FILE_ATTRIBUTE_READONLY 0x00000001 +#endif + +#ifndef FILE_ATTRIBUTE_DIRECTORY +#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 +#endif + +#ifndef FILE_ATTRIBUTE_ARCHIVE +#define FILE_ATTRIBUTE_ARCHIVE 0x00000020 +#endif + +// This value is defined in 7zip with the comment "trick for Unix". +// +// 7z archives created on unix have this bit set in the high 16 bits of +// the attr field along with the unix permissions. +#define FILE_ATTRIBUTE_UNIX_EXTENSION 0x8000 + enum la_zaction { ARCHIVE_Z_FINISH, ARCHIVE_Z_RUN @@ -1424,14 +1443,19 @@ make_header(struct archive_write *a, uint64_t offset, uint64_t pack_size, * High 16bits is unix mode. * Low 16bits is Windows attributes. */ - uint32_t encattr, attr; + uint32_t encattr, attr = 0; + if (file->dir) - attr = 0x8010; + attr |= FILE_ATTRIBUTE_DIRECTORY; else - attr = 0x8020; + attr |= FILE_ATTRIBUTE_ARCHIVE; + if ((file->mode & 0222) == 0) - attr |= 1;/* Read Only. */ + attr |= FILE_ATTRIBUTE_READONLY; + + attr |= FILE_ATTRIBUTE_UNIX_EXTENSION; attr |= ((uint32_t)file->mode) << 16; + archive_le32enc(&encattr, attr); r = (int)compress_out(a, &encattr, 4, ARCHIVE_Z_RUN); if (r < 0) diff --git a/libarchive/archive_write_set_format_ar.c b/libarchive/archive_write_set_format_ar.c index fc0de1e9f6f0..38689d89be0e 100644 --- a/libarchive/archive_write_set_format_ar.c +++ b/libarchive/archive_write_set_format_ar.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_ar.c 201108 2009-12-28 03:28:21Z kientzle $"); #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_write_set_format_by_name.c b/libarchive/archive_write_set_format_by_name.c index bfb4b3545f2c..09519b123894 100644 --- a/libarchive/archive_write_set_format_by_name.c +++ b/libarchive/archive_write_set_format_by_name.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_by_name.c 201168 2009-12-29 06:15:32Z kientzle $"); #ifdef HAVE_SYS_TYPES_H #include diff --git a/libarchive/archive_write_set_format_cpio_binary.c b/libarchive/archive_write_set_format_cpio_binary.c index d6ce35a7bc1f..7a010ee00f22 100644 --- a/libarchive/archive_write_set_format_cpio_binary.c +++ b/libarchive/archive_write_set_format_cpio_binary.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_cpio.c 201170 2009-12-29 06:34:23Z kientzle $"); #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_write_set_format_cpio_newc.c b/libarchive/archive_write_set_format_cpio_newc.c index f0f39809dad4..006736a1fa22 100644 --- a/libarchive/archive_write_set_format_cpio_newc.c +++ b/libarchive/archive_write_set_format_cpio_newc.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_cpio_newc.c 201160 2009-12-29 05:41:57Z kientzle $"); #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_write_set_format_cpio_odc.c b/libarchive/archive_write_set_format_cpio_odc.c index 091925a2f9f2..426f779a2b0b 100644 --- a/libarchive/archive_write_set_format_cpio_odc.c +++ b/libarchive/archive_write_set_format_cpio_odc.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_cpio.c 201170 2009-12-29 06:34:23Z kientzle $"); #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_write_set_format_filter_by_ext.c b/libarchive/archive_write_set_format_filter_by_ext.c index 9fe21e4542a0..1bb33b04bf91 100644 --- a/libarchive/archive_write_set_format_filter_by_ext.c +++ b/libarchive/archive_write_set_format_filter_by_ext.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_by_name.c 201168 2009-12-29 06:15:32Z kientzle $"); #ifdef HAVE_SYS_TYPES_H #include diff --git a/libarchive/archive_write_set_format_gnutar.c b/libarchive/archive_write_set_format_gnutar.c index ec29c5c418e4..92b06c5f5fb4 100644 --- a/libarchive/archive_write_set_format_gnutar.c +++ b/libarchive/archive_write_set_format_gnutar.c @@ -27,8 +27,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_gnu_tar.c 191579 2009-04-27 18:35:03Z gastal $"); - #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_write_set_format_mtree.c b/libarchive/archive_write_set_format_mtree.c index 619b7714eeba..6db9d27848af 100644 --- a/libarchive/archive_write_set_format_mtree.c +++ b/libarchive/archive_write_set_format_mtree.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_mtree.c 201171 2009-12-29 06:39:07Z kientzle $"); #ifdef HAVE_SYS_TYPES_H #include diff --git a/libarchive/archive_write_set_format_pax.c b/libarchive/archive_write_set_format_pax.c index 1eb9a9a4b634..e93333074a6a 100644 --- a/libarchive/archive_write_set_format_pax.c +++ b/libarchive/archive_write_set_format_pax.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_pax.c 201162 2009-12-29 05:47:46Z kientzle $"); #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_write_set_format_private.h b/libarchive/archive_write_set_format_private.h index e20022755f8b..ef9dee9d808c 100644 --- a/libarchive/archive_write_set_format_private.h +++ b/libarchive/archive_write_set_format_private.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #ifndef ARCHIVE_WRITE_SET_FORMAT_PRIVATE_H_INCLUDED diff --git a/libarchive/archive_write_set_format_shar.c b/libarchive/archive_write_set_format_shar.c index 9e4931c95c1f..52ea6adc2264 100644 --- a/libarchive/archive_write_set_format_shar.c +++ b/libarchive/archive_write_set_format_shar.c @@ -25,7 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_shar.c 189438 2009-03-06 05:58:56Z kientzle $"); #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_write_set_format_ustar.c b/libarchive/archive_write_set_format_ustar.c index d1a06bc4f7ec..673487b27fe3 100644 --- a/libarchive/archive_write_set_format_ustar.c +++ b/libarchive/archive_write_set_format_ustar.c @@ -25,8 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_ustar.c 191579 2009-04-27 18:35:03Z kientzle $"); - #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_write_set_format_v7tar.c b/libarchive/archive_write_set_format_v7tar.c index 599407144121..e3724a096da7 100644 --- a/libarchive/archive_write_set_format_v7tar.c +++ b/libarchive/archive_write_set_format_v7tar.c @@ -25,8 +25,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_write_set_format_warc.c b/libarchive/archive_write_set_format_warc.c index 0ef003e2fc94..3d22e1f4ba57 100644 --- a/libarchive/archive_write_set_format_warc.c +++ b/libarchive/archive_write_set_format_warc.c @@ -26,7 +26,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_write_set_format_xar.c b/libarchive/archive_write_set_format_xar.c index 7307757d37a1..2cf655da186a 100644 --- a/libarchive/archive_write_set_format_xar.c +++ b/libarchive/archive_write_set_format_xar.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/archive_write_set_format_zip.c b/libarchive/archive_write_set_format_zip.c index 6821049c945a..e37e7b5edda1 100644 --- a/libarchive/archive_write_set_format_zip.c +++ b/libarchive/archive_write_set_format_zip.c @@ -30,7 +30,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_set_format_zip.c 201168 2009-12-29 06:15:32Z kientzle $"); #ifdef HAVE_ERRNO_H #include @@ -132,7 +131,6 @@ struct zip { enum compression entry_compression; enum encryption entry_encryption; int entry_flags; - int entry_uses_zip64; int experiments; struct trad_enc_ctx tctx; char tctx_valid; @@ -523,6 +521,7 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) int ret, ret2 = ARCHIVE_OK; mode_t type; int version_needed = 10; +#define MIN_VERSION_NEEDED(x) do { if (version_needed < x) { version_needed = x; } } while (0) /* Ignore types of entries that we don't support. */ type = archive_entry_filetype(entry); @@ -557,12 +556,12 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) /* Reset information from last entry. */ zip->entry_offset = zip->written_bytes; zip->entry_uncompressed_limit = INT64_MAX; + /* Zero size values implies that we're using a trailing data descriptor */ zip->entry_compressed_size = 0; zip->entry_uncompressed_size = 0; zip->entry_compressed_written = 0; zip->entry_uncompressed_written = 0; zip->entry_flags = 0; - zip->entry_uses_zip64 = 0; zip->entry_crc32 = zip->crc32func(0, NULL, 0); zip->entry_encryption = 0; archive_entry_free(zip->entry); @@ -672,11 +671,11 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) zip->entry_crc32 = zip->crc32func(zip->entry_crc32, (const unsigned char *)slink, slink_size); zip->entry_compression = COMPRESSION_STORE; - version_needed = 20; + MIN_VERSION_NEEDED(20); } else if (type != AE_IFREG) { zip->entry_compression = COMPRESSION_STORE; zip->entry_uncompressed_limit = 0; - version_needed = 20; + MIN_VERSION_NEEDED(20); } else if (archive_entry_size_is_set(zip->entry)) { int64_t size = archive_entry_size(zip->entry); int64_t additional_size = 0; @@ -689,27 +688,27 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) if (zip->entry_compression == COMPRESSION_STORE) { zip->entry_compressed_size = size; zip->entry_uncompressed_size = size; - version_needed = 10; + MIN_VERSION_NEEDED(10); } else { zip->entry_uncompressed_size = size; - version_needed = 20; + MIN_VERSION_NEEDED(20); } if (zip->entry_flags & ZIP_ENTRY_FLAG_ENCRYPTED) { switch (zip->entry_encryption) { case ENCRYPTION_TRADITIONAL: additional_size = TRAD_HEADER_SIZE; - version_needed = 20; + MIN_VERSION_NEEDED(20); break; case ENCRYPTION_WINZIP_AES128: additional_size = WINZIP_AES128_HEADER_SIZE + AUTH_CODE_SIZE; - version_needed = 20; + MIN_VERSION_NEEDED(20); break; case ENCRYPTION_WINZIP_AES256: additional_size = WINZIP_AES256_HEADER_SIZE + AUTH_CODE_SIZE; - version_needed = 20; + MIN_VERSION_NEEDED(20); break; case ENCRYPTION_NONE: default: @@ -733,8 +732,7 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) || (zip->entry_uncompressed_size + additional_size > ZIP_4GB_MAX) || (zip->entry_uncompressed_size > ZIP_4GB_MAX_UNCOMPRESSED && zip->entry_compression != COMPRESSION_STORE)) { - zip->entry_uses_zip64 = 1; - version_needed = 45; + MIN_VERSION_NEEDED(45); } /* We may know the size, but never the CRC. */ @@ -742,7 +740,6 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) } else { /* We don't know the size. Use the default * compression unless specified otherwise. - * We enable Zip64 extensions unless we're told not to. */ zip->entry_compression = zip->requested_compression; @@ -752,12 +749,12 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) zip->entry_flags |= ZIP_ENTRY_FLAG_LENGTH_AT_END; if ((zip->flags & ZIP_FLAG_AVOID_ZIP64) == 0) { - zip->entry_uses_zip64 = 1; - version_needed = 45; + /* We might use zip64 extensions, so require 4.5 */ + MIN_VERSION_NEEDED(45); } else if (zip->entry_compression == COMPRESSION_STORE) { - version_needed = 10; + MIN_VERSION_NEEDED(10); } else { - version_needed = 20; + MIN_VERSION_NEEDED(20); } if (zip->entry_flags & ZIP_ENTRY_FLAG_ENCRYPTED) { @@ -765,8 +762,7 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) case ENCRYPTION_TRADITIONAL: case ENCRYPTION_WINZIP_AES128: case ENCRYPTION_WINZIP_AES256: - if (version_needed < 20) - version_needed = 20; + MIN_VERSION_NEEDED(20); break; case ENCRYPTION_NONE: default: @@ -787,16 +783,8 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) archive_le16enc(local_header + 8, zip->entry_compression); archive_le32enc(local_header + 10, dos_time(archive_entry_mtime(zip->entry))); - archive_le32enc(local_header + 14, zip->entry_crc32); - if (zip->entry_uses_zip64) { - /* Zip64 data in the local header "must" include both - * compressed and uncompressed sizes AND those fields - * are included only if these are 0xffffffff; - * THEREFORE these must be set this way, even if we - * know one of them is smaller. */ - archive_le32enc(local_header + 18, ZIP_4GB_MAX); - archive_le32enc(local_header + 22, ZIP_4GB_MAX); - } else { + if ((zip->entry_flags & ZIP_ENTRY_FLAG_LENGTH_AT_END) == 0) { + archive_le32enc(local_header + 14, zip->entry_crc32); archive_le32enc(local_header + 18, (uint32_t)zip->entry_compressed_size); archive_le32enc(local_header + 22, (uint32_t)zip->entry_uncompressed_size); } @@ -842,42 +830,19 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) * the local file header and the central directory. * We format them once and then duplicate them. */ - /* UT timestamp, length depends on what timestamps are set. */ - memcpy(e, "UT", 2); - archive_le16enc(e + 2, - 1 - + (archive_entry_mtime_is_set(entry) ? 4 : 0) - + (archive_entry_atime_is_set(entry) ? 4 : 0) - + (archive_entry_ctime_is_set(entry) ? 4 : 0)); - e += 4; - *e++ = - (archive_entry_mtime_is_set(entry) ? 1 : 0) - | (archive_entry_atime_is_set(entry) ? 2 : 0) - | (archive_entry_ctime_is_set(entry) ? 4 : 0); - if (archive_entry_mtime_is_set(entry)) { - archive_le32enc(e, (uint32_t)archive_entry_mtime(entry)); - e += 4; - } - if (archive_entry_atime_is_set(entry)) { - archive_le32enc(e, (uint32_t)archive_entry_atime(entry)); + /* ux Unix extra data, length 11, version 1 */ + if (archive_entry_uid_is_set(entry) || archive_entry_gid_is_set(entry)) { + /* TODO: If uid < 64k, use 2 bytes, ditto for gid. */ + memcpy(e, "ux\013\000\001", 5); + e += 5; + *e++ = 4; /* Length of following UID */ + archive_le32enc(e, (uint32_t)archive_entry_uid(entry)); e += 4; - } - if (archive_entry_ctime_is_set(entry)) { - archive_le32enc(e, (uint32_t)archive_entry_ctime(entry)); + *e++ = 4; /* Length of following GID */ + archive_le32enc(e, (uint32_t)archive_entry_gid(entry)); e += 4; } - /* ux Unix extra data, length 11, version 1 */ - /* TODO: If uid < 64k, use 2 bytes, ditto for gid. */ - memcpy(e, "ux\013\000\001", 5); - e += 5; - *e++ = 4; /* Length of following UID */ - archive_le32enc(e, (uint32_t)archive_entry_uid(entry)); - e += 4; - *e++ = 4; /* Length of following GID */ - archive_le32enc(e, (uint32_t)archive_entry_gid(entry)); - e += 4; - /* AES extra data field: WinZIP AES information, ID=0x9901 */ if ((zip->entry_flags & ZIP_ENTRY_FLAG_ENCRYPTED) && (zip->entry_encryption == ENCRYPTION_WINZIP_AES128 @@ -904,7 +869,7 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) e += 2; } - /* Copy UT ,ux, and AES-extra into central directory as well. */ + /* Copy ux, AES-extra into central directory as well. */ zip->file_header_extra_offset = zip->central_directory_bytes; cd_extra = cd_alloc(zip, e - local_extra); memcpy(cd_extra, local_extra, e - local_extra); @@ -916,17 +881,50 @@ archive_write_zip_header(struct archive_write *a, struct archive_entry *entry) * archive_write_zip_finish_entry() below. */ - /* "[Zip64 entry] in the local header MUST include BOTH - * original [uncompressed] and compressed size fields." */ - if (zip->entry_uses_zip64) { - unsigned char *zip64_start = e; - memcpy(e, "\001\000\020\000", 4); + /* UT timestamp: length depends on what timestamps are set. + * This header appears in the Central Directory also, but + * according to Info-Zip specification, the CD form + * only holds mtime, so we format it separately. */ + if (archive_entry_mtime_is_set(entry) + || archive_entry_atime_is_set(entry) + || archive_entry_ctime_is_set(entry)) { + unsigned char *ut = e; + memcpy(e, "UT\000\000", 4); + e += 4; + *e++ = (archive_entry_mtime_is_set(entry) ? 1 : 0) + | (archive_entry_atime_is_set(entry) ? 2 : 0) + | (archive_entry_ctime_is_set(entry) ? 4 : 0); + if (archive_entry_mtime_is_set(entry)) { + archive_le32enc(e, (uint32_t)archive_entry_mtime(entry)); + e += 4; + } + if (archive_entry_atime_is_set(entry)) { + archive_le32enc(e, (uint32_t)archive_entry_atime(entry)); + e += 4; + } + if (archive_entry_ctime_is_set(entry)) { + archive_le32enc(e, (uint32_t)archive_entry_ctime(entry)); + e += 4; + } + archive_le16enc(ut + 2, e - ut - 4); + } + + /* + * Note about Zip64 Extended Information Extra Field: + * Because libarchive always writes in a streaming + * fashion, we never know the CRC when we're writing + * the local header. So we have to use length-at-end, which + * prevents us from putting size information into a Zip64 + * extra field. However, apparently some readers find it + * a helpful clue to have an empty such field so they + * can expect a 64-bit length-at-end marker. + */ + if (archive_entry_size_is_set(zip->entry) + && (zip->entry_uncompressed_size > ZIP_4GB_MAX + || zip->entry_compressed_size > ZIP_4GB_MAX)) { + /* Header ID 0x0001, size 0 */ + memcpy(e, "\001\000\000\000", 4); e += 4; - archive_le64enc(e, zip->entry_uncompressed_size); - e += 8; - archive_le64enc(e, zip->entry_compressed_size); - e += 8; - archive_le16enc(zip64_start + 2, (uint16_t)(e - (zip64_start + 4))); } if (zip->flags & ZIP_FLAG_EXPERIMENT_xl) { @@ -1205,7 +1203,9 @@ archive_write_zip_finish_entry(struct archive_write *a) archive_le32enc(d + 4, 0);/* no CRC.*/ else archive_le32enc(d + 4, zip->entry_crc32); - if (zip->entry_uses_zip64) { + if (zip->entry_compressed_written > ZIP_4GB_MAX + || zip->entry_uncompressed_written > ZIP_4GB_MAX + || zip->flags & ZIP_FLAG_FORCE_ZIP64) { archive_le64enc(d + 8, (uint64_t)zip->entry_compressed_written); archive_le64enc(d + 16, @@ -1224,23 +1224,60 @@ archive_write_zip_finish_entry(struct archive_write *a) return (ARCHIVE_FATAL); } - /* Append Zip64 extra data to central directory information. */ - if (zip->entry_compressed_written > ZIP_4GB_MAX - || zip->entry_uncompressed_written > ZIP_4GB_MAX + /* UT timestamp: Info-Zip specifies that _only_ the mtime should + * be recorded here; ctime and atime are also included in the + * local file descriptor. */ + if (archive_entry_mtime_is_set(zip->entry)) { + unsigned char ut[9]; + unsigned char *u = ut, *ud; + memcpy(u, "UT\005\000\001", 5); + u += 5; + archive_le32enc(u, (uint32_t)archive_entry_mtime(zip->entry)); + u += 4; + ud = cd_alloc(zip, u - ut); + if (ud == NULL) { + archive_set_error(&a->archive, ENOMEM, + "Can't allocate zip data"); + return (ARCHIVE_FATAL); + } + memcpy(ud, ut, u - ut); + } + + /* Fill in size information in the central directory entry. */ + /* Fix up central directory file header. */ + if (zip->cctx_valid && zip->aes_vendor == AES_VENDOR_AE_2) + archive_le32enc(zip->file_header + 16, 0);/* no CRC.*/ + else + archive_le32enc(zip->file_header + 16, zip->entry_crc32); + /* Truncate to 32 bits; we'll fix up below. */ + archive_le32enc(zip->file_header + 20, (uint32_t)zip->entry_compressed_written); + archive_le32enc(zip->file_header + 24, (uint32_t)zip->entry_uncompressed_written); + archive_le16enc(zip->file_header + 30, + (uint16_t)(zip->central_directory_bytes - zip->file_header_extra_offset)); + archive_le32enc(zip->file_header + 42, (uint32_t)zip->entry_offset); + + /* If any of the values immediately above are too large, we'll + * need to put the corresponding value in a Zip64 extra field + * and set the central directory value to 0xffffffff as a flag. */ + if (zip->entry_compressed_written >= ZIP_4GB_MAX + || zip->entry_uncompressed_written >= ZIP_4GB_MAX || zip->entry_offset > ZIP_4GB_MAX) { unsigned char zip64[32]; unsigned char *z = zip64, *zd; memcpy(z, "\001\000\000\000", 4); z += 4; if (zip->entry_uncompressed_written >= ZIP_4GB_MAX) { + archive_le32enc(zip->file_header + 24, ZIP_4GB_MAX); archive_le64enc(z, zip->entry_uncompressed_written); z += 8; } if (zip->entry_compressed_written >= ZIP_4GB_MAX) { + archive_le32enc(zip->file_header + 20, ZIP_4GB_MAX); archive_le64enc(z, zip->entry_compressed_written); z += 8; } if (zip->entry_offset >= ZIP_4GB_MAX) { + archive_le32enc(zip->file_header + 42, ZIP_4GB_MAX); archive_le64enc(z, zip->entry_offset); z += 8; } diff --git a/libarchive/archive_write_set_options.3 b/libarchive/archive_write_set_options.3 index dd573588d573..454c79671b93 100644 --- a/libarchive/archive_write_set_options.3 +++ b/libarchive/archive_write_set_options.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd January 31, 2020 .Dt ARCHIVE_WRITE_OPTIONS 3 .Os @@ -257,12 +255,22 @@ If supported, the default value is read from The value is interpreted as a decimal integer specifying the compression level. Supported values depend on the library version, common values are from 1 to 22. +.It Cm long +Enables long distance matching. The value is interpreted as a +decimal integer specifying log2 window size in bytes. Values from +10 to 30 for 32 bit, or 31 for 64 bit, are supported. +.It Cm threads +The value is interpreted as a decimal integer specifying the +number of threads for multi-threaded zstd compression. +If set to 0, zstd will attempt to detect and use the number +of physical CPU cores. .El .It Format 7zip .Bl -tag -compact -width indent .It Cm compression The value is one of .Dq store , +.Dq copy , .Dq deflate , .Dq bzip2 , .Dq lzma1 , @@ -270,12 +278,18 @@ The value is one of or .Dq ppmd to indicate how the following entries should be compressed. +The values +.Dq store +and +.Dq copy +are synonyms. Note that this setting is ignored for directories, symbolic links, and other special entries. .It Cm compression-level The value is interpreted as a decimal integer specifying the compression level. -Values between 0 and 9 are supported. +Values between 0 and 9 are supported, with the exception of bzip2 +which only supports values between 1 and 9. The interpretation of the compression level depends on the chosen compression method. .El diff --git a/libarchive/archive_write_set_options.c b/libarchive/archive_write_set_options.c index 962309ada5ce..be2a6063188b 100644 --- a/libarchive/archive_write_set_options.c +++ b/libarchive/archive_write_set_options.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #include "archive_write_private.h" #include "archive_options_private.h" diff --git a/libarchive/archive_write_set_passphrase.3 b/libarchive/archive_write_set_passphrase.3 index 2db77034c76e..629e059b2372 100644 --- a/libarchive/archive_write_set_passphrase.3 +++ b/libarchive/archive_write_set_passphrase.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd September 21, 2014 .Dt ARCHIVE_WRITE_SET_PASSPHRASE 3 .Os diff --git a/libarchive/archive_write_set_passphrase.c b/libarchive/archive_write_set_passphrase.c index 710ecba52c3d..977fc4a9ee6b 100644 --- a/libarchive/archive_write_set_passphrase.c +++ b/libarchive/archive_write_set_passphrase.c @@ -24,7 +24,6 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include diff --git a/libarchive/config_freebsd.h b/libarchive/config_freebsd.h index 669f272463a1..d0f3e2300c9d 100644 --- a/libarchive/config_freebsd.h +++ b/libarchive/config_freebsd.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #define __LIBARCHIVE_CONFIG_H_INCLUDED 1 diff --git a/libarchive/cpio.5 b/libarchive/cpio.5 index c71018b1996e..21c30d78d3c5 100644 --- a/libarchive/cpio.5 +++ b/libarchive/cpio.5 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd December 23, 2011 .Dt CPIO 5 .Os diff --git a/libarchive/filter_fork.h b/libarchive/filter_fork.h index 2bf290c4d9e4..aeab70ae634a 100644 --- a/libarchive/filter_fork.h +++ b/libarchive/filter_fork.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: head/lib/libarchive/filter_fork.h 201087 2009-12-28 02:18:26Z kientzle $ */ #ifndef FILTER_FORK_H diff --git a/libarchive/filter_fork_posix.c b/libarchive/filter_fork_posix.c index 62085a7099b7..c895c08e59b3 100644 --- a/libarchive/filter_fork_posix.c +++ b/libarchive/filter_fork_posix.c @@ -30,8 +30,6 @@ #if defined(HAVE_PIPE) && defined(HAVE_FCNTL) && \ (defined(HAVE_FORK) || defined(HAVE_VFORK) || defined(HAVE_POSIX_SPAWNP)) -__FBSDID("$FreeBSD: head/lib/libarchive/filter_fork.c 182958 2008-09-12 05:33:00Z kientzle $"); - #if defined(HAVE_SYS_TYPES_H) # include #endif diff --git a/libarchive/libarchive-formats.5 b/libarchive/libarchive-formats.5 index 5a118ff5d240..fab2f8660270 100644 --- a/libarchive/libarchive-formats.5 +++ b/libarchive/libarchive-formats.5 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd December 27, 2016 .Dt LIBARCHIVE-FORMATS 5 .Os diff --git a/libarchive/libarchive.3 b/libarchive/libarchive.3 index 649056242285..c67172bf654f 100644 --- a/libarchive/libarchive.3 +++ b/libarchive/libarchive.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd March 18, 2012 .Dt LIBARCHIVE 3 .Os diff --git a/libarchive/libarchive_changes.3 b/libarchive/libarchive_changes.3 index 6bf8db038c73..fd0e721053ca 100644 --- a/libarchive/libarchive_changes.3 +++ b/libarchive/libarchive_changes.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd December 23, 2011 .Dt LIBARCHIVE_CHANGES 3 .Os diff --git a/libarchive/libarchive_internals.3 b/libarchive/libarchive_internals.3 index d672f3e8a64d..d4696f648292 100644 --- a/libarchive/libarchive_internals.3 +++ b/libarchive/libarchive_internals.3 @@ -22,8 +22,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd January 26, 2011 .Dt LIBARCHIVE_INTERNALS 3 .Os diff --git a/libarchive/mtree.5 b/libarchive/mtree.5 index 8147796f3100..5ea53613166f 100644 --- a/libarchive/mtree.5 +++ b/libarchive/mtree.5 @@ -26,7 +26,6 @@ .\" SUCH DAMAGE. .\" .\" From: @(#)mtree.8 8.2 (Berkeley) 12/11/93 -.\" $FreeBSD$ .\" .Dd September 4, 2013 .Dt MTREE 5 diff --git a/libarchive/tar.5 b/libarchive/tar.5 index 34ad4f79315e..725a7d68374a 100644 --- a/libarchive/tar.5 +++ b/libarchive/tar.5 @@ -23,8 +23,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd December 27, 2016 .Dt TAR 5 .Os diff --git a/libarchive/test/CMakeLists.txt b/libarchive/test/CMakeLists.txt index bbbff2231afe..8209c25a5f8d 100644 --- a/libarchive/test/CMakeLists.txt +++ b/libarchive/test/CMakeLists.txt @@ -98,6 +98,7 @@ IF(ENABLE_TEST) test_read_filter_program.c test_read_filter_program_signature.c test_read_filter_uudecode.c + test_read_filter_uudecode_raw.c test_read_format_7zip.c test_read_format_7zip_encryption_data.c test_read_format_7zip_encryption_header.c @@ -276,6 +277,7 @@ IF(ENABLE_TEST) test_write_format_xar.c test_write_format_xar_empty.c test_write_format_zip.c + test_write_format_zip64_stream.c test_write_format_zip_compression_store.c test_write_format_zip_empty.c test_write_format_zip_empty_zip64.c @@ -283,6 +285,7 @@ IF(ENABLE_TEST) test_write_format_zip_file.c test_write_format_zip_file_zip64.c test_write_format_zip_large.c + test_write_format_zip_stream.c test_write_format_zip_zip64.c test_write_open_memory.c test_write_read_format_zip.c diff --git a/libarchive/test/README b/libarchive/test/README index 1b70c7adba73..facf62030c9c 100644 --- a/libarchive/test/README +++ b/libarchive/test/README @@ -1,5 +1,3 @@ -$FreeBSD: src/lib/libarchive/test/README,v 1.3 2008/01/01 22:28:04 kientzle Exp $ - This is the test harness for libarchive. It compiles into a single program "libarchive_test" that is intended diff --git a/libarchive/test/read_open_memory.c b/libarchive/test/read_open_memory.c index daa3c3a1f02a..6d2468cd10a6 100644 --- a/libarchive/test/read_open_memory.c +++ b/libarchive/test/read_open_memory.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/read_open_memory.c 191183 2009-04-17 01:06:31Z kientzle $"); #include #include diff --git a/libarchive/test/test_acl_nfs4.c b/libarchive/test/test_acl_nfs4.c index fdc0191516e1..98d39689df69 100644 --- a/libarchive/test/test_acl_nfs4.c +++ b/libarchive/test/test_acl_nfs4.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Exercise the system-independent portion of the ACL support. diff --git a/libarchive/test/test_acl_pax.c b/libarchive/test/test_acl_pax.c index 8566f55a51a4..659073170fad 100644 --- a/libarchive/test/test_acl_pax.c +++ b/libarchive/test/test_acl_pax.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Exercise the system-independent portion of the ACL support. diff --git a/libarchive/test/test_acl_platform_nfs4.c b/libarchive/test/test_acl_platform_nfs4.c index 6a5b4394f8bc..18f047b149e6 100644 --- a/libarchive/test/test_acl_platform_nfs4.c +++ b/libarchive/test/test_acl_platform_nfs4.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #if ARCHIVE_ACL_NFS4 #if HAVE_SYS_ACL_H diff --git a/libarchive/test/test_acl_platform_posix1e.c b/libarchive/test/test_acl_platform_posix1e.c index c34f7c2e299d..f23eec0d336a 100644 --- a/libarchive/test/test_acl_platform_posix1e.c +++ b/libarchive/test/test_acl_platform_posix1e.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_acl_freebsd.c 189427 2009-03-06 04:21:23Z kientzle $"); #if ARCHIVE_ACL_POSIX1E #include diff --git a/libarchive/test/test_acl_posix1e.c b/libarchive/test/test_acl_posix1e.c index fa2628dbe794..3f9c9850f495 100644 --- a/libarchive/test/test_acl_posix1e.c +++ b/libarchive/test/test_acl_posix1e.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_acl_basic.c,v 1.6 2008/10/19 00:13:57 kientzle Exp $"); /* * Exercise the system-independent portion of the ACL support. diff --git a/libarchive/test/test_acl_text.c b/libarchive/test/test_acl_text.c index 80728932cb54..f0931adc8adc 100644 --- a/libarchive/test/test_acl_text.c +++ b/libarchive/test/test_acl_text.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Test converting ACLs to text, both wide and non-wide diff --git a/libarchive/test/test_archive_api_feature.c b/libarchive/test/test_archive_api_feature.c index d7d1a2d5fbfb..597d0ed40245 100644 --- a/libarchive/test/test_archive_api_feature.c +++ b/libarchive/test/test_archive_api_feature.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_archive_api_feature.c,v 1.5 2008/05/26 17:00:24 kientzle Exp $"); DEFINE_TEST(test_archive_api_feature) { diff --git a/libarchive/test/test_archive_clear_error.c b/libarchive/test/test_archive_clear_error.c index 66dbe93ec9e8..8b7609e07f2b 100644 --- a/libarchive/test/test_archive_clear_error.c +++ b/libarchive/test/test_archive_clear_error.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_archive_clear_error) { diff --git a/libarchive/test/test_archive_cmdline.c b/libarchive/test/test_archive_cmdline.c index a8236105af0b..e72acb4e9d37 100644 --- a/libarchive/test/test_archive_cmdline.c +++ b/libarchive/test/test_archive_cmdline.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define __LIBARCHIVE_TEST #include "archive_cmdline_private.h" diff --git a/libarchive/test/test_archive_getdate.c b/libarchive/test/test_archive_getdate.c index 9e91b83ba81d..e5b8bf7fa8f8 100644 --- a/libarchive/test/test_archive_getdate.c +++ b/libarchive/test/test_archive_getdate.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #include diff --git a/libarchive/test/test_archive_match_owner.c b/libarchive/test/test_archive_match_owner.c index 6bf9c6f08cfd..dc31c525941c 100644 --- a/libarchive/test/test_archive_match_owner.c +++ b/libarchive/test/test_archive_match_owner.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); static void test_uid(void) diff --git a/libarchive/test/test_archive_match_path.c b/libarchive/test/test_archive_match_path.c index 5e9b9a8cbf63..ce48263f7614 100644 --- a/libarchive/test/test_archive_match_path.c +++ b/libarchive/test/test_archive_match_path.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); static void test_exclusion_mbs(void) diff --git a/libarchive/test/test_archive_match_time.c b/libarchive/test/test_archive_match_time.c index 23754a1538b1..25a0623a7e5a 100644 --- a/libarchive/test/test_archive_match_time.c +++ b/libarchive/test/test_archive_match_time.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define __LIBARCHIVE_BUILD 1 #include "archive_getdate.h" diff --git a/libarchive/test/test_archive_pathmatch.c b/libarchive/test/test_archive_pathmatch.c index 0116df0288d2..3696d38fcf19 100644 --- a/libarchive/test/test_archive_pathmatch.c +++ b/libarchive/test/test_archive_pathmatch.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #define __LIBARCHIVE_TEST #include "archive_pathmatch.h" diff --git a/libarchive/test/test_archive_read_add_passphrase.c b/libarchive/test/test_archive_read_add_passphrase.c index 0ce5a76aedbc..c9b051101433 100644 --- a/libarchive/test/test_archive_read_add_passphrase.c +++ b/libarchive/test/test_archive_read_add_passphrase.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); struct archive_read; extern void __archive_read_reset_passphrase(struct archive_read *); diff --git a/libarchive/test/test_archive_read_close_twice.c b/libarchive/test/test_archive_read_close_twice.c index 16cc805fe027..2f5ee77f117e 100644 --- a/libarchive/test/test_archive_read_close_twice.c +++ b/libarchive/test/test_archive_read_close_twice.c @@ -24,8 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); - DEFINE_TEST(test_archive_read_close_twice) { diff --git a/libarchive/test/test_archive_read_close_twice_open_fd.c b/libarchive/test/test_archive_read_close_twice_open_fd.c index 3aba31791357..62a6a90df1fa 100644 --- a/libarchive/test/test_archive_read_close_twice_open_fd.c +++ b/libarchive/test/test_archive_read_close_twice_open_fd.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_archive_read_close_twice_open_fd) { diff --git a/libarchive/test/test_archive_read_close_twice_open_filename.c b/libarchive/test/test_archive_read_close_twice_open_filename.c index 9a194fdc4a8b..4824319b42bf 100644 --- a/libarchive/test/test_archive_read_close_twice_open_filename.c +++ b/libarchive/test/test_archive_read_close_twice_open_filename.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_archive_read_close_twice_open_filename) { diff --git a/libarchive/test/test_archive_read_multiple_data_objects.c b/libarchive/test/test_archive_read_multiple_data_objects.c index 9962cf7fdf33..f5adb5b7b567 100644 --- a/libarchive/test/test_archive_read_multiple_data_objects.c +++ b/libarchive/test/test_archive_read_multiple_data_objects.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #if defined(_WIN32) && !defined(__CYGWIN__) #define open _open @@ -185,7 +184,7 @@ file_open(struct archive *a, void *data) mydata->fd = open(mydata->filename, O_RDONLY | O_BINARY); if (mydata->fd >= 0) { - if ((mydata->buffer = (void*)calloc(1, BLOCK_SIZE)) == NULL) + if ((mydata->buffer = (void*)calloc(BLOCK_SIZE, 1)) == NULL) return (ARCHIVE_FAILED); } } @@ -287,7 +286,7 @@ test_customized_multiple_data_objects(void) return; } assert((mydata->filename = - (char *)calloc(1, strlen(filename) + 1)) != NULL); + (char *)calloc(strlen(filename) + 1, sizeof(char))) != NULL); if (mydata->filename == NULL) { free(mydata); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); diff --git a/libarchive/test/test_archive_read_next_header_empty.c b/libarchive/test/test_archive_read_next_header_empty.c index f43cbd934288..ee00291b51cd 100644 --- a/libarchive/test/test_archive_read_next_header_empty.c +++ b/libarchive/test/test_archive_read_next_header_empty.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); static void test_empty_file1(void) diff --git a/libarchive/test/test_archive_read_next_header_raw.c b/libarchive/test/test_archive_read_next_header_raw.c index 1c8af20f8c3e..c3fbb8c21ac4 100644 --- a/libarchive/test/test_archive_read_next_header_raw.c +++ b/libarchive/test/test_archive_read_next_header_raw.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define DATA "random garbage for testing purposes" diff --git a/libarchive/test/test_archive_read_open2.c b/libarchive/test/test_archive_read_open2.c index 0a801ac5d26d..6ba27cc4a134 100644 --- a/libarchive/test/test_archive_read_open2.c +++ b/libarchive/test/test_archive_read_open2.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static int open_cb(struct archive *a, void *client) diff --git a/libarchive/test/test_archive_read_set_filter_option.c b/libarchive/test/test_archive_read_set_filter_option.c index 31d575fc737e..68494abbc1e9 100644 --- a/libarchive/test/test_archive_read_set_filter_option.c +++ b/libarchive/test/test_archive_read_set_filter_option.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define should(__a, __code, __m, __o, __v) \ assertEqualInt(__code, archive_read_set_filter_option(__a, __m, __o, __v)) diff --git a/libarchive/test/test_archive_read_set_format_option.c b/libarchive/test/test_archive_read_set_format_option.c index 2d7acf3a0aa4..e32d8112445c 100644 --- a/libarchive/test/test_archive_read_set_format_option.c +++ b/libarchive/test/test_archive_read_set_format_option.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define should(__a, __code, __m, __o, __v) \ assertEqualInt(__code, archive_read_set_format_option(__a, __m, __o, __v)) diff --git a/libarchive/test/test_archive_read_set_option.c b/libarchive/test/test_archive_read_set_option.c index 0b816b7cd838..195c1eaa3e13 100644 --- a/libarchive/test/test_archive_read_set_option.c +++ b/libarchive/test/test_archive_read_set_option.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define should(__a, __code, __m, __o, __v) \ assertEqualInt(__code, archive_read_set_option(__a, __m, __o, __v)) diff --git a/libarchive/test/test_archive_read_set_options.c b/libarchive/test/test_archive_read_set_options.c index a8c68d7dd4cf..2f1f344eaad3 100644 --- a/libarchive/test/test_archive_read_set_options.c +++ b/libarchive/test/test_archive_read_set_options.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define should(__a, __code, __opts) \ assertEqualInt(__code, archive_read_set_options(__a, __opts)) diff --git a/libarchive/test/test_archive_read_support.c b/libarchive/test/test_archive_read_support.c index c6eb9346c627..b0c928023e8c 100644 --- a/libarchive/test/test_archive_read_support.c +++ b/libarchive/test/test_archive_read_support.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Verify that the various archive_read_support_* functions diff --git a/libarchive/test/test_archive_set_error.c b/libarchive/test/test_archive_set_error.c index b83c08c884e9..402d5522a661 100644 --- a/libarchive/test/test_archive_set_error.c +++ b/libarchive/test/test_archive_set_error.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); static void test(struct archive *a, int code, const char *msg) diff --git a/libarchive/test/test_archive_string.c b/libarchive/test/test_archive_string.c index 7fa743ba9ed2..f8f1e337bf73 100644 --- a/libarchive/test/test_archive_string.c +++ b/libarchive/test/test_archive_string.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #define __LIBARCHIVE_TEST #include "archive_string.h" @@ -406,7 +405,7 @@ DEFINE_TEST(test_archive_string_sort) srand((unsigned int)time(NULL)); size = sizeof(strings) / sizeof(char *); - assert((test_strings = (char **)calloc(1, sizeof(strings))) != NULL); + assert((test_strings = (char **)calloc(size, sizeof(char *))) != NULL); for (i = 0; i < (size - 1); i++) assert((test_strings[i] = strdup(strings[i])) != NULL); diff --git a/libarchive/test/test_archive_string_conversion.c b/libarchive/test/test_archive_string_conversion.c index 7faf58bfa117..d8c75888a4b3 100644 --- a/libarchive/test/test_archive_string_conversion.c +++ b/libarchive/test/test_archive_string_conversion.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #include @@ -42,8 +41,7 @@ if [ ! -f ${if} ]; then exit 0 fi of=test_archive_string_conversion.txt.Z -echo "\$FreeBSD\$" > ${of}.uu -awk -F ';' '$0 ~/^[0-9A-F]+/ {printf "%s;%s\n", $2, $3}' ${if} | compress | uuencode ${of} >> ${of}.uu +awk -F ';' '$0 ~/^[0-9A-F]+/ {printf "%s;%s\n", $2, $3}' ${if} | compress | uuencode ${of} > ${of}.uu exit 1 */ diff --git a/libarchive/test/test_archive_string_conversion.txt.Z.uu b/libarchive/test/test_archive_string_conversion.txt.Z.uu index 33c2e03bf7a2..a36323393720 100644 --- a/libarchive/test/test_archive_string_conversion.txt.Z.uu +++ b/libarchive/test/test_archive_string_conversion.txt.Z.uu @@ -1,4 +1,3 @@ -$FreeBSD$ begin 644 test_archive_string_conversion.txt.Z M'YV0,8K`"+(#!@P:-$#`F`'CAH*`,(84/)APH8P9#P4.4FG&ET diff --git a/libarchive/test/test_archive_write_add_filter_by_name.c b/libarchive/test/test_archive_write_add_filter_by_name.c index 49f91ac554dc..c80e161c3b58 100644 --- a/libarchive/test/test_archive_write_add_filter_by_name.c +++ b/libarchive/test/test_archive_write_add_filter_by_name.c @@ -23,9 +23,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - #include "test.h" -__FBSDID("$FreeBSD$"); static void test_filter_by_name(const char *filter_name, int filter_code, @@ -38,7 +36,7 @@ test_filter_by_name(const char *filter_name, int filter_code, char *buff; int r; - assert((buff = calloc(1, buffsize)) != NULL); + assert((buff = calloc(buffsize, sizeof(char))) != NULL); if (buff == NULL) return; diff --git a/libarchive/test/test_archive_write_set_filter_option.c b/libarchive/test/test_archive_write_set_filter_option.c index ab8e67773b50..6b90a831b469 100644 --- a/libarchive/test/test_archive_write_set_filter_option.c +++ b/libarchive/test/test_archive_write_set_filter_option.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define should(__a, __code, __m, __o, __v) \ assertEqualInt(__code, archive_write_set_filter_option(__a, __m, __o, __v)) diff --git a/libarchive/test/test_archive_write_set_format_by_name.c b/libarchive/test/test_archive_write_set_format_by_name.c index ef1327431b37..07942f6bffc8 100644 --- a/libarchive/test/test_archive_write_set_format_by_name.c +++ b/libarchive/test/test_archive_write_set_format_by_name.c @@ -23,9 +23,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - #include "test.h" -__FBSDID("$FreeBSD$"); static void test_format_by_name(const char *format_name, const char *compression_type, diff --git a/libarchive/test/test_archive_write_set_format_filter_by_ext.c b/libarchive/test/test_archive_write_set_format_filter_by_ext.c index 22345038609a..fe6c350e48e7 100644 --- a/libarchive/test/test_archive_write_set_format_filter_by_ext.c +++ b/libarchive/test/test_archive_write_set_format_filter_by_ext.c @@ -24,9 +24,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - #include "test.h" -__FBSDID("$FreeBSD$"); static void test_format_filter_by_ext(const char *output_file, diff --git a/libarchive/test/test_archive_write_set_format_option.c b/libarchive/test/test_archive_write_set_format_option.c index d964df44d7fa..38f83aba2ede 100644 --- a/libarchive/test/test_archive_write_set_format_option.c +++ b/libarchive/test/test_archive_write_set_format_option.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define should(__a, __code, __m, __o, __v) \ assertEqualInt(__code, archive_write_set_format_option(__a, __m, __o, __v)) diff --git a/libarchive/test/test_archive_write_set_option.c b/libarchive/test/test_archive_write_set_option.c index 27782342f330..aa44edad653d 100644 --- a/libarchive/test/test_archive_write_set_option.c +++ b/libarchive/test/test_archive_write_set_option.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define should(__a, __code, __m, __o, __v) \ assertEqualInt(__code, archive_write_set_option(__a, __m, __o, __v)) diff --git a/libarchive/test/test_archive_write_set_options.c b/libarchive/test/test_archive_write_set_options.c index db7e50e7f0f8..6a0198de35e1 100644 --- a/libarchive/test/test_archive_write_set_options.c +++ b/libarchive/test/test_archive_write_set_options.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); #define should(__a, __code, __opts) \ assertEqualInt(__code, archive_write_set_options(__a, __opts)) diff --git a/libarchive/test/test_archive_write_set_passphrase.c b/libarchive/test/test_archive_write_set_passphrase.c index 4bfcbb2c2dab..6e7e66531427 100644 --- a/libarchive/test/test_archive_write_set_passphrase.c +++ b/libarchive/test/test_archive_write_set_passphrase.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); struct archive_write; extern const char * __archive_write_get_passphrase(struct archive_write *); diff --git a/libarchive/test/test_bad_fd.c b/libarchive/test/test_bad_fd.c index f8144a3c39a4..11697da49d71 100644 --- a/libarchive/test/test_bad_fd.c +++ b/libarchive/test/test_bad_fd.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_bad_fd.c,v 1.2 2008/09/01 05:38:33 kientzle Exp $"); /* Verify that attempting to open an invalid fd returns correct error. */ DEFINE_TEST(test_bad_fd) diff --git a/libarchive/test/test_compat_bzip2.c b/libarchive/test/test_compat_bzip2.c index 7df086ff382d..e126e6f7d329 100644 --- a/libarchive/test/test_compat_bzip2.c +++ b/libarchive/test/test_compat_bzip2.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_compat_bzip2.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * Verify our ability to read sample files compatibly with bunzip2. diff --git a/libarchive/test/test_compat_bzip2_1.tbz.uu b/libarchive/test/test_compat_bzip2_1.tbz.uu index 989af82b2e56..8de9101478a9 100644 --- a/libarchive/test/test_compat_bzip2_1.tbz.uu +++ b/libarchive/test/test_compat_bzip2_1.tbz.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_compat_bzip2_1.tbz.uu 185683 2008-12-06 07:08:08Z kientzle $ - begin 644 test_compat_bzip2_1.tbz M0EIH.3%!62936;12^)(``#-;D=$00`!_@``!8RT>$`0`$```""``5#5/*'J> MD#(&30_5!H4_5-ZH`T``327U4@&L('"(9-%8<7&$I,`:7FXH$`0``!@P`/@#&$Q,F`F` M`,83$R8"8``1133"1/2-J-#$/U3@;XVF9V'`Y3882XA$*KO6\WTL`]QU&J"8 diff --git a/libarchive/test/test_compat_cpio.c b/libarchive/test/test_compat_cpio.c index 0c8b04232521..12512881112b 100644 --- a/libarchive/test/test_compat_cpio.c +++ b/libarchive/test/test_compat_cpio.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_compat_cpio.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * Verify our ability to read various sample files. diff --git a/libarchive/test/test_compat_cpio_1.cpio.uu b/libarchive/test/test_compat_cpio_1.cpio.uu index 967a344b409e..5cfc0d29f2f5 100644 --- a/libarchive/test/test_compat_cpio_1.cpio.uu +++ b/libarchive/test/test_compat_cpio_1.cpio.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_compat_cpio_1.cpio.uu 201247 2009-12-30 05:59:21Z kientzle $ - begin 644 test_compat_cpio_1.cpio M,#V=QL!06ER26`1T2G9F:EY)54XJ diff --git a/libarchive/test/test_compat_gzip_2.tgz.uu b/libarchive/test/test_compat_gzip_2.tgz.uu index 683b2a1f255b..92c0940b93f1 100644 --- a/libarchive/test/test_compat_gzip_2.tgz.uu +++ b/libarchive/test/test_compat_gzip_2.tgz.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_compat_gzip_2.tgz.uu 185683 2008-12-06 07:08:08Z kientzle $ - begin 644 test_compat_gzip_2.tgz M'XL(`&76(DD``^W800["(!"%8=:>@ALXPP`]CXF=Q&A<:-UX>EN)C5M,AL;P MO@V[0A=_.E39F2.B'*.?5QX2?Z\?XGE&27)F]L0WLFXZ^$'FM@5`:DY1!TN1&HBD88#`!PBD2%]C?-;.OH +M.CD*#@S?#ZT.,VK:EC>M&3P@Y6#E2P4;]:ZGPC!%9]MX<[QV8/(+:-NVZPP0/<$'L"@#M-U97_,O9,[)-C=WQF\#;/I +M/:?)P\LD+I'MSDVF+HV%F\WOJ$R2V<:,'&OLS*Z]4T;:T+0X?G0V!ZNJ/Q-\ +MQE5YN`.GF-)#-QJXPFV>*6B&<;.0&GJ`%Y(0D_50\KKX%.4]L05+4';KJ-V$ +MVL#+EB?+8%7%X;:GNJ4(]6,S=N&,"DM),\D=N4[M5_RF,6RI[%'Q.T]/"UI2 +MK>MMU(]0,9"U*K$(W"=LPT[/!9OZ&HFYF4T.[Z-D$WWX$M7D<&>\M'6R<*D_ +MN[1Y>2([+&>ZTU(G;#!E-7S=24W!*3L1VQGPE43J!Z0"4L2XV[]*,]HF-_?\ +M9%9T01.28SLQ,MKN5+@SE:["L51,9\S?7YD]YFW4EIGM)D33(7 +M/N7(69I0U.S1&(%\"DWY>:Q;R%`3QE:MCV'L]OTZ,.!K'KOKV5:>Y&3U_J^/DZ4I^H-K8XYHQ&]7RR0G<#7= +M#SG@WG#U`@]8*1OW=*C*8/`9@*DP.N'7/3;??EF@GGDYT^P.:['NCB3,/GT. +MZKGGL!OP*;[6:7IA"OF"`+G5[Y%7<7[R;%B,HRXU@(RXHB.#VN&8%,^4.RE2 +M]IP,'E:0-,/U&;Y0)R2P74`3WEC$NH+ZFFPUCW"!40RZ0A2(^5YH"JGW!MC` +M4LVA/AF]=(84`>IX2W<-U9OP2$ER[)"07JHM3WFAI)_NDUAF?01QSYQ.4+9.(JK.UC.%D[AMK&14PW=:U3Z/SNE.E(Z1-'RGX/1H8N=<-N\4 +M]4W2Y]VEL:;)3UU_'X$WV]5;!OP0OFB:CK=080B"790'#=MP=O$RJ1@!+CHI +M.\L&7%!%M^G%&S>Q`^=R&ORLF>1H=FB +M%2%]XGW4VUF0Q@L.NDZ_&3/'=_7/E1XSJB.G`#->HK%5<0)D"#'GWKJMRM+T +M_YA4]<5OF44F3E6FEF?SSX5K9".8#?9JP?UEI(D5T=0ALWJ9=DICE;@LJIN2 +M[2C\$8MX315IA3PTF^W50Z]H8W>]]U, +M$)4+K.:(3(5$(8O@$NH&73`3_(OYRN?J$^2PE5^L@_>AT/F#J5KTGFI&J82I +MFI?KLOQU-C<\MT?8QDU'0!PUSVEM)BZ#Y7_@9>:.P*0;7FC>&?UPI6\8\KZ3 +M=NWS#T*BMYL%&6"5V4Y!3:U=Z`'*#[30H/":R\?UD*56",Z3E*-=F>GI6I5+ +M@,=X.E6#FM`@BU+!=/2C57=^Y3?I"]?&\,?6/S*;0Z;@Z30^K<[WPFGT]AA2 +MY",3*9-3=@>[;@[R.C[3L0*OB=SCO4M@)`_(^0S.NGL +M.,,(QEU>5<1+`'%*>;J(IOQH!)!T]HX_L:#)^VE#VBK0EBY27%)L!P+W9\/_1GK7?G<(92R.)]^)"W(S,@.-1=/ +MCV]_''DC\#$ZV>EP7\&,D35S5+YD^[%N??$MJ^5U`Q#>PQTN$>G6\6*8BPJ5 +M;X#?`_C!10`]"VH0_*HS/^1)U?EUEGF'/':R$;D?@_]Q:R2Y]:Q"7#8=_G?M +M&*F>S^ZV1";E[=#:[COOSK,!T)2K^AZP1@3KWQK,S.;3:]#:[,T!U$KP@? +MR+>;%.3GS,4X]OMCZ%8<+ZD8*MC%)+KI#F0_#Y%?J=[G&0_UGLQVO[",,LLP +MFY-$^=0WOMI1GP$`:+XN'>`TM1=,@'02^$8N08F*,N>7H@Y;QWE&[;.V)5!E +MY9X?7E*/W!SCP(ZST)/;E0/D>$.I>)KG_$Z4#&SOWP65\0,LB9?M/W6+:`_% +MC5-,ZTE"BY]FB^X%Z;AS*$?E7!'N.OQ:EHE)7;V\F"B;<@7O;BGT'ME\H$JH +MF-(:@$$]Q[*@&76AP86N5JNJ]&T=\PVZ1G9=[N@3"Y9/>;=Y,]A!D467GK,2 +ME'1XVE@&(@=C[TU$4;D"2-S&,[$GB.0/P1!L-LZ`:&J/X!R4P[=9UZU(G^:7 +MT4W+74N:D:D)!2<5R#]KB><* +MA8-K?#>MM#S*"%B)P&6+X8^7?R*//'9^Z/*G8S`9G(BJ(1O<:EBQ:V'"8[3< +MV=<6?E7&-2DEP0`,7,ZN>85L[T&:$X5-YI"B(W=]XH4[X4^,=_(JH-87W^I/ +MMO[5R-B/C6J.6U_`G=A.L1N'T4A%L$HD_JMV<.QPC.W$*^NM8'45?\6#1'H" +MZZ%V-S*IIL-7MG1^I"QU,7C`J7"Z*E^9&=46OA3I-1'&&4##XNS=&H[S79G6 +MG$WWG\8`D;AB$RH?*)V&FL@%,5@YE#FO->G$L;ASI!'U@=%9_M(0D"WU_*`* +MS7U1>)L^W'<2=[\OGWA^5.SUC/7%TWT)CB6\)@22[=P@I#U2_+P74?&]F4F@ +M1VV)1"!N0'0I4)@9_Z/K4T[@M&3>2(*P^1T2.M:,].(&$/8<:$;4-;&`B\L; +MTZBP$*##EXGS@[!AKD<79.2-<\^!U[>&D^NS-G6!4@=A$J464!0N0E^5:8=H +M!3<]*8+,B'TN6^8PK".)P\^;3]?H=N6FBM$/"C)RL)"9G3#`[G#L21'[+%)OIT;T04N9F4]-5SVQI%FWU1SPB'`=X(F8 +MSI^G>*X+7%&_TF:@6UL"FJ14&?/U[R3]^!9D+:`R,?F7*>3*SZ,*_T`VLUWQ +MK=,5:%EYP_K=8Z[M-\/).&"Q'L7+\BI6U/;,=@S@[,BG3$G +MTGJ/P9PWP-W3*_$'O>@0C@2?#!W'`P*[8/`$2]LKP6\,"[>T8TM_IAV"L^>N +M#;"7*VO3F_6*)4NINCSLC)*E=('"_375C;.Q6+=]_-HOZQ<01UL_ZM$#!GO@ +MB8,__Y(;S8K&!AQ#=0E8=5:NV8>?6R0KRR`[_(82L$/JQ3$ZD`%JSV++4Q;^ +M/`)!BXK!$GZ>3=T9M/7WI+)8F*SV:/2!AV_6N!V'.%@638XUIT=3[Y7)Y66K +MLCZ!YVUQ4W&0^-U):_E^_X$L=LH>%9-_/15VH.@/=]\E&?^5SN/]NU":^YMQ_6AP#5)R1[ +MW`&=(1@:(0#_@=TYYVXM_3M\#CY+.72'?9;]Y9*S-*^R"A'MV@,>=$@6/`DN +M@7^E^9[]CD:#''>W&Z5QS/$0-G8K3=%KV#4]\9,.70/1_U^S\J;[PY>(_4PV +M(MX+"B-6EV-H"-4$F1))*\9T')J.FEU53"Q4-.W!)I@L#[:T,D/A[LM4YQBK +M[8)K$=2<,_@#L`%#RR7S=`[/F16$GV?+7L3X&TAPQ)+]BC;<;LEC^H'KYV'7 +M2'=2!B2V4`;R9%^'+&%CAR08F\#+D!>K7J*M\8$E-*0K3%^G'J<[`[;&";KS +MGNJ.$*>VFOYV+-:K9(L=Q7F>F$Q;V&7>]!H+GPZLL<9OV1$S/3I$BCLE21NX7&LR5RZ0%J-4+1SU5!TT1,Y=T( +M)P93`NY!`05O1\76_&2Z]`[9G'P@>3H[0-L,\OV7*@&-;P83?VO655&,4XP< +M]$B0Z'@J3/;Q&!(>O3B3L'\<]I++0W/<',K=H8&/Q04F,]Y['WJ;B7/31K*G +MT=\\?;2#UZX'MVV2,'=,V&%GD4N=IOA&-"B[&C4\WOFCYZF3'ZQ0 +MZF#)V?EA)EFCTI9<2\RFD%'=3TQK#<9V-_R0)S;EF!)ZIO4P:\#T[6*RTW^',$B=LLY4]9H/\06$-@=!EP@+6T +MD1\3LD2*@PH=#GYJL6S2M\.4]-5"V%<&[H\M/O?W%*?MA5X3FT;N@M@90:9%J!Y[,]S>2*<2JW<_#132S(NQA;G;8O`@7E3_B%V1 +M?P(B"X;IS`BZ2Q+LV8_*(S0"F`:CBX.0Z3N96%(K",L*#!,2,5NM*4[=(R'Z&]#,\9"IP)!.BP#$T7L>+I6G3PT2P1B +MKQ#70'EIL44A8&9%$]4_NKNL;)8K<\$%?,:SZ8?6#$4VM^I1WBN+.]_W,TJ$_F2N5HZ.8)]S-IL$Q(G?"8Z>-Y!UJT*YMOU!0SH^+%8H;__,^OPA<%A4E_[IF +M98NBR!#*$97H;'E3:MVGF2PITGJ!^5,P&OCHLJ[R6@Y#A18'9G$&DS#:#@<. +M:49X)8.L!)054YUT9\%`NSCU*>6BCUQ)K2ENDN>0$L+OGKZI(](=%=,L"PO7 +ME^&/8X(U]0Y`L2`9M'OD`U/-[6I0]YA5]'U;9NB^4;J^* +M\K^P'"AR:A,XA6G)89#EAA'\49\^I@_SY+H`$W%5;HPM0$!UQD-1PT?BDN\:(P +M[H-NO7WU@>/\$+?L3Z,Q&,1Z0EH("\=PXO8"TCC).P6\Q3]#IME.,2G"23#. +MWBZVXUOS1^OGF6TD8F(X@7,L;\=J8RMM_CW#>>V<'PP`H$R',)XKLY`.LBY0 +ML=TN^`0*ZZ;1%NM%P]=G#*JM;^L/8SF?A8H!#/X(+J\XZ0"#WN:Q]&=P:)0U +M$7GTCVVO)#T>L'Y2L@_;5&A"RKFPZF3/8_H%:U"2:O_!&F[`9Q@T?V2=R'+= +M=E,]X9,)W844SSZJ5E]#U"+U#V&@I$U#>B53)7B,RFUY@$TCU`^D*>>FI3OQ +MY1F8*WMO34L9U4>AXZM8B=$%A_\^-/Q[QY^8MN4T4(QV.96!9'=S)J6Q;WDO +M>ZA7)U--5PGC,VM,X%OD.LN@'@0LG%%,5$S>6$PD:EX.PZ3#G+1?X32_8]TK +M`U.'@C8LOY7,\^>"/U=>M%]?@H8#0_\WB$X>%@;M@.'2XMH^4D@+_)L^V80# +MW1DA@Q/.3*I:M\,7?_:+#10Y":O>JE[TN5D&9IM*+&(1EI+SG6S4U82D:V2C +MC82E$1N]YD.(C:CQG#GBSNGZLL^E1%J4[SG]SL.)A]XU/>O1;:,QO#HGJ*ID +M@-'F"C33@-S[_\>GJ"QC(CE-X&U>A!3&:6MQZ@&$/\D/0)^R7%'2<)(MJ;99,=4*SPV(GD.&0YB_,GJ""$0C9*60DI!#Z6TTQT+H +M,F>S$*!@DE`88?L,SV)/.]7()T@Y-KW$8-N1514$L#7UO9`+<2^0\Y3JZW(, +M/(`2]=,(::92MDYQTB7`3*9GMWT2D":+_2LNT/YZT\ +MU;)HMO+;Q;UGA)$5GH(H*#!IV7;+`%81FG\JAK8BK*@3"Z:XBS:UH:,D0KO/ +MV\@%Z@Y\BMTX&PVTA+/KK@_=FU4%L;=D*H]5>+',TNT*Q:1"7;Y2L".URX9> +MD.R%"?87,YIX8?`J[`$V&Y,B[4X_O4S:Z^S`[D&$,=]?'. +M"*4>4P:Q:SYC[@^0)^1XL<>S.I.^\E3)IUY>HK$TLY06$>9+I?+]YO<$$>`^ +M2P^`:VP_YCME;NEBGM%?'<%*2W8C.*T4<]X&V,=+N"U3\?V#(C2!L"47`?,B +MH\Q%0>L'?934CX#]=BB#FG"!?Z^--S9520073?E@NW%@?=HZ3)/865/+$`G/ +MM%N.:_P(.3*U@_JV*6L'ZU,-M.E",Y,N8+\%NJ0C?Y/K3G:V"EQ$P[6MBV7M +M-1*=WNXB*>PA0SLDM+.SQX#Y^1-G\\`QWK*53F?\#+O2(`$M$*?+NC0POB$] +M[/\^_0OPWE(81TO%8 +MB>8;Q=_H(&Z&CU'ZO"+:?AOD'`J3[VF.Q+YV;C;)TJ#B;/B6'1>YNH7/AHYZ +MZ"HN6#6Y&1R3,1MB#6\BAWLG"B9S<@B%_HYQ_;1C6`8Y<+'D^L9]@[]6$.<- +M@:GCD19:7XCQ6I-L[HHX5.!GHD9-V\,,#X-R[/0:#J/_MFA3$5U^W[ED\M#M +MB8-+V`!=^:=Q^[E6=6:%XCMR(8;ISC,LB!+%#6I0..49VK24C.Q +M(87P178<$C'@V$HO3S;TY +MRT>950U1*&1"`-I6%H\#7JZ3-T^W"UF+9\*>@9;1\2]Q)L?ZT?'PK]/NWC.1 +MX*',Q20V,J6JO+^$F_.A0SI?%BU4HBU_>.8T#.?NFL*Y)K,_!3@9=9C8NP[D +M1^2/&$W:MWTZD&RPJ^\!6U#UI7#3OUL<^C!NJH:936KFCA:)05I1>J_+7Y`, +M^DBIZ_?=F$$,N-E]_?<@A[3<1ARZ@KU,[1:"$8\#IR+V3C3,);ANDA'`59G= +M\"YUBZ54O`T(?:M+ZUK_3N=2WF_I0Q2$LUO^&,Y43VTRDF<82!?JNL@X[4T' +M,#N^C+]8<_\5U*&*.Y9TL`L!:JQ-*4[S:QYP6-]H>4+1JE7L7JWP2]/)!Y/N3=;/Y19R\C^@?!,\%2T8CN-<1V=`D!3 +MP;A/.YG-(@N7;8N2\B^D>%+3"?;/)S;KZH)IM'"M,VK_]:\QWUE +M1EM_'IW:TW\KO#J1\.SWNO(9_/3ZKW[=*!JZQ\5`_BA5E/&3N?EK'^EH5#AN +MQS?3"JTJ7&F%RPC;#D1)9R@3T_JC*PAN\KLH9/6J)OG0BOO#>VSHPV)`0X=L +M%[M+-3_R^(13.[;P%M''U\ZJ.@\8ILN3]FD+Y[D;FA#G2CWL;@/T'(@N +M4&%1\62B65=N][.S^OMS?,.FV[VW7[+#*==-@@A!I>B@%@:\^-J,^T]ALW*5 +MR^1\(5>K*`O*0C%$&=LJHP&4Y,"+M`=O3\[YEM+?*T$]7P+9Z?Z7,-9(]X`< +ML,OE!>P'2-U:2-EG)TE%S^%S>V@%W2UD)DT?>#AC;]^?"&NM&&+YH:\/3VHV +M^DH.N9(6J74U3'.+M8=MK\FI71Y=6>1#JT-/(Q5&P4M7[A=G4:=ALU"@]X'$ +M2"L\48]U2>C(N?VH7@FVYYMT\JQ4M=(@H,@=L[`5@.V?_&RQ">0N'RD>9`*@ +M+A,)(1JNV$<#E>M=5R9M+[[KVBUHX*,L&X##1DR%GM +M81A2`IVM0K=L`D-B^CA*M;C=67NI`_>FZ&W_8Y4"R\;(3.@H(RN7S]AP:F>V +M(Z1JB<31_.\.P0!ZEB(6A95AK#]4EYC3>*['*^T#BFXJ-.0!FD##0VW1D'G& +M!+0W3!THD0_9Q=[_7:A"%J`);\#4TR2OVSEN;Z3&\YT]&B)3/@B7Z.V,=K[I +MP*SMUV^;\K58K._%TI(3._#KT&=P-[U;M$:O_@/I_.G`,)?CTD<4?,$G/0(T +M_EH<=%I![Z"LZ=:.*Q`K?YW^GG%D8DLC2W.3"^IK=WL1TOD735&U7N'!>!IH +MG(I3-!'`FI=9^@UB#-'M'[Z`AV+8*O'B=O:+@R:(_WFX\Q)]%L\`VL#E\O0]-W1K#3`C=U)]H'UO@'BOJU16$HV8^K(#0:#;4-BZ +M5"98HB\Y0]`E4]4L7G-%P@482):]L)/#+=HD)3,&\'8[#QS<[R(!KQ7X4W-B>3R(#ZFQ<67&KP +M.3^FE7*?+EDD9W2M)>`K<1A`4!YQ@1YP(M4=[]'"2FE?^_(_]U@=_R/I3<@, +M*&9;52&E8&^I_NMKZTHMJ4]S]9"-#._/BU:,Y4:M(X=OP!?)WT@NB*4_GS-; +M\;P$U5M3$OLJ]9'Q14<:A'(B>)#4Z*M63.M;M_G`T>=>:CS$Z] +M7.^'33J_GC6%0X+U"O2;#/7_"M7$X@%];D^W;6KBO?:$[JA"!][CBW3B$7`_ +MG'!`8FV?QHT?94P*(G+EN:J$1QP[ONSE&4'",)/"E[%"*?:\E[P?QT\>YWIW +M96,.$^1\:^"HX&VW'<$SSFK/F;B8F$338(K:E*T"*G/;!JJ"S[Z[5 +M-O1_AZLM7(]46ZS?O[]*7[ZL:.D`QEAU.X/6B:RA7^'QX3UEJ^Q>@K0H6WA> +M\3F17?VM72]\!)5B;R6P<+4$F'MKYN\^FS$@U[8?O>$JM!)+_&Y19>>K'/JOE/A(D`D;1I!%?ULH4@Z +MHN:6KBX&\'U!FV=X1Z%#*8R!=#(BE*7@6Q?%&.I'0(7^HK5B%;8KPIW'X=GK +M.,G$TI?BSJ1H<`JBHF[=,/8'4ML!O&OCNA@H3S+L#C#E)NJ8C%M-\L7[T$>^ +M(\#-#D64G0,C+K&X+I[W'V8S&CG`P)#/6R^)](/0'H\G/EA09X_V_UC_Q*H8 +MYMSSX>%1A7]LAO#>4"H01>0(X(RD8;(N5@E?Z<:5MQ%P^"95$_1Z3O$L8P:6 +M=P2FZK;AVJX$%C:+:L2^+"QQCH26%YEO,)H"HX4RK-_%.=`M3".VRT>C["&=+EJ!]?%;U9-PK< +M&;%UAHKKR74'TI,-C#N3!-KHPV')XF%GOOD>.&(5'O+FL^*#;BKH%(H[_%#?<,>X?]B?)F<8L7:\ZO)8P;1NPV3V:H++61KF< +MP;+`]6%[2NP##67SA72V)>541(RZD)B"N5^1KT4T'(3JV9R_,%;+6SX5[`]V +M9"6`OL$.>9IK]:K%1D,(_/@U7RQ43[82Y*FX63.C3W2>Z7R$EIW8!*?!?6G>Z:JAP`AL+X)OEID824H^=S?4 +M:9Z,I,0K"#G1D)IG>@01(MF%%0\U9:QMQ9IRK-NY=*G*OC0=A?CC3.O_;32Z +MK<_17II)/,R;#W5=&+MV<':-`@,,V&]*@ON57W-5%1= +M`(\P(E;SP,=B`9E\R'I"E5!X[AU`5."A;RX`,-W37<)L7(72-B"6&/\$349C6:("_6,^(2-9VD7-!6@:-_A.0F< +M;&Y9J$G_!H]*;()JJR_14VU&_>J+_+C*CT[O"KD`)0R7O +M'J!9RQ]5V2)K4!B>1RX+_3G)'5ARTU9LXR:XC1:CRN+^GYH82T"C`*\7XDL) +MK%K%IXM%C;H?N*%/964+FHM@"X-&I(MX@-S[0=8XM'F!$KJ0MR2>>&5K))M\ +MJMR@I]K(A1-=X(@=(7Q73K2?TR84%OD`EH2_\D@P@\^A%,0R=A]X%BR@I]X: +MF(KVS\_^:G43RJRHD1D88I+SD0A#\9$5-Z_'+7YC!8>IG0Q0Q9E51[+^')0, +MJ0L?K@<+N1H6+XDMRR0BP,%KDEP!"S^6D!J230L>*NM#7A?VKF%^\[3&]C>A +MG64XR;_TZ>3OILJ0U'(2V$T9PK&J;OF(Z:\ +M^&Q9NI"U1A][]5YF"H(B:/^KIX3IT]V$!C;X1,LV$A`UN'*-2B)+PX); +M]YF@%>!.GATA];5'@EZ!;VP=D,?ZL9LF`3K['?MX4:IU[!M/!V/@H.9;9E)5 +MD*.DWDWN%X,1[^;*H'Z3H:&J&,3=Y$A\A-6,.YYSOPEI=P["VWP`:EI&E8C; +M)M#>&7U866P+/2KO/U,%&/Y-V!S#%(72@17/,=.7`X^?#]%H)XQM^G%0V'$5 +MNE`\K`OCT'(!5"%^2LLIYK#]\NI[3I:5QH6`)2F5&77Z0-9*?1VMR-8[;[0/ +M38K.,!4&[%X`-8CIX6O5KO%R6W@;T3 +MY;-OC-[==5))NI"G]N`PU?,7D$*+E0\-360[A#E+!Z*R(.X=YWC"M7Z-NAU2 +MU7L3`2PGYI.,>.W/VBY80A,&7]E;JWG1=Q,.3(Q=W[E0CU",Z$2M=BN$-\-I +MA;F/GPR+SCZ$+*.?YU0P9YU#V+(O!-"8'9D6&ND`(,')O8N/J_E!N-D`:1:W +M96-^JO3[*ZVL+5!R8];Q?F]?6^:A7`NS9IF,+L@5H=7-1?1&)I0=A+M40!C+ +M]W^V]_`AUC`YNXBM=GK$PI/0UR!BL3E%V'IT!Z6]T%1ALYHX,(8`W`'&4R`HOO,8YITNO.1:I,!:&JC0:E="6!(PFSMZNZS*?7QA98"U +MZ^X=:XDKBQ]$#KY5B\"T@GE3->:3'%YNT0#`A)KB/38QQ`%Y<`:L&1`]E2(C +M$Z$*&H%?%"?7EM.<9[`H&?1LCS'IG7<(F]9N_9S?B(O2*AO()K5XTU?3SMQ9 +MB6]0\'D][_$F_&I^:^91U^1IJ^Q,)LC2U/TG4DK+OWB-9@I@]BN04^?`EL:* +M$VDBH-:2)C?;CI(GC1<$Q2;*1-1<"LEH^;#B!H++;@JQ\8ORS;[:I!X_4!N9 +M-GXUEH=IVU?QUO6:*2(#6H55[F +M"_O]7P[QR3>0Z$`D,TP'-06K]*8>CBYCVF"34@TSE8Q]/4+AHI44'0X"JC4= +MCF&>K=3'Q+=P)*,K5U\!M1+^#T!AI\Q^X-TQ"-8U@WQ!70V;\!FH"U,OIGONVBOA<#L9,6>S;;KT'X,H#BN<'?$6C2_$&N%8,!\56RRZITN]@(AV4L(M@/$S)WH"^PB^?EB?,(.*1/26TG^N?-CO/OL!(J(C:_=9Z0W2%ZD[X$S)V:;*IOCJGE;FG&^,3 +M7:`SX%`JUA*ZPVQ;1_=I3NAO-;WM0B,PS&47RF=/%'$B'+.D:J`)P#9Y+]D3 +M8D&EJ,C#'Q'A`1P*HM#,3T[^/?!`1-/?RH##`+I*-/5RGWAU_;2D79.D^`@,E;M@IVVR*_1_O: +MQ\\O#Q1/PSP@1&94$!@BV"UFB/'?%%'K.&;?[:3*U7&2>375'\3WA;.5=N(< +MYF+LX:Y[HQ%!S!W6/>'>-.<#AD,712Q[O0Y? +MNKC4(,-5FORO1=VN%V+/'/I!&UE:BC]>Z86Z0H\HYMA4O+BH/*.XUX">5`)@ +M3]^(/]>C[M2\*9AHG[98,BL.!YF[H>(A5JA];1A_O_"7KN*9>PO'F?1_)VL\ +M^X_3T\(E$+X8C2PVS7Q9&"GU=K9GNUB%78[=Z!_;JIP`Q-=X0XW!:K3F["]B +MMW\/J*/,7]!1$;9Z:J]HJ;9X])+C?^)ZY7Q^>3NCSQB2*F,(WA/5OB>@(;DG +M/\1B1A>5=:I:[O`UZJ@G8''#NT0DJAR)CWVTF"](1C$DR;64\*US-0YIQ%DN +MQ0P^3LYNA,GRO%IX,X="-GVB;DJ,5;Z+!`'KR#N;2H)C_U*L@3LCW@,U!*E1 +M+@A05L_P",-1WRV`E\1()C>KF+[2P&VJ*KQ`N@-?8?MD#%%%(2Z#XRNL +MK`8D\E1#7[?'!OH5!!0[#XJR,=OJ)"`Z]V\"F_%":;1<)6C])Y-_==3$(N=] +M3Y7T$CI%"`1Q42)FQX?KD;G,.E"$5K*<((C")'[=/Y]<%Z!;LOTQHRT9&A_W +M,!")BF70,4<6OP)J\VVZW>W7%Y68C0;T#O0`>'ZF*[AE%(RG!)N]N[>5C[W@ +MH;JK__C]L.=(D!..C?F/F53W4F1WC-KMC=GPXHV1[$/(02%FN%M/^5&J& +M\W//WP)8<[+@XGV5=-&)/\@!FJ2FI591"0"SM?'EX/M3J9%7`=4_+LM5R.2G +M^;D@Q1?)O3&U=[3T#CKG,\U5A^#Y;$H3'ON5YN6;T`3"*=^?VL8#MY/\HR>R +M.[2OP\^,_=DY;ZH7QMBL@$9Z@VM29J0V&MU@[F^&,NH
  • R!-EA:&XS8]780#$43*,P17N[_912"[F46!08HJPEZL2AT=GE\&E^Q +MZ:V=2&VO??EPC3W^D#(F2*XVIC3EH;2?-EH?3+#;YKMFG-S[62IU;H]\(".!/ +MHW(^IQQ#YQ.E5F#Z*D1\3/#185H&E&I!QHC7"I/%2^=SO`*E34LWO+\3&4'$ +ME]1)/YMY$"B%F0P'YTU'8Y!U0K&7W!.[PE/ML"&S8O]ST5-K)W<^:J`T#<%L +M'S?24V*G&R&$@0`7#H.-//#]XFN;TUCSNC\M$FRCSS@XU36+*)#8%2;1MXF2 +MT9MV/AO6>@!L'Z#NQ"9-9++J!/B<)336`!SKSE)E<3`(?#?7H%7ZXS:-=0^B +MD'(&+A.(]5^1R$!:+E1SE:XS83^H`W0;NP2D,2H%%;*/GPFO7CZ)QL'W@>.E +M5W+N7"><+\5K7C+#I%TY%*.0:@YZB[\Z)'9E:,.1LR:X%J3>-S,].RJQ:5YK +M^42XP3BF6"=_]@(IUNK!_X;3=\R7]9W:57(>!5$,MO^6Z!6MEXD85/,QLF`J +M":]E0.EV?R-)<>=IDT-">"]`E4ZR^CZ+"[,V*7'X +M60M?;=?L1%?A!YV7-]^%UY;T+_/I9AC"6B>3/A;#T(?K8T\++_"NR$'I#THG +M%+7QX)]Z9?&K,8.)N3$FE^6%5NYI_CM8T0.+0;%V(J81%&ASKD0)6_UDL8ZF:J][W&8>'&C&9J%CRU`2S +M6"LIYCG?CEJ?:>7%_=LS'T29:@?#.@W<\3?$C0EIY/R&V:=Z=O6!]ZR-O)7< +MG]18K#R*DFG`:Z?==;SQN`\PP\ICL2&M?^TL!=-V;IA2R5%PK4O!Y=C>ES:X +M_!:SZOG^L&S,,^MUE65!>Y*Q`@M_2'KDRJ4D<,D8S>8R-M\(YS@`*#IU"VX71`JH\KI%J.E8E:$=93\#A +M2XCC(+_3G83AQL&Q01D0,WS_JXF+OM<2`BR^?]$6;QPPK8>%03")849%/;5K_MA +M*\7#E$X5J4PR9)6?TA;P6L@?(GSV2*Q2Y;92%-F@>,5?BEAJ7,844 +MM&AI$DS=!L;@$'C*E7'2%B=EN7=Z&F:S[B(8FU#CX(08<<(J(O_-M)Q-S4-%B;[D7"KYHL +M<&1#\:C]=-!4ZZA)RD5:^F\N-&&_!@%D6O1O;E#I`@CY_CSIBG(>5Z4PH +M-P-X>\LC):,;B]$NR5F9Y'XO:RX=[M8!D^MU`+7X:F41Y^AN'E,AR<.J1=I85V6[.$]'LSQQ3%:VBZ'" +M6G>R=B9ELTK:#'6Y/RW.!1AU%W?X]@!:J!5K`N_GIPV1ROSW\^Q7I[]6X?2@J@UO^5^U3F9$M-(5!Q9OW]6!ZV]=WI5(Z;N7+S +MN]G?1"G.KYRMZQU>GOPR?T8I.+VJ@'7S)/JZ5;V=S5.>S]AIQ#$G9"&::;$\ +M>!`[LQKX\RK4#7VO5Z/.U:R2H43DV8",^^BS:H6X:[442:O\&I"VC34UKT4Z +M9KL/$KIDHN03TSDA]'PUA@#!#EE`PN`334A9A13[32/&4UM)N`.,8O`VBAQQ4A':0)"4C6"GP_)'/H$=S**J4];$7G2_TZT5Z`%_!H;O8\23?D +M&;YU.`N=-IC$R2=)X&C`HTONS"4>.@=-DQ%6M*(GJ!406X4E%B/'C)D= +M[0#T$D-C2Q#$Q(,XO0:SNNDYJ(]TBS;_MB#'!,[Y.+AN),=1.[87YHXS&E', +M(EZ-.H6Y/^TKU"^/>'@-@C:9O9(P;]C&\RV#M>A__@DIOYTOUFQ4YJA%LJ_7 +MJ`IP?YSCY00=:?\-]?GJCM@H9[?X +MC.ZR%-S*H85""GWZ.",EN=$!\A@0?)!BL-_6Y-`6_'D#P`WVJT,E#Q5@KEG2Y\P>CR8!82^XR1("N81=&>_4:R@MT +MQ)%NLG$1]M^^W'X[23@IZ2(^:NZ.8ZU`H^7YM^E;8_+G'T:VQ694PN"KH/\@.^S8&!ZT/UX/`IO=H+Y[@_\S_:RAYC3?"8G1 +M#94PPP^G7>,KU_[Y:$H46J``?R!L(;$S5W8[_!QJB*-,E=8[+_+5J,321M<( +MKF'X]6%N/K110L+/6XV,EK:O<*CX4X(1:HD9#MXR+GPF!Z+^80S)X*G9F[5! +MR:Z/N%]?7\@6G`_PRS#50.W3Q\O")K!1RP;2:C8-%IK8L_1EZR8Z&Y!\YKOJ +M4D!M:5[^H2H<]IW^'6.9!8Z..#%RK%XU0Q]J[4U319(8HI[@\."%!P=7"=F, +M&!_VF.?^4#5K5L[V5"7_GVU9JMWYN*X^_LT$JC +M\S@L.[@@F8^0[NB[*O3%9/:-GM.9?]&YX'Y2>H+CQ,TW\\XMJV[4/=K8)]]AH1:1?81OOZ3%TFQ+&/)/:R4[6. +M_I;QS>%OFZ58VE8$F0*VLK'1\R'=@R$*RRFZ>X>P/N;=%VXXDR710-A\&HNN +M<)'D+G[4=;=GY.Q8ZGY^)2Q?BPQD/0"N?++<,Z`Y?]QMZ[#O6\'=S(8FRW-7 +MV3'9Y>2<4C5'9<:D$E)'[YQ8(R#%I)34XL`2BDYU-T1BO$I/6C!/Q)BE&J^E +M'PTDLJP"A!-I[H]XSKEK\`IJ3IH#1X&Q87^S]LAF0U9J6XB$WEJL#HZ9"LI8 +M_@M0@!/5[S1K9;:FEL*.9<)7CQTLY<4B_\(DK!E;Q$Q1M-*1*\+`TV//"%?( +M:"\,S:='2MD+'8)`$_.MY:);43,?Q1N0:I_I-9P$*],\BF`IS52-Q).=&4A_7!Q\-OATO(Q9E';`&/S31YWR%.\8`L8BCW +M$ROJQ?`/C8*_01HNDS)8_6/4$OO>('/UX.;QR%[4X$\E`!-I['1'VH,'?K]UXO/+$EGSVG"\E"%MV0`XEQT%8%< +MYL95K8P!VM4`6W+.=-,`*`28D^3D;>]AV>1OI:\MOT/X['3K[`1%7P[Q<17C +MDR0K'G&:!ICGSV@3J"[VV>!R7C@>RAWRQ1/[3;.?X6L909CES@K]#HD9)D?D +MD6:X9H,!]M:S08Q*1SI!`R>DA[/FH^-4&16!84.'@[4L5#H2R:QQ)!RB+6:1 +M-WD/)4/6XWF4SB/7T?&26PGJ5'W]0GTO8%=Z?!7X%4DD*/C'[20-VV\< +MY9%3'T5EW2G>M1E+2TTD`$SMB%G^:7>BP]*()-_6DO?OW9W,`2L56"9F0&?,Q*DM50DR*[B`5X-3&ZIHJR,/+\7@_ +M/XNAZ6?%HMPJU*!6JN=T>A&,*<[ZB..CN>@?Q"QX/Y>;VA`;>K +M@=A;"=(]^FK5;2;-9<\Q]E)5!QX*U5^H'^/,2C432YQ*8XJNV5B$*7=2WXR\ +M?!(#,V)"4DD;@CA8TIOS%&;2FY"98IK/L$7'K-(F>N1PO=_#+>_HNA>N)^[P +MS*],/;RCR9ZZ.O=BR4\GX[LI5!'H]%@@"_Q6#X56MC^.V>/??MNN`7$]5E*^ +MA97DW_)E\'7C)&8^79J773B<'-/90X/&P1?K"I9O50^-PG7A4^*SH-'*GH= +M?>`H]FM'3NH[8IOPI@E-;&\=B +M9&Q,C7$ZZ_6]3@NZ9O&7;5-;S1LX>>RJ>%8^@F764_-09Z%.$9@X>[8A6W7BF6_)EST71T$?_9MYFA[=8ZA\TN1,FKAMWB0:-$UR +M^N?!\.EA=9'#,IO8@P'_8R/B-&:7!R)X!F&QH[M.$89Z6F-VD9VD7#;67H+?^1_27X4PQ`3!.`<(F$`TQ>F_'@=5H1& +M;XZ9T^I7F<[60K)7J:'S<%+9G8C2B-"8NZ0TUA%(ST4+)CL!`&B3_K7IXXC0 +M6[?;H-WA?TJ$H7XSAAH,6#1MI.M[H[C8UT>7Z^^`\QTF;$DY8 +M<\07EJ4QRTPK:[K84I?)6#CT$4!;[2^&3H/CKS'8[ +M&07+S(GKM8<@,\85L>(V"FF^F`YQVH)MCJ0!CA8X09]29"@;R%01]M-/6/GQ +MM"T7FZ&+8[Z!4R/6R0\QBG$M+-:A^_X.P'XV3'!6*GK\HQ``CTSQ*2!F_:"O +M@PI5+DE'RL;8#Y?8A@GWH;XR!)RFZ#G849H"DY?&.`MJ>&'^1=>A?)!`/EW# +M`8>@<-"PYPX!C)H!4_;0"I0%3=5^&><`*)[H5QAA`,`GQ118:!(F73NA-K$1 +MP8N_]&101Q%6)->P?IACP>*&/Q$F:14`XZ`_.,[-`Q]EMSRT(GK.H(KDC\JYHM +MN<%T0P4&P*F8\Q3STISC*U>247<-59^9O42*>D5`GUF*M;<+\I=4M(F3Y32V +MH_^=^:J;(#?[,- +M'N7Z1HN%DGL^BN)J`]#E(<47U!(AL,-\H":C +M["&ZS1P]R"8K49;Z^K^6\%]WK`0CB9R?!Q[)]@WQZL-6S<7C#B#F?;9M&TLN +M9C[H"`JN2Q"CE#+=7ZW5&T<98.AZXBPN?WH&2P=+%G,,\I_.VJ#K]"'A6P[N +M7Z'7>K052VI`B=TKQAT0.@V&^Z3!S!92:T>85>M?\FXQ72'F*8%46*V9GL9I +M_4^-UDSQ_BK7U[KI5DR%O<'&D`R[F2P14E2UHSA +M&*]K8M"^4'U;+[/__25+*\AF#5*);R.',14Q5OJEP90"JZ%CLYPEX(_`CGA[ +MBAM,4<>%.'!B3!%E./4OS7B;/U+M59+)^U6Z/@':_2MP$[X`N^R3[)>SQ(9< +MKO9=VQVE=?FHNU?)FIBXP_U<3A`-9MHGM+Q`%,+&0$Z/@Y1Y!J?7ZYB@X4+L +M^``::)[4AOC4`6;NT@I'?+0;]9($@+#2<&BXSX>,!#R'91';#<5)I'Y9R6(/ +M:+L/$7JGUD:GPJ&&_TRGX>?)8`R]#5#='[!#QW-(U_RFYY+J(7U4Q`IW**'% +M'/<(GT9;S1REK7L@"2S;8-W>OZC!5@D:0IF$G[L&X=9CO\:,T%A5YQ_,>J>W +MAT3"+W+A%.4AQ`2WLX/C6`OL/8+#7X-1-PG31EH+.'2\E-EC%A!0NF7'O+D/0\?ZE1S57H1(DRA^\OI',B@% +MQOIH;`P5%GWD34<)J#A/X%K9/H+N3_N,P#&C(MQ;D_W^\E>#/!4?J0ZP3'_YQMK3"+T9;',UD\AB3B*TFH+S)MZC022;T>:S/ +M*:S+'^V4_`3B9QL;[R\JS]SUR(%&6`J*GK6O=K2*QVY2:WFD0+,=F0-82"%1 +M#D$+U=]WN&9VH!?DK$I+DV1K;K%W`GCQP$3(D%FR'2]FQX/G!.($5;P2"M(E'8=Y?JFW*0+?UB!1.E/L_9;(RS1*NJQ9A)+ +M/_B!TXLN^RA/7HB3@?8O\+JZHL%-GO"_*@7BH?Q^+SS9J+WMH"9=ODHOI&*\]+C(WS",,CJKMJC,<5Y +MU#[J+-UYL.S&NTU0PYJOVX[C;>33!W7S.6]IMA.)`H*.EZAY=^IL][-_F66R +M:UYS`5DN?FKM17W"Y-;0I!TC;5$KA2?MFT$$=+,B-HK25UH$\A$^+".`Y5VZ +M2\Z[>$BG/M^ZEBSF05-E)WPU8K;5,,2@.*TWA:VUH@C4"3H22D9L:I^#=X!< +M-G$S7IMZHBBT*I7N*`$[5B0E(/G;L.CG7@Y,Q+*F/D;"#E(7;3S(R4LL-9]L +M-2@]JRW2U61.D\;%RL3T)6>54UY"\IK\HGF2",6EQYN!UZ]!C(E(Q1Z!)?[" +M9*+Y30N`[>P';(6`*B`#0H1G7MQ]$0(:G9LLI^1Q'I&QHFUHG[(/JA;@YQRQ +MBS_&A"_AL=9?3>*)/QO!HRXVO!S$G/8^["+9UN^&&9&*()3M.\VJZD@#N@3+ +MG=Z2&\WY/Q@$?32;),O$=((]I/$JMU$L#<@CGK@=@Z/"?Y^XG>WB0 +MO&)--<=)-*AMZR)&OTUL3F)W9RPN?3]UYY=/%)U(*]UPDK!_3!E-H\$8P!U` +M;8GWGCM_H18[5`5WC".+A8+\^$N2[HIPB^2+[VM(!9UA2.?B+O\.6F<<$AE@ +MM*8\:J"2JN,FUBS5$2TEG'A'`5PI>0KO/24ELEM.@ARIQZ#VRI\J"\M8@Z_K +M7)4XJ90.28\[]XL?/?2M4`!?@_12$G^&)TH\!2``)4"@'-`%\=5\)SGW9[N5 +M_)N3<"VV7SHKX"B1,F'VGDU01(I*QQ0I_>L:5B/_*J.$\V%ARW4,4Y'4A[A5 +M-,NF9$75>42G7RNBY+I73`M(PH14I#DQ/O[2W]HJ9&#@6(6OX:-\B/)8`O(< +M(U_!AG4\HD3$(J>G+K6$2/,[Z'0\CF$#5A0C5!]4>/,+B"C:CB`KIDA#=DO>-_FT_N:A[)2`VQ'O_ +MR:#>[;`X';_#X*Y]G,+,"3YU/(8QYI^@X]62KSU3`+OCHB!,RMU(%\5J43%_ +M%'J7I[R_'%M+J\1`XIYP@2ECT!N<9467[$Q&Z!X"\.,U6PXA +M]=U*@G6]/#%54IA):PC).0EL;ERB8AI!R:X%EZB:P0.,`:&O/IGFH+M3GK_W +M4W;,%Q\=>[X1Y:5#O`,FE945@0VV`0E(S[J/:,.2:`Z(1RO/(45[!63,].O4;SQ<>T,ECUR$:XY +MW^>`^6XQTACO>$Y??Y/I`]O7;=NR4"SLTUNRE"$>72@]D60\@\/S<^?JGUR: +M)X.^P*^^?NLCK#[8N5,MZ6`\^U,B$:;41,<:V3;,/MBI_U;2%:/]@>`-I_2,68)8.SZ@6*Z,@T,+[> +M9D`NUM%_!!E#JO>?2$^4M07WRW(O$M!/<*QGVWWN8Z,WK!$7;'1;XB7('ZMH +M#&!N4E6C.R]&-CQL_4E+CFY:H/XB2.CPV`6<))^&O%HT]+_P4'4L%C_J4;;M +MYI9\("O<=PI:_:;0T*E`]OI_D:(*LR4G%9>H1RFE94;WL<_A><\+2+E,>/FV +MB.XN2(I^O_+_^"+5AH`#%,J7JJ;4Z50Z0F,MZ76 +M]YS%!>+SM$(Y.A6K7[ZM7*,Y;RLDC,RT,;?>K:19M>@[$:ZEXA5-W0NKHC[6 +MSD^**`?(K6#G)D]@)O=?'T9$;INJVF1:]C8EK@AX:]P@CNY/-\\]\?3UM,$S +M1>!&Z3KAC12X!%G"B7&-N26QH0Y%DA[-C^CG]8CFO6_>&*DK;_9;JJ_8O@S0 +MSPH".L%G-L;BNHF(^!KE_5'05S>?$U"A?GRHV?& +MH]2"LDOE[`UEN#D8ZCG^=SH^%%,5NZ#FGE*7_.V<4EZ3DVHKJXVP7F$PJ'FL +MM)H"'#@QYB!M@$\XCZP3++OU,; +M!Y2EHL:>REI3MISWNH7@5[(,MDBN9YR4Z2XJI5FIH]:$5/VU`RGPV5/G:=@,L$ +M-M[==2'!5Z?7"6!*_9-#Q5E:U0JFWV$T=UUZ8"S1!Z()]^XSJ`?`%K&G%;+X +M+7-V\,R095.WHM.MSHKF_@Y8OVV6S?Y +M`F7'%2*1">A2X),$(&&;_4N(1&8V,5Y_$Q.T6-CFQ4I>H\?.TW;N%$:P'F@6R[H$9M<4&B!78 +M,A^]=3/E,X0POTO7$8/<9KJ>5*(3,+(;3%TWZ,Y>E+<;#\E9Q$0VA\1@B(U* +MQG_J+=01E7#08\U.&ANWM\=DB.^_OB]D=K29A87$H?@A-W^;Q_,HL$]KF.0S +M:_=$DI0QI"7)6JG.'[=,ZN0[3`9+Q.-ME`8Y\9R)I_\3W+4)<5)E:[0RRQK> +M!CZMM=IIDQ78S(_!;SQ"!;(IW/[,D7P\[YGZ*"8([97;4E4Q=G3D?4H3C$Z% +MPU;FH[KY,/1H%TM7U#'"I_?D;0K7XVBP+9XQ9ZU,AX/W['G1XN]0Z\UW/NF- +M42_+DM2A($=T*7#T86>`?V_!:D'].1W8%S&Y&<(<_ZNQK+4`:J+T!67>;I+] +M]\`Y][RVBVOR>K85POMN"X@\$9$X+26#SN)0B.J)EW/M*]B3^BR59;Z&!G/W'`F2W?'Q#.KO]9-9O: +MK?$Q/^ZNV#HZFE%)"JZ<\?HWT,*]*/:]>M`"XJF\\;KEB!+\#B;U]8F[T/#> +M-\>UQ9'FU%^:.M^BQY-4DY7D(OT7^(-3O]1107#.*2EE!;*@;2?]^`$[>N76 +M.]%YGF=G]9:`>B&/7CW?@D^LN&W?0H5($]'F_%+R?#5-9Z:6C;>^DSJ\$['L +MQ[=?3A(`!2&=D^_51&*:Y(U'9_U"S@>1OK9FFHYB`"E];2ZP%JL!`!946J+< +MP#`X+Q$N[Y64)PE00#J/TX5%/OY(/)&[M8SE%_*:*H&$4ZO8D;WU'KU +MIO?'**$\P6"8V;^[+?7%W3W*IM$87-9L\P('#K:4NQ#?'PJI=`_FM&I? +M@XE3>BR,P+TQ$BFE-:JH(Z)T)G&[SYC,2ZVT7ZUZ<*1R,AE=NZ3]X[GI%ES= +M./$UUQ8LH6@2TNY;C0:,R=C?D?$IO80]1B^*B3WV)9W\!WA_)W_FO"CJFFD] +M-PE,DEUC,Z.T."ZJL&OZI@I0(A4EV#E[MS*NN-L:`Z8[/8.*-,G&57S!B\^] +M6.*9G$DO*\,^MX!\I''FH1GW%7=IX]A*U8C^\&Q9.)QAL^6&4:"#;+DL?_=*TZ/;5M#CA=U.:^TA$MX8UX*.&O$;^D3M;S8*A`/E-'A9-KN/P$_7>A_;]F#VXLO&55XV +MI[@2MU;<`D.TI=WY\RJ?HL-28NT=?TN8G!.W50`SE`]JOOR!W;-(>?61Y3QJ +M7W)7>'?IZP,]_G7:!BJ7M5Y&$O=\3`Q#J>P'8\F6..Z!+O\`&)O9,BC;'7?GNX2?PW@;[0U.CN66Q +M`M#:1/"KHH8X@I=\T]K*!8:[Z"3#$XB,07_FS0E-(N]+/F#*'7X>'=OU([&6 +M\JR'<4$CS>\?.*JG?)`]M:=^T*Y?NOJ3/%"YM2$FY5F^#Y=D@]HO@/_XH +M'IPQWX.&WJQS40G.K@:/]Z4(RN%,%+ES#\)`P>O4^/CR`*LJ[I."]]? +M<4^@-1M//H>;W+Z"9F>*>(^[3M,(.U5!;GA.#!V1X_BA((O3+PPF8,<$D^$MYZ--*]UI4)-@!F<$Y!-$P'$&5AL=E0+0B<`1$U;(W'7$MN.Y;@=Q>3W +MV26J%Q.Z`@^\9I'>)$],<6&DGGZN@>^K`XR:KLUMG3H_`2&GE:+JR%&>MLU4 +MTW2A2)2/2O#EF_,BGD^V"J1QRRQM08UZCN&%?9:!%S0[!(S)3&W35=?$6F*7 +M^MG@@`45N5E%<$CJ!J%D.><8YG'^2:`A.Q_E^@8"3W$HPUFT#GU#2#KHEAQ' +M\`/7<9,-WGB53-?X`!F$ADQ8YOY==>$MXJZV,S\U*OM:!;=6OJM"Q\)G$[@& +MM,]Z/O)H1!B@BQ"E_"U)J7BG%A@Y_=@8.40I,ZDKE7?K7,&22EOC>`_-87QV +MNI-].D6T>PL#^1X%WDEU@63+>J+6C*T\($3**4)#!9V"&\M.H7^N4Q*-!EC? +MA;#'',?(9Y(%Q8=D=0RO-@<]3(^I14^T\A*/0"5VG'H4=/#R6P"3`OB%G.:H +MAI2R%OM0XF#3G=GDAXPE['3AZV"EKB[9RY +MC`4>[<[9G"%"Y,0+-+,VLMM6E7%NNJ.$Y-L78=VE31?19XK'+Z,*R)P=6-#, +MH3QWZ+4;6MQ`FDFAP3I=Y!,;-#K=_5Q`)TY16EL,@CL;4Y]@F8N9RZ&(WU,[G3 +M5[+R:)%***G\H5G:E[AIP5>Y'T$M9J>)"2C0]T>[H$C)!4?Z0Q?8O6><[I/[ +MWE"+I"*F$ZDWT=P)&Q".J0TDC.714^A3[DD"O'Z)B=T[NJ.4:>RZ`RJ8F>>M +M9_Y^`PD@^TRYD/;3U1\@VBX+T$..G4%2LTTQ8[:&('E]SU1[M[+LW''S;$3Z$\N^5 +MTLS;+'"Y`2:9#5D%XX7:`U$>J8%(&3L`4$J3Y>?%+'V,K<)L^A!&'F_*1Z;+ +MBYD[D"@^F!J4(3DUP3`ND`29A&&)!C%H.N9;B-\^;]J"Y^2$&+F"[>?H?3*C +MB(W2'#`@:=-2(,F#\T;AA"<.")/08SB`29Z4_`P8:^4<&U?(X;%("$FTSEZR +MH@UO"FH5HL>.8JAGNW46\M15DB[SSK-RYUR:4G*MX=$48)#\36%AQTF9."OC +M'#`!?*%ZN22X0<[W+V75*';A_B9L[9I:RH1.%1NS51I1D""[8]FX^0%LK\!? +MZ&GEMW.GN$K*/HY^]F:A>F5GYQA'K[P,&_VLE.]96&L`454H3&G`EM6+XX^8 +M'&RLX,YX;@^>?[VS786%N1=P4-.!U"#S%PTL2!N`$;(W^"3[*%1[\4% +MG&?;Y<_5>C8^KY[FMB1.Y+'Z&!T^%TR2833_:?FDREL[8&^JFEURP?&*H(9C +MC,HF?I +MD`C?;;JO522G@;1H;I()Z.SBB#P63C'89CA7^7H?&7'X>T!,OC]=EC>7Z/?! +M_L:[*]:&GW\8.0H[230,5=O>YJ!]A>IS2/.H`AX$<#0=PK?S7S#KX[6:0M;Z\F<_%OK[>* +M]O$4#T@2/487C>Q.G7=3[9`T-<2PNFI:=,9;N8N_NB@1Q7+T'^&42`JH%L`8 +MORL*OC5%V[=3#KGH(@,1`1T@.Z8?]'NJ6K`^TCJ!?R:#WA+&\9.0.&1B]06N +M`U@*0.593>G-3*BYY-$]IBPXS_=0&$QQ#4]!,F'?9'(=><(U:512#HP0K3_O +MS'.-2]PI^P`4U:`UFWF<_W,)?"%T-7VWP&;#42Y@=R!EK4:N:*GL#GKN"[2G +MJ+!9R8:A#"!AE8(`"V8@[I@];%',PM2JW>81/TI<_!"9$4C*6Y0RD-=IZNQ6 +M4@9G>9$98DC=+3H0;+_"0/WC1U,Q@:W@!R5&5T:_FG.^W;\ZRA:]9"J0M@E2 +M_Q8*4R91^.5*U**%>!NMMY>8<+H-#A25&=#9'!^:):/!!24T^+8"]3^'2_S0 +MFC%@I;QL?&7B_"%%!EP&.C'S4Z:$I;$C\J]`5;`XP@(*]$(6MS2GJM@^X!I%WR;SL30GHQ<2#'_*S5&+M//-X*^C]3) +M*8(;'A5X7UT^@Z^6AMRKU;U6?SVU5[VB,JL(IE7P=!I&'?I#[(#`N6T"5]D+ +MU:[H)5.X^F$&3^&;KHL>:(`#=36W+[M:QE)9BBE=P=/P,2=6P6 +M6>T!E?1-U@@C$GA8E0R>Q7-2@B<\Q"TF7Z*O9))?Z9S+QSB*=L[IC6-#$-": +M2"QV&B;#?+-YT+FU[!?41E6%?IT1C3]6NZ0SD<&$,9NVC>QH:B15_>4D>93I +M]3(O]II!<)[CE#2%0/C4W`Y;MVE;FIJQJ`YC0*F'$UP?$^1@:KIS%[#QM?') +M[3]EE;K\#):?Q"9^9B3F!.C;7TYR!N:!U^'WLQ&N0P_2\T7:ZQWH1TR/!;:1 +MW6Y0W0[E.3/C%0U,IUE?,+\75!F1F>[_<%IUU9/DA5X-C1 +M:`4:(9UB$][/D%/[SL$VT0=$$S%(3IX4\;YW.G,TM-Z,\WI=-K4XB2M',HN' +M>5%>(Y#I'TG4UM4B,Q"TAY..]'I>96:BU+3DF[9&X,#8V#KZ03U+II@`I5K!#'#"H,1I%@JJ6@F*YP-OGECH%UC_ +MXKJ/65?@1J?UP5@L8<"ENAGR&404%#*'/\3!.!QZ;Z(#O:DSK# +MA+_6:%QTLY:.39]KO:%5[^K$SG]2C?%DVS4%C?9O(?.+=I23T4`N8F]Y&W-UYKDTY+%)6G:?=V4/Z12$CWN+(?CT] +M:\@LB&(@#$AT&PR87`@ +M:X9U1VL+;O3[4`H3HO`UWX]#E+70/,M;XW#M,PQE-8P$`R>M"OMU+]BI1;$87/E>=)%"/I%6>^-%`6$%^+^$LJ^+25?OVEL0ITETD*Y$6BV: +M_*+P[\8(!\DQK3#]\,#GS><(`(:,(0UUO\HPK6'4?;BC7]?R`^N)B_2*%<0( +MA1-&*])37S>/M9I$G^OK0SZAA\HRY_JRU;E++6TUR57PNE.+[&0-DB]=FC?9JS`2FA*;UI)\F#1-!6M\(< +M!\*`8ER&T@8PA!\C([Z$X';L52B_#-Y` +MJX#'061MY8"@__&-@_`++Y6:@AM!"MST>BS#*&^=:5;PAW]HQ?B4:QM)0+3( +M:<%7"?&`"0\:,TUMJWTF_@$GBC]R7I@"G^Q`N3TDVB[F$E.+%CIXB#(:'#QS +M#I`#:#._S?LNCL42>J41GIX94,\`OZ=Q[RLXQM=>S_#$2<8AAM6F#8V'=[%H +MUKAXI&?-!LM@A49.HJO:3O"]5T/+/QO\>1\T,PN46TI10,'\.&EF3P&DY35' +MV(DN=:#9'*F&GJ*72?8_UR6QCW(K[&,PWBP>>LQF/MB`_[(PX)/9PKJH`#Q+ +MYN.7,)WC?2U/]&ZV^4,O2;C0WR9:&SYVFM;+]E'I+D1X:E+.F>,9?8R+2H) +MS)Y[K+*787NH](Y4)\GK%%<%S9Z38*'9(>ZB^V(3N*/'57#(1>V8P"Q]U=(2 +MNTA]G%G*8N8-SM>38D.D#XHCM$M%Y;%T%%0+\K0YF%[-#(7/#+$)WJX\&L); +MB.U:EG%MX%VN9FQG%;9`-IL&U-N-E0M,U[U*7*6PWJ#ZND7V+*WAV*T6,O>H +MPH$G2LUD0M.%JP#=I6W%H7CRW-4;'!>P'D0*EO"V$U3:?]#E.'D?!]C*H7!Q +M%0^'`>$[5HDWSN5_\\\45[FGR:@?BN5&_E74UA2YN:2K7B\L3 +M'-HVZ"EGX44:J2NF[^F:&0#(\U7`UT&@6L68'EU)I8?E&]C"CO:?)RF=3(@Z +MFGW>^)3923_+03@-$3=E;-8*L$$DX_.YV0X)71J4W493D\R]:>H.DL6J8'`J +MS$O3^)>_A!+XO>FJ^,8KO&L\,AD3!6C@WGUVC[C"I=FL=MXLKIN-"DQ2Z,V> +M[Z)OKR>5&HM\B\/R]+X=DLC*&+P%L`]6=K]$-4G,60&?(FMG6,)2`&VSH +MIF!-_@X!_YSL\2+;#XOWGUN!\['7688V'34O!JF/5L[JC#ILK0ZS%Q0C-K>R +M0Y)N=\^T6.+G>H)MM3`///D3;_E;]>8O&<&0[J>9H_<'K@6HBV#^->/8>R(# +MG]*N;?F<2:=D>>8ASV"`62MCS+N!6@(\#YOIHN\7&F!1`V"Y(<`!(U[3($N$ +M8R>*[2>]V9T\;QC0)O`TEVW@/3&H9P(XO8LL:(`-C6K!N>]"!I]:MD/F;377 +M2J&JW:$APYD!.HT"*?G9SNT^9B8O;)O![8I#Z1CCBC1K42??O:PM_7VKLZXD +M:1EF"5XBG.H;Q;$_M!'*-O]E("/=CT,$7HJAN-.Z(B`AQP9W["VOB#1]V'FV +MWC-2`1$S3[>7)R&VI3;=_UU>AM^2,9(,[Y/64U^P8J@:5VX2&_=,,$KS4X+V +MMR5`BDY^PO=R_$]73-&H&":421TZNXE/WF`1N.*`O/T8L\ZM8(#+OH9DF +M&-_U(/T&G9&68?O+U>,/)/1N"7$<,WPKY4H"D*BKRXA/WS4)8,*+?\7=]XO_ +M2ZMD(2-L9+"T-_NR'FC_I_%!KS_AYBJ'$S`V4N3EH5SY@+Q9*_D1HAX(UT?] +M?$"6]4`A2=2\W',"J?L#PS5B&9;XFLW^@/=@N>K%K4G?D>`GNLE=)E3P8,Z0 +M'.%2JA9,OB'IX@P,?'DG`2!CPQZ_104C7[-F6R"L!6#L'(:U27-0NINUY,'" +M^T`MQX8X:0Y;UTU.H8C`>`"7A`W*TP,"V+1G4R'L(0RP-&5K/L= +M=Z1^G9[3%@:7R%AJ?\Q\-?6G<1!R;90U(1NO#D1]OS>[&M,'A`&F +MU^F'FT9:!J38N?/>%?O.LZ\OR438,VS`EX=A6*@P-W/!^_N`G$*G?TVE\VBL +M<8IN8H;9W?H'9I'4LS_$%X[PC'JIK,4\&UM+@1D';9<5PQ2OOXX=^L6?"8^W +M1E4P.O42GS:'[V*<1QH,H1430AC:!0UJU(OZ9BE<&QW03K:&#\=7<$J +M:SDE,UU\A"@FX=":'B%#,[`W@:O/WW5[;6P54=>CWTD@.WQDOH9O+FK424OM +M]MS!)3Z9WJQ:W"P+6HBZE+-#VT\O$BAK7Z"-Z@R4=T=PB2%M7=FY +M8['WBR1;?8'^44;A<_5OD]=(3#Y`FKH+AA=6F]Z?;,`A\Y=GD0IAB6'S(6:O +MMV&$_>+OH/H"OQ+1#ED!/*1/?4;YTF6W&>`+G9"#R]M1"8@D)?:5E$\1Y`;D +M_!0`<>.,XG??JVKG6U[ZKR-HL]5+A4!M6:[L/EQ&Z>+D8CBV'VFM('!P`<%Q +M!18[^Y:;&$S]3Q8MZ@CAUM=D:TY1="*'JN_8B$0P[G?L++1TY!`]_)?:].OZ +M-CU5]\F\6[8Y\(9<(1^SK:^!&:]R6/CB]`3I;=A0[0E,S^B]EKDI;1XBF=Z[ +M"DUWM2V.34VUQ`9N.OJXDO\=K@SU#".?_ +MM`]>`NE>^"9E"^1H(S,LL#"LU8!R><_1:$"8XIAASWW)AW&C&2(]IPX\CQG" +MA*KM#6578]@ONU(FKPCC1C09'%MYO9F(G;U&/^'P:;(R15BH:6;>M1#HHYP^ +M%O+9I)_*1%G)26(=BS%/W)^D,7A6*OPU"3Z$_?5/*OU,F'QT5NZ]:#F,T1A` +M>D_W&L(67644,F52]E_41C^Y8+ZP7^!*?>]+"GEZL[09SYT/J//,=(2W6B[5 +MTLH-]:,,F]PP<[_\WG/VSCXY]=T,:N4&#?0NT3%7H!+*JV^>?]W4YMSYAX1Y +MK]_\H:O$4>O2INBEV"XMR;N2I_=M1]Q*GN9'Z"[/`GDAZQG1ENE[T"<4'S5/ +M&P'8Y*N4DR#WW2%=[%CM_H6DL)F^8R?O/&5[CQ);";),E&2Q7<5)9:,P?'JX +MRZ>1S_93<@DV;,WPM[1*SPA6LL(6;YI&Q'&Z*$6!W\5-BHFD.R!3K-3YHYD/ +M=+0O!L<2:8J+H3$2D0S#;A5:`'K0$1M#2\ON`S@G=@!A`!LLU!!2&R@)[:7-39+WB( +MHVZY'T*5?9;2HXCPA``*O>&J!9W?:I1KUU%HJ`&&;/2#8 +MX4SZ_"/<-IS9+S@839F@9>2"=D`#I!E#>VR2U*B_I,8NQC]Q42+]R`[)9%JQ +MLQI@,O0\/E%O/CMIW*9[<KS^GRYB&HA($_\6^7.A$OAHAC,0UX($C]\?YD$1UGKQ$Q*4<+'F5_0#= +M.HR_?V=+?(4.;U@#9@=!2)3]F-^D9G_-QW%QOHFJ-R1^W-3P7D&B`BNK3FU9 +M.$G4MA!2%-D?+02=6AUZ@@$)1HO*276WWMWG`CR\\AUA+EP&?*XS*;;7X1FJ +MH3Q<%#<#[*WHZF>@6D?;*<*@YL[*2K.)Z[;AW(4LA@0G0.^\)<+A\=:NU@%T +MC`:S+AS9MX]3@*4\F^#\8%PNVK1^`^A-*R)@K;L^\I8_2OATM_#M6H"U_!1C +M6DC]$WO1,!4#-W`Q<546M.\#^JO>N=R1S'P(O^5UZ#D*F*E_OZB"_/K +M!2"3!DVQ19#0N>[W\$2"?KJ9.1HXU9A^7&%'3,S7`@%T<,S)'#R+MX`H(X_# +M+B3D6^TZ'X!@AM\@^+"0167-,G-N*<=G!,LF\@C#UP@*DXY]D0[OVR4@.F?% +M'0Z7LJ?)N$,`K6.*B58?JV`A"0C7ZDB?!.^7W:P=2PBM""[?W=&W7*7+EV8? +MV7L4H_H3S]S.N.3M^W+_83CHUW=V$.5CT"-^K$7>(3\R_;1O2%V5)9=0P58, +MU\.BL;AL +M>(?LA&]_.BO^>\E#:PN6&YNHB][^!E(-QVHV +MZ?31WD1H%;@K\KPS^?\MK:NW:`"PX!DKU@,1\IMBVG3769!4_O3EUL135.9V +MWVV#='SB65R#.EM2)S]*I[^=C"W$+N]$W>D)@RI482;A&-'OOZ.T)2`78>(H#V^0@UZE],)A)(,!KSBT`$E!%2AZ[0N, +MF<]6ON1!G^QG'T)M+4X5SNV1=:9=]2)TV`YFM"#RZW]"\:.-=/E_+URXTEN& +M)7"S")77#->8#,P'=/PK"0M\/*?-Q"JNE@\I\3Q4YU]"L=1R`^IE&J00EIFK +M[2TBUV7NJ#MDG$3\_":2NU/#4'@!9XC!`+DI,`,!&*3>UE=RH.@2Y'$VB+)T +M6O$I_X8P$:U%QD^!ZE1'<):&2*(5S=>:>4;M1]C#&E%B>U9K;MV="O2^JXU/ +M?=,S13@BM#-_M'I!#NQ$0H.-IYOK2_[9XJ]FTX6N!EZ/7 +M5S+8C&J`[S1Z1HZ6G0M]:,I%(%M:[/PQ[0D.[TAUWRM/EP_/0H;Y`XT_O(S[ +M,<2S[PS)N+&G'"W/#-Q!+RH'(>Q)9SFRUG4&]U$W07A85 +MOXN()\]_6TY+@)[(ES+>27#?^QWGT/W05.Y[JY\\8ZH]'9V[/%X^\"Q+&0#82-$ +M9X3,BZ=X%\%+S%BC)XLQJQCN;;"/`P`P?L[GSH#8^Q'F>&V^@)C!U`B:Y!\' +M9KAY@*[E;0B>[MMV.NUE[K8$26M!$I9\_9J)'`)2X`8\U@)P+2V#]LR:`V&+ +M8#&`WX^Q;S=^TJF)AMKTC^M$>=R2F]'J5!)S\,@,0P+^>W/R/6K75G.=:_\9-IH+I>CNP)6* +MM8`L0=BA_G4F+L+@G5MGR?P]'F=E>KRR[@X`\@\.Y`$;AZZ`)1[C6;SI:M`K +M$%&!S`>`AQ=#,?^GO\!>"'"%@AD"FB5)AZ>E0[^X?9%[?H@(.)PST'./&?3^ +MEJS:-;#N>D(4:>,H96"SU?FV5:#MUACQS)$1H1[VR6"3EK+,)>J+"1;W^2U'FWG2EE"J"[F&9:.0ANHNP.F.UE6&QR/Q%UVUE(!" +ML]^KL;6N62Y2]T59L\BHMGGW0ID'[:=%`W)F,@U\YO$"YPM]M5.\W=XH@^M*R%+Y%+0H` +MU+P8>[YR^VBCR=VKU0Y.P4%'1?)X?S^(F%71+TQQ)C%66+"&T[7J;6DV*GDQ +MD%642:#N00*&E9NHX*4(_6;[+-0C175(B\7I]QL"T5+U]@-%SL$H,*8V?U[S +MA:-YIVLJ$)I@).<02_SZNW_HMU8X[;EBYJM%"J#T/2\YV33M`!9.LQDE][]H +M5-27WVH/N&YE!UROI&O9!9;*0F9Z+XXK?LZ$&@%ISET"67E$G/S,3D[P6-IQ +M5V$Q%V=KSE#C"9W_QD,JSIGE`<*BA4/'65A?DYKW$DQA-02_'W\*/S[HUJW> +M4Q9]S(;9."1GRL9^`JZ4R^G*<5S\O74'4SNS=N<5G_P)0J9+*1P1]ZN_VWJL +M\GL?D^-4B&(_]>EA@[)`G^H(Y] +M9JOKXYTT+"/MX>_\LNR

    ^F1G3\TPUFG#[UV0MHT`.T^%=,OID6*X7J[.T` +M,D,8O&A#&FG(OWF0O;\G(/J_-!NE5T?PB"MDWE0RB?;5O9T5#R'4*(@^?FJ< +M*U"Y0$OY9CX]<>*[2YUE;9C3-C3N5H,)8#I$#"#@/0L!=+\'.(21>=!5,A_& +M@JQ4@WSW&M,XX>>W*;IF8[,YIZ\"!%F(^MF]Q$%OB>UU7[73EG +M_68:4920D6JQ$-,U[:6NQ`0&)-CYIP%DY7#5NY,CGK*&6@W&;%GUI;;<\0V. +M469ZMV8SNJ(%,0,DZW?7``,D0^[NZ)&;HV&VT96*6? +MQ&3+Y!@/DF0T<:/*%MDZSAENF^\:_ZUG92>MK\:%8OS1N_N^38=N_[\Z:Z*( +M$IB$T#U\!N%=NH#A):X@;-+JA@I^8%MF/'IQ7_!'H(XST,$4KI)Q*+ZWO*ZZ +M=P"T`/S#[7L2_JC:7YMKP5`9U=1\H-*:$9C01#GSA6G(15ZY"%>ATXU*=O$# +M8-)X?8=380;]NB5;UN)/!(N1!L]5AM2?Y2G=3GX/#^6IR':++N!&OSG:9?[I +MPJ7&1Q-QBPY:G5/";BG.OTFO>QHJWX.%9/_/A#4C=CG[:E.8YI*DY%4\ +MOT%Q.V4-K:X%$9@*U>MT>ZWKR4PH*@;+>(#[@1,LQU;EFSM(4=TFJ!%!2#:MW+'9G7ED`=+BXZ0C%$9!S5EU6 +M33-\;8F]6S^GS+NZMV<>]"2%:R25%4Q-^22E>=HF=Y5K7MQKN8JE3@6"E3?= +M,PJD10[P%;<3"R)UJXY$A-R&:P[DL$,T]A_ +M9WT"FXJG=R-".X5]\:\_PE`A)O&VD3U+OY5,,-?B;B^+4C%-=/B7`KIC@(%N +MC8#6XE"^=3EKB<1P^AME_.$%Z3J]Q$8QV)!F:DSF]E+QT@6C*-NHHWS0522YKE(*F*,&^"N+I92;\UK<3_YP9.\,M +MF%!8Q'.4:3/$*]1Z5VJBIM:B2=NAV`8XM!AM.P/H\C*5W2`T*52%=5@24^]@ +M5ZM[#SBXS9;GFYE]EI(#[?$%3S`SB#3N)$KT7,9.GS_\7A"M?"=*P,T6W$*B +MQAZQ`(=?)#F)P])+C5J/X9!/OL_0B9?CA$-S\1A(ZYL9/QKCB9A_YK2POY]& +MI&Y>4;ZK""%0&JFB#76:LB6X'.B?;#)K_*#@I=!3^@WX=3+BLMD4Z8SD&!84 +MW8JIZMT@$2&KV>BF;:!1;1IGE9%PWYVWXG:@J&,&T9H5[/9FER[IP](($F]L +M:&Z"`<]0V:PSIQ8O@>>6].<]U1Z\ETWJU\^NZ +M\FS="N@U?Q%\!A2DD_GA.@VZ#,]3W +M_QEII%7/U$-`QTKX?\\\9PMB),.&B^T)*UH[QF$_1$XVFZ?Z1Y4.-`03=B`F +M"*!>U]_-C&S1V3;+/ZD8PQU[BRFWUV,_"M98"[)8X:BU/N&U9@7TC%BY=;4P +M-G%1&0PEP/?SO_$Q.;Y`7)B:=^L\TZ\"_971\!):N&8-/'LPLT[@(#%M';L6 +MQF\A/O%=O]F^6?1&K/[(DITL*@(F"R6"@5Y3TGYU'Z'/S044:&RT\Z[A0"QW +M3J<".BB'\/)%"[#+AP7LQ\JVOI5A/X%J.0Q!?&5:^H?_FZEDS>9]SAJ8G$E)OJ74E[I(1X +MWMKR`RN'UQ+Q7R)CI>;'ZD!';O@P*;88ZCP^92#";[7;DK%;G6/)4E?.6(^4 +M=G/@.'NQ)8=9L;&%[X:%,8T?U8<#+?F_`=L/:C4B?[Y.>I? +M7_?![+:R8$*G,(*P^=IN3<0W:2%E*U:\IE2.PC'D'PGC0%T.T?N:1CT!%@Q) +M.G$^+4;$2O-#67X0-3D;>:RS,5K7QP0RM12DL!Q-3B`]2R]?NOX*+3R^5EB> +M6K(6E+HY8=2-CKJ(HFJ1H)8C(]XVLLPLQ5;U.'UK\:*Y%N&X#90K4;F95;=! +MV+(Y/L)49'?K?&5Y9834LG0-:FS2#5!V]FN@%$?89#A( +MR+4G!QYM?29GJ1C!7C;&<\X;B&(-FS&YA3N*!+0OFO.+B$5QEV<]S0V02

    &(:,AB1Q56/,2NW%ZVLX13Z*_'J;G +M&YDZO_RZWOG\SI\(S\3I(VP3.>W59BUMIN;(*6-H>G4TD06C;HT-N%^ +MR&CI,ST!3,IJ_B6=>O4!>0?-W?,19*G.,8+\W1-:<\*/IQ%/D.BW%>;ODB>Y +MCW?:5RV=#G0H1=="I/(U*LPV/7*]_5L)Q:WF=XAJS!P.:8PD]-P):X/T+1:D +M#0'G.!K5>&5F^3U)CPMD-MXI(C0EU@7*WX*$-Y2?O,@!NU\+B*0F3V!79R(& +MCOI,SQ#Z'7H=OI^"<=(#+6?"5JMZ&H[[I-*JU3_]O'AE&$:L"+.?'W4",O\A +MA"B.R789UF,G)]5JUPV]ZR'4"XYCKE(`_&Z$G+KF5?0;G0LE&F"ZEPECS$'' +MJ1[C`U2:W$[,Q+@P1K6\ +MP^R6Z,VC8-[=*7:E_T%F)(@%B'\*6'"US8ME\]?;T@@0L]JH9_7ICLT.C"%# +MH@2P7'W;C;D0/8Y<$+SVT%B7F;<^R0(D;-ZSQ>^QX0=,1684'8SB*F#A_<$JPS#HHN,F)]Q3'3Y(?'*G`/W*)U +M35%#AJJ/OLQ80G86G,P-&@4>4%O2,9B`K??88@@RDX)LL(X/;=\0]QW>*L%; +M:5(TD!H.M="%<3D8.\A@3*M`K,B]\Y:V+P"/S:XS1(_H-$:VY^24'JZHOEJX-@RP1T>,3%UMF1*V2O21 +M*-*A4F=!$]AW+S,K!X+@"$3$;Z-T]\FDN>``R6#6FZ'*=$U;K+](]"KCL=]3 +MV6PR9],4ELE0ZO/RA=U6:O*G6RTEH6?T/0ZHY3RICV6) +MM+Q29N51[?!^8!LM/:4*QE[4UKX1L0X=S^1UY_;D1&ZD(,7*+]3U##T'E+7O +MXO2&'6G+WRC5G7`GI+=7YDX&9Z#HI"I"/W?1#H\4YRPW`ENJU*?3YH8%EX@D +M)_#!)1*+HO^'LO)#!Y07'C5$41Z?YNP1J@9($TR.I_T$O +M)]!K@[>"F@)WITP/%%4G>2)8+'I]EX4KL6^PZ!AV:?)M"I"2#8S1IF83\!ZG +M(-*XZ.F"H@LS@YP47W?&Q?;"NAPB_&-LL3_MKE=8+SIO'N@)I%4V"$V24W46UI5+)(XG9$/$<[)'8.-4Q)KW61 +M`GYV9(C.G)*OKF)^TM18_SX.S]52<^45[KS*DWO +MRFSB`40Z,!5@6GO1DO#J/[+\W*Z80T880)9S'FXX/KO#72)['\NDY358KGE- +MJ"(EN8F1S7HTJN4?;7J@=\OX>1NW6"_J0SSQ!/BD2.QJKO-+JE4;5?^,('3\ +MIQ)^<[%5D3Y(*EXJ8+O21"$5IY/H'.&\W3?2+J>:BM#HZO[1UJ'D/1WR*&)L +M!7\5AS38C[#'FV#5_WWIP9<8,N\5\(4V]VK%)2''MXC@@6?08B;;_">ZMGXC +MD.(Y3R\8(*E$_*">&=<<6MRW?JVY'@1*['4<51&".*=/4&"CK"7F%K5<#[4[ +MI5/?NZO_P!$;XL1^416_L#R+/MT2?(]X$5;3-ZYP/FUR.7N\W2``PM6@YM5) +MP[E%LH9C_L]+&K*Q]L(&;.S;X3('^NXR_L0.@64I_*319OE'_T`9PMZ)])`Q +M\W>4-?EM1$.AZZXPC,>\*:->33_W/Z31Y,Q/&'>J<6CAE_YRB,#=1C?,0)FE +MT`Z7>D\%*:!Y]O0+4.C-+.M@7E$QG2%8,X.LU_C[2Q,46R$,;7Q-V6-_,_<4-:2$^\$AT[TF1JE$"*BXX%WW&P&O>?'$! +M:K+'+CG;)XZ5C/9VF#JMEK&L-U281V"+2;"BMR3@)O4?S[[A@A5![WX# +M#-A;NH>THR-R85\C*O`3T4!M676/59G^Y\P3IVR(?WNBK,AY#B\M7B2P/FOQ +M%T"N5GU4*;7)JQID41$G5@)*[=1#&%W'GC,;",9*'<-/[7_;R-L:_J6;]^LG#PY,.K)SK;LG!?2MIX,"O5)K0=X@.1YZQPT_NW +M`8"$PR[KB%C;'C?U-/KN>\@0-FZ5+Q9J2^U@UG-23IM9^:7*0^D$!Q^B!)[% +MESA#1H_H:MY&E%=%!/[*3FZ<$XQ=3B_/,VMY%DMPKN!!TOTZ[@#T'5<@'@_! +M.IR(''_;SZYEZE,&W&'7$MDI#0>^(W!/AC>,"%U-*U19X)JV=$'$X2%1O@N` +M4_!MX-(+:34ABHD7H]&Y26_Z\[8O?A$Y6E-7J*-,C;F4'KP@]0:%?Z2_ASJ7 +M9,[N$2>N\^%2A3KH2!S1IH:<'=96,"KQ?P$Z0O)UK"[72=37#_D0^P87\3;U +M)B!ZHPPU5ICIB2"_RL@7V?83O@`G:A.B*V"U)?[^[H[O?+BWK/' +MJ42%E880VBJ?.`=RWY4*T4)!G;)<2:E[6G!LQWMC/B\)EL7O$L&%?IRX(?OX +M/D](3K+GK(9@+AI%'@PZTPW2Z-/<^+\=A9.NM"*P$C/'E>@VNS>9CU+T(YH! +M14SI2"=8OL-(SS0P(X9#+/NOYAJHLJU5#^?&W0K)I"0=23[H"L`Q[Z+;#7/C +MC!LO<8OXO]>O4D;@I]N[W?B!!.165;0H_M[(F,Z5K[+@`@\E82=1]7602(ZP +MP:FE+S:N/F>&D#4C'?EEG,J+EHIA71B.1>JO^4H[@@='MWEMP=4?5_GPH]<\ +M`5+]48SORP1!5\@L!D;E98284?[_)<4K)N:9`):W"LDWT/I'C*!QF;TH5"/C +MLC?I5$H\.T?&M)AI$I=K!OS:1?VW:W+/G\NJTR8`YZW]J-PY5'T$BOL+<3(^ +MV^J9])L/,J4VYQH+$^MZ(V[4PA<&.&W_OHZ!WS&;DO(8K=:=2QUK.BO_0`9X +MO?7WPIF.3V/S?)5&8P(R"1)PFD5DV0Q?_(BIO,"ODY%QD<>1S6A,@SG"[G.' +M.,LH,^FIAB^>?AESY%4)H_`W41S,/ETM]\92U>86%J!7^B'<`P`D&F=I:F6D +MLV&SD&31VCFRXLIL_4U<5H_Y[-,W]Q'W*[HPP`3<.:8M;<#C4&;&,ZX,?+Z5 +M52`!L'80>=O\UR0]RLU@ZBZ"+['B_MZ8H;>8ZW0SVZ9V[/I+BZR[Y0-,7.16 +M7)*CFK40I)PKN0F65N5\-B%\N5X\VT,;/'?"_5[EJI(9.-X"8K9PGRB-:J)+ +MSE816?/8IB9I#GXJ[*4`A\8L5 +MS"5X3)A+B6(`HFE!8G*YU\FWQB\]O&;)*;M4(W#D?&RRY+`7!4U]8H=^_'+G +MT7&KGRM/9*O8=L=>(BOF9Y]*O-(=HG]Z925[8H&9J8RX9M2IG!`!/W@Q4#@Q!?MHRI85>'GO`**9=,B`I(GJ'!B5IP')I0L`M&G->+':-\ +M&5=8"05:T(H3PKL4$WS.KR!X\G`[>`FY-%=/K4>T99V]DJU@;4G?BC8SG)TA +M<1%5?J"P#>ZAL%89><'!CXJ6D^?(,A5$Z@6P5*:!OI93);=Y(;@8KNT^WJ;R +M+CVOGSA-&`):U!_4``*##L@.>K*9_W@&C1/3W/DI$F.,X_$-^8-,P_Z7F'^, +M]!@XQU]P_PL>)#+LQ/%)^(=E7Q*4MO?:MB#?VS@[YM6E:FK'34&$5#=:S5V; +M2JE*O`ZQS6*H/BEJ&G?_8?GTC/.N'T,;,>]$H"9JCL*%IHK,:7%%W-`[Q4VQ +MP02MGE*W&JN9KZ2$I#W73"L_Q]&A(3(3+YMT[Q@R5AZTF8:;'>#D?.Z4/C1# +M;<:`3AG]OIA+9>X,8,ZD`)`-J.DF_A$F7AD,*7^C'5EC+ZMJ.$QX3JSMM^!O1?A;-YITI6EM)50TE6O5 +M.NEU\9XN"@[I071[ZX-%;DOFRB..'Q2($KD"'I?>K%\7?MFZ^FGG=R>K0Q!] +MQ8A]N/,2N60^EE9Y9.B +MPR8+1V@ONY! +M\UFKIX8DZ'OIL3]0J?AS>I^M^S-_94W*I2G@LHV4$>_K6-2,?P!^`43U_,T+ +MP`'[$@R"%MVHARF81#MOI4DDO<@MVP7%_?]8K9DUBY@ZI>TP-R96Z'`GS`>1 +MU9I<%SU#\:@.&,SF6W[!]\@>$7\8@=0Q46I:>^G%3'<,B)4Y8]`[WE^%?D[P +M_.\D9T`F'Q`$7I;XK=@=-%>VKNU"!^C$G&Y2'\*PZSA&3[;5)0"=O"(JE9-4 +M`OZU)+B[JEYKQ>"^#WV022[=P#8"&7GI]A>X+0^?AU6\WD+N'YH&0"XAU3EF +MG@$@/X#Y$9$Y!G`2U&_.IE:QOI"LM@TDA)P##O01!4"GN"2**B4'67F7Q!"? +MD'!3@<"?"6CF(+S?40OA#>0SIQLH(HO?-(R/9<$=]_")J0XM!<;!F/J%5J%` +M4FL3W+M05'>7%IA7)Y$"\C^+3<$'-^U,Z+*BS8T)!N5:L#[6=@.;+0+P@" +MCG:7=F;3N[1@\6A&RL_'.0HCN^1=8L)'XYA)%*>][@/`U_L``LY>;V*86-7+ +MLXHIC^-_\=FM;,[_*:O@UWQ2ZFZB\*4/KK,HOZ((("%O),,BG]:1],DL`9%Y +M!W=ZKHASR-3P[2[1U]]D_D;LHX?<&=5,_KOMLGFTZ]!E]3C**&R\V?S1"]NT?6D=0N@I\K7&@>I/0Y:C48* +M<_.?]N6`P,T;E4*V7<<>_*'W?B7I&^_9-AR.GR`05T8P6*FAE0 +MQ"@]Q#O1:VCL&:>5NBR(+\.GK>N50%.IFZ)(K1P(FK3RA5\I7]FL&4PN6R8@! +MS;Y24,`G;`=!FI]7$DXPVTL34+N@T3`P^EF)?14R9\D^82^*V\6E,3C-:NS# +MG[^XZQ=E.R'`_F4%;D8#Y;$F+L&K`PRU6`SA27T#$4P[/=A#07>Q6RP&B[UX +M=0B$>XEV +ME(A30'H=6#+4P\VVP7K*IF[](*;#?4A"H59?6%)30WB0;K0!P8:4;YWG(6:Q +MQDZ1MR]M1TN+JV=@7.XW,L3VT +MY(Q+QB+HCGTY%)=1X:A)-QED +MY,&C:O%#J+K\MDJA +ML0TJ)^A! +M7_1!-7^B]ZW8TYMC:MVB?D(OW>7XB.'ZP9B2'G#"?L#=;UP_SC8W$?]U>9,T +M>WF"8RSC6C"U<:LR?RA-CHQ)JKAJ2R2X`H+Z)\0A2X?Z+3?+^)]_NCKX5VL) +M4]CZ#=E%`?+;K26HC2/M`2JVNZD57#8H6.TZ9W*_UQ@E$WJ: +MAJ/(-BCYU,AX1DA\:B7QPG[GV+F,+.B1"0G%_B8NRV7%JQ':O>WLHNVHT5S. +M7?ASA]62U11]&#O;P]DC6.@-OG8?OT=(=G9IY@S/=8_F7D[Y'HANQ47NE#5O +M8O*%!/QO\BDHB) +ML'M(N9F]DRL;L,*!.OEK7.<=@"8.])L2_L2$[/A,9=]TV5"BHP$D52N;%4H7 +MS!J.I:"75K''NIHY.=T..;ZD5B-I\P?"#9U/62_J'6VW]8*G8E5PVZ]$A##" +M/U0A;$1A$<78Z!V6`V>TRG"!X`0&_!ZJ2!EK$+/?[RC1O+N,HCTU +M%M>@"G)3?NLYUN7"5B@IYG;Q3/P]\ECCV8]`__B]2>;U3Y0X-R513LPE?[_N +M1__B_:?FI"OT/Q;7$Q`ON<0P +M?*FZCW1A@WHC).V[6C(TBPU_HX8=BLV^]\-'C(,/F''SW7'3--SQ\W4CS9/D(\<\BB[D&,RKMIDXE$?;2M'AT1+A36&B84C.S<1YZTNM=VZ#Y[CO7ER9@;!WZOBURS`-`3P?7E5,M5"L!9J`,[9-FCUQL?#JL(FW2?'G, +M$4'+H7_8I--"Z69PM*V7,U[AT?&O#G7^U0Q.AW_^"`;(:[88J'3-_2#"?@;N +M$J_/?&91L<&930O=#NGM5379!HE!3-OJ/,,?YYQJ?W9V4-H=+U&%#K_-A9[^JRXO +M[M>Z]V:%4R5RMN6PBL)[D)'@GDR6\Q295'%'!8LDKT +M"L.?8-UY5(B(S_6@NU79P"Z"HT/GQ'W,)5E46QQ.T?XM6^9!!R;';R2U=GOU +MXLJ+\TIUOANF&:3C.19VP>3RH&!T)+-"JH$@I>Z-*^4XX0?9D\]"H0_F-+P" +M2SM&!NG<7@FIOY;DFF47>\Y\PG`7/AZY#B+0KGADD'(:=5P;S"L1C\SF,ET( +MUL+@0L,].LQGH+/I](S\OS;J8XSU`V=#H)C6:++XPY?-3[>Y[I9DZZQRBX8F +M2#T!SX2C&^8?)W1QA4P"R@?=0;,4R.3ER=JV>W2"3K)UHU0AW(I)XG!.J,K` +M7KP&7)Q\-;TK6+039GAL'2T54M'FTW!$>'A",-446@_W$!W)=NH$(WO\;+BJ +MED;Z7YE1;WMCYGT-JL^49/9H#R^%'&)YD92SKR@M?(;U$'"7%U<^@48LB]SX +M[TEJN>#Y_2)EG-*PHO!=@3P_,40L['9-*D(CXGBHO&Y!.,SD2CA,_^/I51#'$H9>RQL;"0P9\34( +M2!'(Z0%9V]1NRS_`BO#;\FHV?('Z:M=Z:F9"7D[1.%73Z0^;STK:<>6R\]O? +M`1I-'E*V]H#-QCLX"H_CJ4/BFIX,.!N__'IV]^'7`.QKU:/T5H5TUBZ;`<$8 +MW?>:Z&8XFO.Z7>Y`^)FZN+@+_W,R&^%K49JG.GT>W)IFPW&0+/__2CGG^9Y^ +M7RKM'(*CH?CEHS#TUB:E78]%M'#4CLHD;X]A%A-^:+0>2Z2=QJ!H2'M]9C'F +M_0PXV(QGFV2%7-SW%`$R_&X4MB4AKGIO8?$)VCHXYLF +M3:MP1`\SD@B.:F71`6OMQDHS?H>D$SN]%(%)H8_='S$'V[V6O(Y/?Y(QE,['HKAM:+6Z__CF^S[ +MH(J&5";P!4RC!<2XRZM/`LV`\-\#-2,/>,L-P'/1.O+4I"RGO)/KH[W#RP(V +M>CW3DK+Z?\7Y)])NXQNOQ/SJ1JPBK>@:A3X!OR-\'AT5M2U4;!SX77U?^JN> +M6.QQA!,@U\H/)R+2RKEW[!1\\U`6P8&QM5@I<=SI-Q@]X5_JM8`V\4J]NKB, +MBQQ0K<*-=3%GC/U)+G<9`;_\UI@=?&V./MW!'R:OX0"!K^Y1Z3]?">*$6+36HL:,C^D[,ET&V/+W +MOC@JC82%HJG=R5?BSK[H#<*(MP9GKOWE"0%*S'TQ[G(2E--7K",DGB8X1PLGJ[U\&5C513>+15<".KE$8 +M_B:>I1=%Y;10Q=*%SPY-\]Y$[CJ;>IFX$&T/7UYB"#=6$W4)Z0.B-H8-C=DH +M?KFBYYR%RYL%4Z[9:5]%3+]V$J3PS6#3LC=7$6;0^MBB^T.8F9N*#)9IK&+Z^8MNR@$0UJC$[EHQ+G&UBK=MHVD>>>^7:BG/0UM4FE_ +M.EGU[=N\D(\I/`T1\DHO+B9]V@!T,DH#!P">NH\05R--@K'U61`@X9PBEW!? +MLJ;9FI0-NTY'4`4:_!8Y-YG*V_A'UU_RM`N3PRX>KN&K:7_R&X:P!:X#Q +M".I:+!R5!(QRT"(WH=2,:,('AO!=Y@=''I6;.!S_"1FQ-KN0\+NS7H?B\F+C +M;V45YL?WMNMG/*G!0V(BRSI]0C0%(&+^)H7BZ)7ZL4K'=! +MG)]0L8W;P&`)9"O6Q%0"S$JN11%%`>Z4"K=#R>UW:/6)0T=B_XAX$,^!!5:C +M/`4F5]#=3:8TYM"3W&T2+Z\7/EQDL?3D"EV?LYGJKY"P6O&J&2`^2W"LE$VS +M.\\V`:R./"5UAO;GW]UFE8_`7@?A`G#X-N=41*?S=W?.,N%O(\PHFG#IPP?T +M:F[25EL_HAMEG=P/@(V!7@D:0@QC:^$F<+O%Z?1_;9<-[K]")8AM5]O\3,IV +MB'$-6)FN,VO$D1/9BKP03L#-!5APO]L',YS\)8)9T`9(VNX`EP*X1\`#`@Y= +M#HLQ'=".;=Z%W]B=WU6X5=W,ESSFK=,`>H;0"[8T$V1V#H3H`U&$RB`0+<6_ +ME=5O[3IG(LK_3C:KXNA)CA]V^WU8WN%`WJJQ/%?%B5<_]Z_4$!>!2R#].%9) +MD\>7[&[@>H'.83>7&!6B:V+_&,`PK&+>8(5K*1)<%%2_]4B(:NZ0RG-6C?'< +M2&5<(-FY`87-\Z_%9K^]L!3C&M=2S/@>,22P)9'(6N`BLGJ"<87SXD"RME1\ +M;G/?NE8SX-A-)0O>BXVI?9ZG9=#!BNDM2,IR("!RM +M1E_R-'8:`AOB5@8)=#/[$>/84[Z3,ME:.7;F],;NN"M`H]6!^0!T(I$FJ"4X +M>E1'6:[3=N%!L!2^VNP_)68V!U#H"@+JZ,X2QU>-\RM/!*I7E5%6W8%07G\Y +M8-GNT&9/TW$;I(D9&:;C,:L#.U+OC]4D^B+`2TC*N?`3/OG1F^^UH@OWOST% +M=(H4I0.])IDF&P2P)3Z5NUS`U*>OS)[G,L>+N<#_R=4"J.9ZKDE;-K,@H7M[ +MW,%&"0'#DC^J1;UFT=45!TPB^;4`TR`V0:O\F(7D-:6) +M1[L59YM_&?O\CLV_J,',/.OP@"DC^CRTF0]$SM1_(GPJ5C?[CX*/(1BX^XB! +MWW#$79\+;K!YEN@0_.1Y4K1< +MNI-6=P`H-U#3CY^IE*LC'D#"YNF&&1B=FSJG7O#N6(5"[PMDY^KSSV]?NP$5 +MLV-4F;::F1(O&H79.&^V@V=[FG$'2XPZM`W,6E_TC'63)(\:^WW#FY^MOT&D +MX>8=L"\4?;>?%,K[RCN(KPF$1R$_:>;/S7S!VP]KK"A +MPU?@F`7?2V(V[^TYP"P/,A+*PH!.\MP+306O##AHB*,A)+YY@4U@98)((*B$G&3#)+YTW>W0W7F)O\99G^]UP6!R766FNYSB\?`V +MUF;;%P^?*)SEB!MFO?+TFT5978ZU'`N]J]GMO[""BIQ)L>V"E#%>ELX9O)?G +MY.)_O)O^+0L-!%/G/)/*UN2D@\,&5K8/@RA'J.%4EENZ%)?M/]C<^SG!21#U +M@YONTL$_Z2ZS\I(Y1XM:$>UW&:D<$]4#/"DZGYLZNNTB\)=4F244O=F"]_WK +MCK#%<5//]`>?S?F9M$'+)L5,]1\BS,=@)-IV5WF@0&FZUN!5UHRS+X>[N;\C +M]K@HU(M[=E4U:K8"P!IA^7[JT0DNPH!BU!$HRZ_^:5$L*4H;U.PM*ZF*R?2; +M4,PM%D@,G'F6?P*7RST9@6+]X2\B'1!MA)#D-O,(RT(O28\OM<=GR>=_+=`A +MV`(YF)0SO5Y"$F5T[`V%,:*XJ)SD*4!^0V3D>251^$<+Y9*&BI=+J:%AOS;_ +MCH>,FHWI.W+(3)B@<99QFDAJC'!!)I'S4@FABC?$U.]::@JZVW4"C-[9L\-X +M?I[5M7LK?L'FI=!2UX'TG-7*K@KP+MT-"OBW!%_18"D6YU0UM@)Q.DJ_ +MK42U_K(1"ER/.0W&`N=D;L84QA$Z]0BI]R69PJ/C"C1),>6XNUNL[/YJJP_H +M@+]SI=-<15BV'-J;1)NZS9;J=O^GN=:)[75:=A(XTUZ=_4``++=B[7ZP(0>$ +M*Z]E+9F='C5G)34;OU$'7=!`K@09Q,CZ$%UCG2O>_^+R@!>]CU^#POP0^V\M +MS(R80MZNV%3=(Q,5;5^4'.,T+>N$NA'<]%%QP!J&QKB12<%4E<,Z^\!),T&4 +MQY7N#70BP[4&L)@[,5?-R]+P%X6G2ZJO-9`/[O7':["Q@JJ>@>E`=+7:6"-< +M,H9M'=EMPE7TS3 +M<6$,:-S6U8@<;1,*S6$%&O)+N2AM'8N_$0@A/"G"X*1ZALXDAN]&82X*FL\Z +M;KO_BR.)S2GIF:KRWZ"OODZ!)N/>6:I6G6UVN]5;0M7\)4O(XZ.-<=ML!8Y4 +M+<=YE:2ACRQL_!>AB^M.E,TIO4E+&7N"YU7N=4Q2B7J@VGO#TRC/DF%;SHY" +MJ-28#8O0QX]ZP5P(8_Z"@M>"*_BDU'1C@"GL*,B>H!77U,ILH_9]-00 +MDTSM316[.G)^S#32U>>B8=M'0)9((FR-5%X]D:IW@GBK?>B9\S;D'<]$&E%P +M\`\8.4D?E_'V30V(NTC^;W`T_9[P31/K,QI,ESX--_R4O,%&Q.GM" +MYP$Q_RT1]TCXQLD2!RDU9$3_(<(`XHCP9I/Q^>XG;Y/6VRD+952M7$:)5T+! +M*%E%;ME*0$G_A$5M*WS>DUTG54U=[BANH_8>_K":[[5UR1H'S"=7\?"PHC8S +M<=$H$K[7P/\8D7MI'-Z.4F2_UV:#=+7?HR?M"9#S95R2:V/L)0(L,UU#_X)9 +MS[IK']5C+EF5CVZ"2L(^@BV@J,BE7;`?]^"YU]4'207J6NWL$MIH[OL'HFO%Z7-O+05BN:4A +M6]8_>E;@G*%-"BTR\%KVD=OZ2UZD&;E)&)_T]4M.)1]N0%J``);A1Y^7B5F$ +ME#4^1H@*.4[E5!19,9N_0@[E.1.G+O3GQBI@`/VK*7D&LD/S")J!GCX'_PMX +M";,)[ZW=G3:*J[S-?^;^7"+*:],8(9WFO^)&,V]#]FM/)T)%U^=TH(WP$`9R +MQ3PRFN2<#EM`9?$B@>EVNHM.K!1<4[@>L3/S8O?/#_/&_11Y1(DSG!<4KGZ[ +M\N1^%:$^D4=&-G`H(:9%S#/6$5/60]=M`SH3L^ZJ7;3OK3DW'!FS0NSS-A9M +MX'14""-AA"$POZS6+3V@@0HB'W!0="QHS/!A,>A0T'R)]9=#Y%%%W"GL4D`S +M%T(H,:J]H;X-B`*R0K,54#B\W[NP/VA.`F`^BGQ@&2)CV]FUO4AWT,_--`Z2;[I +MT.=S%Y@*>7_?#O"#9S)+>)3OA2U<\*^5,_0N*/RC.RZES9?.$_#34KC;WUL. +MP<4YD/(BQHPV0=]6-?$_12'0@WG8'RT77SV3Q3+'=)BAUE<.:IDM="FB\NS+ +MSTJT7.^XQBV1ZP:"9C&$`&O(X4[D%37-MIS)?#V1P5.GL[VF%XA"0\1VGD4+ +M5(P-3]8%,RAXC_@LJ^E?>131F1C=$L8?WQ4T,H[^FU?[L)PA"-*R![>VM\WT +MZCF;TXNZZ%S\5WC([+75;>$0(7+0YS&Z2YE7]*B3.IK)NCEQUII4E[UH7"=N@Q^1/2V.N*O6Q-6.74L"XJT''*%)G$Q0H9@G$IG]SOYK\\G@D$XH4& +M.DPE#LI)NQC\O7NQ>T_O-NIF/CUW\)J,..\$2TS,=DK/YK`[+$$/MHIGM2C_R7!UP +MMS_=YLFO4(M=ME'-I;$$?RL9'*BMQ]N#T4!6TM)U4JVAR,JERZR&]C&8D75% +M&!55%W[Y>VE.Q]:W[Y_>/,>V"];AI%R'P#SK,X@WEJNL5)CR54V(+;$^-@HU +MJ$,X(M;):&!WWJI2AS\&B?"LOU:Z(X*SGS[N3RU&D8?V>%9I'1XDELHF\UGUF+O7S@L-+@;@8(F-U>7:,$=63DZB*H)L"Z3O!+W2P-KM]'A\_9D7Q!DD7541\=JPWAR.X>(OG^>#GNKC`.YCF+@>FYHAA +M?B(-A-F!#8(U3-5^D>7(#A#ZI<`_+&6B."&3$&WVN8A.TS:)*X",B?;UR9>Z +MR-P3@Q#?*2(7+;+97OATSPS&7;>D'!+$,'\Y(;/[`;SBN[ZF%OHIIFX^EX/3`C6A=L?A[S)]*?#D%2>3Z=;8=ZR"K1Y:`Y2$?WE.\;65` +MR:`1([CA5-?JY8!B+.U/]&#U*94^>HF(0%G37F0"+-/"A0;.K\=U;ZO9(LIM +M_5W"/G'``74W*56I9XE*\)1+>I==U=)'5*X-:2>AQ%K^)>H+#I'4F-P4;UVI +MCM*`^"BGN4C*.A*:+.I_M'=_[CA6Y09PS?`AM'28EX0#'[=.Y`ZY1%Q>4H)- +M5ZA_2IIWB\KG#/K'$A$Q.8)QC*%GV9]HM) +MQ.CF8AH8>M$'$!BBCSN&B`0'I=DN:-(#6+SK&B"D`-G@]5#('>WP'%"E4S2Q +M9VPCN1OA3H9_W2VQ4/TMN\66#]3W;'7P:Y-S<`6-_J(T*#0\2!0=C0Q0)ZB' +MKD24_W86/;8RAW"8;_(Z#Z`%7/5"]M^.`B(%$\$!0.%M6^,,ZCA,$0R^R(E< +M=1QB3@Y1BLC[^P5K@@;B#D*]P3CU,.;9DS79]4=34QOY2#_4\+-.>5B_&T-T,QM+6?2D4+Q&V_E\-&Z:!4\,![).&U*L3*##/I&`($,FCG#_LG"NK%M"+\?-`9Z\X#QY1&2M+.]` +M"J4I3+W?SA][=C)CRJ4C?3F//^FH%`W`OPKK'CH1WY[$6!59G%6OH45&- +M]+[BW5JA)Z25G%:UHI[=K]$_R;J@I3)JMVPLBH]R4_\)PE<$L+A)DU<\_%]B +M#.MSS"S/:;3HWIE\3%`T35NKD^(0U`]^YJO1,*]`WI4KNP>VE)A$4_I'+P0, +M=IR8-:P-8%#U89RM;WVCZD:""0K^2'RXVIHWTHDC1)F.)#BGQCLJ4%V_9)ZE +MZ@)O.NSA_" +M\'UAMAP0&W6"C`N29IQWM#29LL@JX7;,,#%!!>2E%%1W@?^[SP^J8N)#2_[Z +M`SYTM(21`:SX1-L!:0/,&^#?<0?YJXPR,L,N!$5MYA+M"+CSLN%Z?)7%OR/L +MUH+@[G#-(!&\I^]WQLZ;!=R?54J7CV8&EUKC7]T1`XM8%(03R@V#O_UKJ.]K\L>"?80 +MQ_QGD>PL^50S]9(7!/AS,4>^!"3`)@QI00KI[%*`,6N6.OH0-Z'H`R^7@D/<6/L15A"1VY%EPE,L[3*)U':]<4Z+RIT +M'H.:,!6\L,/L/C?;3BI7N*2+&PDAR:(1;(/=+#CO:G-XW+#E^'4_=%S1@)AI +MYQ?0:4FQ&_B*N!-+V`W%3%DDW\J0RZ<.D\9R1!2"GNKW;!BT34&B>T\CW[(3;D&6:/_-32_'SE_VNE!<27K>&: +M1M@CK>!+/QFCKWK.#1AL28DM?@662`YOE!@NK>PU08?>3-^^639Q!IZ@<^&B +ML/:=C//X9UY$RAT@3>&R[T_W%H*EE"`2T*\KL4C+R_9C[[08B8"H22%ZCLIM +MAZ@U=M-B5FDAZ7\NDB'OLT)>EH,8X8J3BQ*8ZJP1G!(N,JX271B!"WKL`$RQ=TOM!X`G[P\%?,^67V"N2/O@;`\3W_?H-JLA+H_X*AP&Z +MMRIG$#0!S,\O^+T46!5!FP'OLN$B\#)2]R3CY@=B?Q#M>GZSM[XB/)`AE4/C +M62KS/2PN3DWREXWB&W,%Y)"?+SQZ'C.8R&C@/_R$C3*1[`N$7(P7=;M7-U[K +M-!%,\-=>2(@T(XQ=E16O=M:A?=9#5I55K;)%@+5$(P=VEG2E^?N7DAM[`LU< +MUFY7YYM]#QH?(X&6H=J$8?OV%>>J:3HM(*_+A8C)Y87#>TR=P98W2C!JN+WTI+#_/N' +M4#2;Z"N2WNX'P07)/OSL%;Z=.V8KJ.55S[!?S]TA0@#"8<*FI;TZB_"U=*3, +M_7K'M>V2\>@Z,8>5/OY38E1!(1,]VS8%82VI5JC-'YL\35_#3CZ@G[2?H2(8 +MC23%NX^1`5P3`*FG>3/65T\,!76=^E:2"=L8U[CWM'4EC[)9W#C]Z)\''G(U +M]%12UKY,?7 +M;/FX:RAY6X1\SF^=T\>D`BRNE2#2>W?8VY>QKAG#(M.D_I2Z%5FW*57Z8)O5 +M`YXL04+)TA6`XV9RX&=0,N^FW+JEC`3*6]0%,9)?UX'JG)#]N!X2>/&YMQ!2 +MM#?(#_]I42\!^.S!NN@(:8X@M6D$;W,P]ML73O`\!MS.5I!!VXZ0<WX$\"7T$$&S>\4Q)ZCPL,_8H@M:W*#&SGL:Z]&Q`S'CYI&3MP"HVAR7>C** +MEB4'F]4_^+P&=+^T<0FZG"8>8TSY%8XUX+)R]-`A9N;*;]NTEU^84E38>V`K +M;5_(JEZV,V"[["4>BH29Q?E>6].&_?_RS=+!EF4MKFM$-!*P1"XB),24U8`S +MG*^&,`2T)"91<4;FT!"KW':07")`>C6?@CKUI*:_!PFZN!V.5DI^)"@K8F4; +M:7JZ#@2OPLG%S>C+@(IBNM0-X7].M#`!2UH%,-"\X\+'NY@-[P6F66?O`A@Y +M4K//]65)5?;5X +M5CSU)I/3][!+?NCW,[6(RND>?!.)26^KB^:#"TSEVZ^$D\JXGP8L]YG:N#,* +MNY3_.-XQ-X$4W==2%47J0NQ&.*CN`=46)@4`*PS&MS!2VB;FY-IA*J4+'R#8 +M;5C,+F<^._ +MEUHML^V8GVZI#PGY:60RO=FP$)$+N&^F-B;=GHFZ0(O`5A2`=P?/3@MX8')M +M`LHW\:LT,RLW!S>HAZ=+RMN?''LV1D`#_4K/`2/]GA)2JG\8DK$YT*@\'^=$OC'@$AWHM,]L_N.4N^.?EL8 +M4SS.;ZJ"_(H8BV:@HVW&2=0S?L;OP9F>Q39_+:PG>9I1;9`TGG.$VE;![0[P +M5D%?D+;IGBK,+R=+A%7=;F04@M0(HC_JV#U:LKK0/"YIQ_J^S4%<2?8;!P&R +MR4%;VGQH\:B?7X,.YNB0J="?!>IXC%:U9GF5LDB\;3$S8-V< +M@WD-0/PJ0KNX_ES"<0X%\L-*1QQZ>_<7L6_Q/3ZH-:30X"@B\\]`4/\V&7*22(W84O[M5!VM98LX0FH.'A>'1#=O$5LY8 +MT0`-P9)_,.))UXCQLR5E*[+B_"?;__LJ1 +M=//Z=>8D?M^N34OC37;=F803>4,2,1O(NA`)I6+0B? +M-[=-3>;O:%LL@IC=P+$QXE,^,%$TB`EE$65[[,FYZ!%%T_=M[#;-8&];SVA&0R-+SL9"KIW&=D3KJVCG +M#KMF2LQ3*[>\#7QS'LZU$T!(+QW,PI<$#W!RQ]O[E*!QV\%3Y433.,):28,^ +MYQ8$EQ3K$!,A/M/4S<\L#=2KR#Z!,`N3C6_-P,C!2.8@^@3E3<"Z&P@!`()?W*/ +M'U:LX&*"99H>I38#K.==7\2(TPB-XI(S0F2=)K(80).-_K9GZ=#HR-T +MF?'#LET]:>4N2?)'YXX7_'#5CG$]Y5QM>5',4>AE06.IMX +M4''U,)F.?>:HVA%(H;70H27ATLM-@78_YG&[P1U[Z^)Q[I_N);I9X^W`,^CE +MSU._36MV<1Y2*W<\"U!M;4EO%>O753O:]BSB4Q(0TO +MQ`D.;7`8?R0^($33=UYYD0RR=F:!\%!EI6'D?Z#,Y$(EML&)%\,^M!K$5A;A +MX.'0E:QL)U[:+RZUTQW7YC$?D)\PSQP6P#MF?QA)Y3K?_8V,E]*0!NLZ7M'M +MMRS$+LY\"^LF2JU/O0R90AOS=@)@GRHE9!>]XE?*W2E\:3%E*43HZ +ML5#O!LA"C"\LC2+PV6UY:"O&@;1=%TT-.,8V4]K#G"_H8+#L]@0\-S=`!;Y_=ZM-P2L-0&ATAJ=#Y5AN>!\'I +M47,UUF=_QA5>\$,5=&WZ*>KNEF+WL#U>Z+3R%-:W?'+0K4Y';&KH)3),+RF? +M;6D9>K4&O(>YM$Q5%.7UQC,YGFH,+7,0`$U$7"]TRUV5FB!F5=']FPN6F5I9 +MNREN(UGK16,Y?!)\\;QPL)TV=Z_7)=N7T)]@,^W)M8^.`=>^1 +M:6.D0M$`E.V;!#W'N,1!I:`L<<$DV)F1PQ:(77441J6OW_;>*Z&C(:;@A0?5 +MU+P&L.B.6Z:US`W1A4E'5E8S"9FYOY_R4&MMY#X>[2EDD;SI/87>^(+7Z386 +M$(<.M&::XL^MHM/D()O\0-5.5.N"N.^.3JU6Z6Y]^0982(US[.V&L +MDE[85`$F/.?5P!]K9T@+"7R$4-3RP""[`-4^.>YD77V-PW71Y@>P6JZ13-7E +M,VM'%N2V#75X3,<5*NNFCS.?6#"0_P)O;7`6TQ>8#]VAW(Q<52&Z6NOA$Q+?,%SM5>;MU-MG4<^Y8H'8"B2) +MDJ"2-XG.?CEF"LNFO#PWH(BO"=W(#?591/QS9DG966[F9L>)^4ZD3/,/?&`F +M\?)00EA?IO,3;OP`7CO^7]!/CB*PQB;7K9F&_C8P-`[$]V*=)E]^]\G0V7#? +MYC64!?A,G?G$.8DN;&+[I'GMQ2173%._>9`8R^0:AB&\M:#-"=OC6!5$8 +M;[7)I8?*L.%?)T.H]XRA+.D(:-W=*7C>-">$"V'2:Z7HU.=0^R +M:;-',/N^^ZR!A$BQ#?)&0HH,AKF7BGHLH(D23^:-<.S<$DZ'8GTTM-LK]G!8 +M@^'@3K].82_72YHDZ:/(6'$"VL('O8=LE%5=CKM&!+BP]HI/J'3/``8E4"C- +M*I9-V6KN:U)N``^8Z8UR9C.U\\6*G.IN$FT8K)+.BE#\YI(?W__\M0)8:XLY +MCU3=(>[)$AA4U/?F>2=69:GRIEOAT)P;K]&ZV1V+K$/F'J0KD"OZFV)WI'3/ +MI,MT(,6NY>N/JC=-,>=R47?U"XRIHH=R/PC*V9+8O*2$FJ[S^_4=PRXQ57A3 +M/()_]57D4&-RNH.G;+5U'S9.B6N$6[#%L=X#"YF[]G(?!,E9^'(1RZX'7@Q5 +M,)A`KV+^(#68`!0BWD&XIQXNOTV#`W"'M=D;*B0W)IB(W@+LU\$G7/WKWW$> +MP<7$F.2&AF35SD;V5_\UQNU&N^X@6CG,/3K,Z`-_E8"(/S7I;U]@T`.UF&9W +M-Y*3:6E,\.`>X#+YG7P#')VQBHA:]65;]PXFVYD:.9JJTG2='LZF$J[W'*(\ +MFHH%(,:C_U!SV_!NH8_V&0FK`KWW#N19:E9[]Y=E5^N8WE^80JHQW^9FO>68BSR_-\";)GIC,57`6$;0UJ@U@P^`N.I^WIH\187"\5LQ0]Z\QV`-@*/NK3@!#).54MP_R.JZS'( +MD4/WS[#^;O:&CZP_N9%DBL?OF*-T&&C*%Z=779NXKN?#D()_ASN_P^,5V:>) +M=X4?(66JZRWGZ2E=++4<>5OF4I2]@_#=R0^SP->&M&<$"<4%0/*W:DR;T)YW!AEZ$Q&$05+28&U)`.,S;D$<.1N*<&7*7T*Z+!'4J#_YRT"?)8B$US=DRG^QJ(I[`D?QKL!L8Y4#AAHK$RO +M+Y_7R8:&J>IX:>8ON`;6=N#4M$Y+!.C10J&:152WL]P(L2XRZ7WEK[1_NC5`^@[&]\2)KYLXP?0[G2 +M*C1E9G*VRT@;`=PH$ +M2!@R$*]%5$D>--I8/+`(0WP.^L3S&>O,F:-)/3!"M,P1*F-.J_)HG]E5>?GM +M,G08D*6KZV5S$!;C.%[-"NV5H`%U8F,#E0=^3(L^. +MR=/IOV20TKYUAJJVIHP$;I]O`-TM&Q&`F$]O_90O&7D@N0J1Y +M4?[D`]L1^7[`V\H[D/Q?V$F]O*7E209(AE8NW"*`X>+%%1?FPXN(0U(M##9V +M(M^9(5366T#>##=5+A(L?Y'NK-3%&K=<@\58`0?/E0@R,*=)1@6%/YCG`$FB +MJ\35'&RIJP=7.L]4H&&(J3N`Y#'^2'_H\<*.03QFBV],N-TUSCTJVB3I6R?F +MC/8D81F3/$(DRFICIGQVO'0ZL(-5XK(XU%?J*\7T62/+_YKRRSN"U.5HUU$< +MVU;FSWIC"BN7(G +MGWKU$IXDOP,'8):^U@$2WM9'8KW?R3:R5`BJ!97[ +MIKG,+9G\B_Y@H["F^FFWQ)U8!_V:0S-X.PNE8OE!>R"FA>BADVS +MVXS0$O]O;:0!7&, +MV]8,S%@6S-':;NZU]\`@XX.#^2\#`G+5NLQ9>E<8N?MS(T>\+)0"J_7H3&*Y +M34`*58OIH1`!"T;*^?A^JHH=/NII1?6MQDYL`:Q +MIN8W[H/8$A)E`BKTB9'K9-#-IL]G+^V2IHSPN/$N?-?9M5,VQ5F<%0?:>8<, +MQ0*='TPL;>!7H05H^G3ENUO5T"[P[)H:73R'-R +MXD1XP;8-0%=EC?\BLHBWC).DW?#WZ"'9("A''`@XSDB5&)E5"`#N#&!`\2K[00NNL=& +MZOH@#T=ZC`>J=!U])4NW4D7GD,K-4NY7XM@#61#(V>1:-C.0<[!EK#NXZ"@? +MAII]!%B$AM!HR1*LKBMA,#..2=`44XZ$0$L9WGN=_Z;2JPAZ&ID$7 +M.J2S%V^_Q)/03:V:=R4X&4*ZWFOH\PK)XNF96J:TP^A"X#M.GF\>4JZAC:1! +M)=Q!U>LE64H6A-VZ`RN4?.C8HF<#>DRD@[4?;DYS"+8J$Z@T]C/I)&?G;F'X +MU6VT/C,Q/X<^S$*3$2$@1Y*JT\>>T>(]!:#,A_PN9CA7QZY_.1 +ML0 +M\?&TYF;):%6--G!8BUVQ((][C`-8C.O_R8+9\F6+3U'/3PO`26CSQN?616.8 +MS)[`VO\/4U^^R\Y*B*W-UBBNO@/0C--T-Z)NB$S>U0$ESZHW(`?[A,M='0>@ +M>\GJ*3\"?VZ;Q5NN;BY9"Z_*B9<K%*'Q4"CK**&Q4)O8Q)4^_QZS_+CE\.=0C25??Y7-#2E5(L11`=I +MU^Q)A-'S1)U8S%BM3)6PX;E`Q"X1\S$ZC;!83ZU`01F)@K9<&/W4/CW&^6\] +M$#^:[9E9M4HTB1$ZQ[_)_W=E:-!HHIKX.H"J]^2EPG[8+KP")RM'M]N9)]Q$ +M0/TA1#/@_7C(/%(OMW#-C^A4H[>F(%LK9^XDJP+"@35,-A-*^JO2Y.-WKD*Q +M-K/Q$K30)TXR..8*PB!7;)0*DI*3MJI(R"B461U3[6\E49@4F]VP'5[WO!1B +M52PJMAN5I7T)3_,[]&N;Z46`=P?!V>_1"/M,MZ*V\G=]!2Z!4!*BPE$Y5EPL +M*]M_@UE]!;;1!Z&:">%@"=;Q"(?@Q-[!/Q'UJG!>/UJDA3.CWY=VAY^Q* +M4(6'0<:LEEMS!30;*Q-_L +MM&#;K"+2SH_K.P]@!)?#I)'8,H.:'SX>UK5NM@>KQXR9\SUCEO<2,P,FQ1KQ7`\V+]YD:VST75< +M:9^$\*+*B@?H>\K'XK9-2YSW8I38/H1>^M);<_%H,"%9M_ +M@:#U[$&S(D9HT&E3E?R`!*I,)'^Q.@MQM/YEU9FU7@8\.T0;N'Q$^AK$!@ER +MVINNKOHW?;!SU]V>*U7&19HU\4=U\#2R&)&'F/%5L9!0I/![C'2<0YI-9CK# +M&YK54X[K0I"*4%LYQGF6@^AZIF.Q9WR>T2R[E/6M+&^A0T[(;-&54&XZQAF= +M;*T?+W/US60[M"#X/18>,U`9QG(PY-5C#FV#RNY5CWPC&^K'`I+<>N6H[U#T +MT,)1>(6[ZWW#=4Y1"^0B2KYO+H$_AE$I&9=:XW$C!(O>,D$=/@9I'NYHA++U +MK]&D(FXB;3@N_P2LS7_:C27N*TN3@`/>N2)M!;-[U%$C9YBD;S-8!?6-9_^_ +M9B'EX9B'*OQ/'6Z+YT?A>D]>2RY..S)X^`_-\J%?P]M8"A7_=Z\Z$1R+"/C9 +M#/U\U]PJ\3."M&#(!?J_QO4J'IU2D/5P?ES6JL*:713(8I8!Z*FP0),JKU-N +M*`"`N[@12-1+%$/55[*G>'+DZPTT4KUNV2E"8]8,!X<*84]_RB_*+#A[PJM]=6_;NH6$X4V04>[9ILG`-S[\EE.)0*2XE]+B(E +M^J2+UTN@=N/5$-?:&,!H0GDOYNYOS3+-R/_DB9T\(Z*T;_#$9E.#.KRP,:2W +M(6-QJZJA.SS!]]IUBOOH^U3PUQO%!4$^_2Z@^H?)Q:3A@F]!,"\L\8"*^QI; +M!"96)0'`X`G]42NP,*AI%T@'"KMLCEJ9WM.N[J.FK[`9HU)BFV"&A(I(>3CQ +MWO;Q[,$#5WHJ:JDEQQY5V`%^NR(X1M8RL9'J[\'AM$K]G>\1<4T;;:IR#=8: +MD#!&SEP1I//DNF$8K6;"2UB-U]XPV63FQ'5?QW2VC(4B`G"*I4VUX]5JG3C2 +M0ZN+;\_I@+'YMARAQ5R&=N&J*:!W4E%F"`4[/S%Y/NBSU,IR1'K!A2ECS(<0 +MH#M.HEU:)/J(W\DG5)RM0+31X0RM9(O=2/83IKH)>^.BRX1T9N7R%N0#A\A. +M2Q&P4?"/'.6U3M.Z6XYW?>CG)RTF#G\^J8!LKE.EPH-\TCH^]-D"#(FNOPM` +M0^Q/ND']^4S6LRP@HQ7(`JM(.+W:X=R<)!$JX?H'SJA+-A]];!L\4RC)/].^ +M46/!!V(;AGM6Y1+2K]6>:AANB>^QB87\7_=IPBT_(-W\3U968WZ)'!R5I%P( +M&,$1E17:L06W?CQN[0P(UCN_X,5>0E79QRHRQX_O:^'0@RB)[AQ/K:(9IE/& +M3Y[EY4;[4+,/?&WI*:"G1W/&TCYF[$XNU>H5*SY_"<1DV=T@O8[B9,GOC>\X +MLNG5F7'_37%1WD#L_`&O-#*ES\D'*)[9$@O^%WY7`@E5GP0=\8AK]H]*NSZQY?A"C2T_5/\$?]8\Z<<^CZH=Q2,)6V-0#",`0 +M^)&\F`)8QB3T*)7NBF_'T&Q$87*++J:)BW%.ODN53G[2W03X`?*,CGR +MA6J#;M[^.CL-*RYIK8/@;.\OP@?:76A>Y8FH,>^-=I)E4)GE38_FC+ZU/>&- +M&F8YQ8$6F267K\EAZ%5CU*](%;K!\+L)*JR&CJ;(*R=V5<1PWO)*K?AI)BE6 +M_E-;7Q35HNJ4?)-(@\MGEK+DVTBF$="_XN\T,5_NR,A)%*2G`!")Y)WR +M>/&*;,5^X3?^S&Z^;7,^^D:P(70>3JNP6=C-,5H74Z$=JU81$F!&+%6ES:5Q +M!;3?QD2>1NLI#!D="4.HW&<)WYJKI1^WC\/JSD-3X=CW),=7S^X):KR=M'+^ +M7>ZL,*=WA?/4FTZ)OS]CO/L1L2-8GD\-^H4R)4UE +M3A,ZP%CJ@:OI`O!;`<6W+A).EBKOK> +MX?5AOJ)0<9>G$)&C;)0F@5*.5-UVM_\<,?#H]KK4O_OK_C@#T[E9N/N26L\, +MS+PT/S.=_#@S=2=K+:GGTH"TO"LI-'0ZEH;[+;+H_M%4!']D.:WE;(/OWM0_ +MU(\^.5NOGDZ`6^6&06!>$,+N_=""8#_\XS`3II81Q_!:24FNHF\_1EOZV<9_ +M;,R,?3X_L):U.6]]RWMHKS)+FRJG'NZGZJU"68-]E@JB7DZX^5<4RR:%%/Y* +M4W-?%\XRQ>H00#6;L66TN$GQ=7#=MB[^*CL5E)R>6O'9%=S?#=O-=K(`2X9# +M1=EK6&M"VJ1*=+9%">T087I^J[4U8S?N82>`O.4^<4[-=Z61H\L0J(T[X4)% +MJ@:VHT.>E;]N[6$%Y!(\SZMV>X,EXZW<.9YPZ&O@X)-'`O>-S3'HO_8[J#M; +MDW#9-\N`/:'/"]*OTWU?IU27$Z\&)H$)]W5W-#[X6> +M&P6:U@>*_$2^(LFD(\[PPNFE(J\[<5]]&PB!W\H04[X-8ZXK$T4&SNE2VE:S\@_:C)EHV; +M@0&P)AFY_.I[*,JVLH/@>OQPX8B"*[U9ML6\I*^@;]<3]".C(?IL0,UF_:M? +M@&O*H^^M_]#_@3L>)QB)EV+PQ"'K!K5IHT'-NNG>CVK4MU]:^'8&8O4)W+)<[]B)_D7^`*I,$0 +M4ZTS4.F,#B6#G^#G3@[=(*DB#UJ$U:Y):I+Q!36MH\3>3,,SB2^)/IR<0#3- +M1@T^+X^'Z>QWLH!:6IXA=^L)RDE`EF?3<:!Q&B.T;8F\A=*3A)BDPP6&H.N+ +M&B"P&%,*I`=D])&-P60_C'/&MP]JE<_D^F\(ZA3\>0DK#]"G2;FA+6RX955% +M/OQ'K-SX2#!$$YR*(0^3^.W)?$`H'86LG"SP0!9,0'Z$<4:6&B?K,%(5MNFC +M?^*.SB20@UGU@TFU@B@OVD:(TX<`J]'0.\W2Y.Q.W1@1,X=D2;H.Q5HT&*'5 +MI>Y<9&PXZ6%9D/\+!706,;"_HF:'D[+_@OCLR"D&1D^\&#G +M@*>J5JL6-.L\,`9CS4%=OYQ)A2; +M85<0-$JX`R3O)#87<=_3*@LX*Z%?A872D/>/>(,AKY^]GX4HN!5;%DIVFL!S +MO61%IMLA%?@^]C-OTTN4/'#HO2K%@"PMY'&MQCK&^TQW2747TN-[] +MUG(W7VB\L)828#*2&MKIA.MM:8=,%D*,.CX)1,\>"*3+/Z]JKARRM;2_-E]O +M;.N$N0PS(,YS\LF^;G/YELDWQUAY>)&0@X\BQ#B/HS((._XMU33`]KWPI=_5 +MPE?#ZT;XBG?;*`F!@>\^R@LCRK]=T.G.>Z@U\'F`Y[-L'J%Q8$Z%*3V!'$$T +M9+,<#+N4_)^!@+KJ4/(K@\L1GP'8-`)8HO1C[<0Y@TYW.WJM7DRYT.EV0&V+ +M%@S##:[+\M-_]Y>R5Y'F(Y#J%52%DFD8LBRSN!=9!8,D0(ZJD)@=`;L^+'MW +MI"'^*G3:Y];IO7LA^&9\\)(A#.2UU\\Z+GH1UX_NL5BT$/Q\"'O;E$`0,BU_ +MW$9DY@JB#):.4-M=7W'9MO7REJ:W=B;?Q%=02:EB+'QZ+MNRBHO/E+"8TW;1 +M<3,_))I.FLM<)GGL6MSH7II%:PD=B6%^%"V&S^4N!ZFU>V[.UBK;-L;G7BO` +MX18HD)F'8ZD7_'>=[UBT"VYGK8:P#I!-R)]U'2HJ+7R(H^ILL5[6I9=_)K%S +M*[2N/^UY:`HU\]RHJ)_BS6)^I*$;0]0^^$O:7OUK%M1832X!\DTCW.'Y3SOP +M20R-L3K6O[X'!J4I4;DQ79A22U>P"X/:V?QI$G1-Z&QP+JHJXJ/![$[/FKYG +M7V+;/O,G_0HX#9#B.7[]X5I">J2.VBW8URR=^Y(,R)2Y/7E8V(6]K(UVQ!3& +MS5B>]?/)'0+L8*IG#EHOX9LQ[J+`AI5:0E*R1/'D=)RF-]6O\74D/J03&QU; +M?FARE5]52BKJJF+I+T=?,^($`GSJH2?PT>A%G\!=@\Z,/O/72X4W.DN>GD<& +M5JZHDL'8+YXUDX-.37@'H!WY!\CW=+[*NTJ#@&#(\NN)>ZWYRSR[VBJ3+4OC +M`KZYJMA>3U^?0NJ??9)^#E0:=*T&:^P)ECVQ0!Y$`M.Y'R +MYRM&Z8;D;[=9@&J\I6V)K-X!MY-]6EA54>`11*E]8E=+:N+!!@\B\`1FF2$L.9E+##(\@5&UOVP"X&:JK4H<(@*]0>F7 +MD7X"[4OHER7L[A$8WUK7%1I\VZF(URK7/TY9==U8')KP/(MV<2/5*-<]^RV: +M$8'D88:V2O@-4I!LU/=3X67XR.1777PC3=FA#(V.L96.AA6D.XA9I+"E9>)6 +M=12T@6ZF:0'^-QC+1]$6UK3>Z6:6+G!H\M#C3!V9Y*)[)[TD-2+V2>&300!4 +M[BI.LRHPU>D1$+]-OQR;;^%P13E*J#B453'@0YX@_AQ`'%:DGI,*"D%B\>!5 +M=LWKAJ2H.6H58X`.[;2JVM2K=+HL=(=.0#KUU8MOTE-RM;[<'75!Q`GX_E:8 +MSG(*-OD#Z;39M?2.:LO[>HU<@3\LUIYFO=$403B>*CZ55X.O9PK';OC?24X+ +MU3I^K/1LN1@D*[V9:C*`K!(,C9;\\+)ES6(#R.%B@<9&Y5_)4`?%2)UK:MS& +MJO9CS([B>8Y7<`Z=D&]V\=00QNYSPF+UC*7I#*Y0K@!>/24FPMILVHJM?>I@ +M]E.9@-M\OL(E"%MAQAA7-=]O7AY<%'3&]DM*`K +M&DJOF;C44H%H.E=S1P=)*]7J!P^2^"1EK%U1G'W"QBZQ06^4XJ>54]L,^GA) +MO<_!Y9-/BG!Z6!338Y;WRH)&@GK\PE@P:UP`O8BE!XOW46OM_-%0A+12OO1) +M\.:K7,O[$?[J?\*FW2Z^__1"5B1R8?&!J?L]S((S8XML3!A2EJ&,K+X/082V +M3403\<^FJ8T"J\)0VQHM-T]J,K:U#;/_6C6?O\ZP7--MSEKLC"&+RJH2?I$: +M&2Z?&?R8Q3$S+N-&D]JU'B,5%M>[*TXM0NR!MREHK,.]F%FB50D2#&=M%([. +MW1"*X:X.6CS)H(SD1UF.U%9"A_2;R,Y,X&P2SG-/9;A5;@[>EA8K-&T#\FB4 +M<`@`OUZ#3TLZPO3A.JGT*OC+M3AO0].Z:\XZK1Q97-P;)F`TB\A%M*M+)3Y\ +M[O1H`A.:ZQQ""R$4`!_8Z1J2P^HR!$854(OJB4X<#-X#R1@XZ/_J5PJZ5A]K +M7EFUD@XMZ"X?L;!3X3#&Z9([O9*!GX=A%#V7Y<[.$S\6ILZ4\:,$IE$DC"P0IP= +M,UPZT&1^G%?(@?^3OD)@&CH!P5S(,85D),767KZG377;,T8,@TC_HO7>;GQ- +MJ*7GE9W$6XTC[JV[AIWL>0NVZZW;_*^#_?3YGM-<1.Z':H\82K$=GI\@,G#B +M?EZ$-FPO-!`N@A.QQ9,8TJAT139EMTW$CF\?#^AW?B5'T#?GDC[NNBQWG$.Q +M5X:Z&WC3I+\K7J/_*7IGD875\T5SZMTEC,:"LQGMOLL8WHACT!-Q;J@X]J#A +M*]!I.@8YRNY#;P;Y>EZ^-8?\O31>8:_"EEKC]S8_S89?`2`S%T! +M@30,.^DRZCO"CP+CV$`;9\7A]*C&&,H[9`?/Z-:*N_#M[[J20OVXE5N6R07M +M7%$YP^WO4M3$C>J0A&O7P@4+A![L;F5DJ(&:VF)Y26X([\$46F)=V7#'@6TT +M]NN]BU].0N2SXM^((9N,:.?.KJH'Z4C^K,=]L<%I1!2:YPLYD@O,@BP]M\BN +M'=FS6AQL`N'56-EYUEXI!'Z#<&T,N'WK/[*-=W`0]2E/"0%_+TR`%5ANRJ[4 +M'4F9F/Q4[+F'"ILBBFF@"YX(>]0&;(H&F69([H12[$F.XYAI.@8I!MHP&2F3 +M@<-?O'R/JX'/[3;6[B#-Y7>+>_IB<^H7_*X'^[8_Z,)9_JV=)GW:N,P@W&-> +MU%A]"%F=WS2]BN'K(M3*T0O([=5=X\*">J54)-$>AR[2`MB>X");[.U/?[YF +M2'SP).G%0;_,SDBC1E.8A#/B-D!_>(/STZ,B(01M(2.[ST5?26*M?"ZU-1T` +M<`#3'E[J?K8X?LA474>@3_BJ',Z9A%1TUC*0;NL"'>*M>W_U7DKJW4YZ(T^_ +M4655/Y937]6,<86(JT5T[D4\O#H9^CE?%JN$.AW:H4.=TOF-?O[Z]I_?$$X^ +M:9^.\YS$#4;!HYSA.5S(M/QN.YWIYO`JR[=9\2^.VI`A:R?&B&_08DOF'2'\ +M(1V#"I#AKPF@!T$6$-"0!:X6R*V-5-W8>D_"^'6O!\XJP^F_7?_6*',]*0V+ +M3`?*V[4]?HL6E/-I*,;&F%>EU5:00Q+`WX3:@>'!=M?9DGR8CE/-M[1Z^733 +M*90O+7I@(!_$RP4P_14&VO@)C_L-KUD=>_?@C)BV8.M^(E9,J65'6YS7`Y`7 +M>D1AR20-38@".:P85H\"4&E?)O8!ZR:9]+"\\)U?BYG%"%*K36Y-\XNC+X@` +M%H4'=#]I?44L+!^<$D_<>$YL7NJ-1N\-?Z,95MPU\=^^G[I@(*!*U)-*[>L&TL#'2R36!L,?H +MW"FSB2%^6FH8-VF\D:^Z.C#U!U2/NX.W[U74/@&&'2SPJH>,'>:HOTH&26SL +MOK"[SKCTC!^%9-HWLXC28'2KI$#2T03 +MFJ.=@]^`',_1%XY)D^"+JXO1TIY:S@<@P>TX`=@(HO[.MOP0;^/:#?6%HQ#W +MBF-&S.2!TC +M]8]03],QUSHPP^I3S_9=-4&B@%CPK]Y^NF\FL5I$0W[`\E73"EUT<(TM+*)3 +M"?:2''*%0,ES*K#BYCSH38@>B+&"\X_Y/,J?JUKU-C!AQ:0K-B7\T1AO[KNJ +M)PTJ/&D76@VPR0GOTS&`J4*,'X/&^Z"'ZF52J) +MX#7"NEMZD?Q_XX,-KJ6)F6RMS"XVWCJG&5;U2"<(,29:DF.$38(7%=AO#6-M +MR<&*BHU(OKI'I?@\`"C`'PCJN)D?M1#PSD8;$5O_/W*'"SRL0OD(U1%X*[[H +MT_(GL8ZI&L,`2HA=QP0P2+UP4JE`%Z7MJ_EHD4C?"4I^&I +M7#&*3G",RZ$0M$K2)W;@U*;%._RQEB-/EH;`G/:FXFN:AZ0(ME1\G_;^#LC( +M?(24:?FM(\:MRY5GA%/#QN55D=I+'UD`-5LWYC837^`ON=^ZH0B95!]YU.H%R)DD&=:^);=,ZQPL2RSF3.\I)MPRVEPJN*P32?3-K,_U!42KOK]'UW3UJ+2D64XQB@X=_Z&$MV_-2^M;A5L +M$47DZV$W*F14)<,V+>>&SUP@I+3HA=D=#W(OA"?GF2)Z:;2I0YK]V19N)#TC +MK/S`N)[9[_GN$\QO?M-^+=[^%GUSE4K2A?*;=!Y&J"ZXN@QQ6-.?*B:W`*Q*U`8[>-S+ +M0@5JQ=\Q.WEFG\WJGT:G%BJ[[40-G;N74&]HZ+48`$^VZ4^%+;U/1'@-C[1V +M,-"KP:5@#`VC9-!U/3D?CBOY+A@!GS;)%S']!2"5&Y6WRR;Q5/[E&[@:06*Z +M*6XB^L+W78N-FH7OA1K_4///LLN0(R5&#)5Y_HP:[:X@EZ'B:E:V#,OE;AJ2 +M%;S-O`'V`C,QT`'S=0)++/#>09_!TG+)UJM]M@>UOGSK-$<9V,-1?WQ#"-)C +M$)7*L(]I1VF=VYP_+^7ZF8L#'.0=U%2A.4EVP=R9'UKGBO8=S!\!B6!4^NL" +M`0S-8HQ3L7SSW;U-\0?89E?,X6SMNLS!)P1>#?$)*M99:BW9%M7#)W(:!)B< +M2>F$-5]E.-M8KX7:4VR/:KFIEY^Q_2IRML]H))T2.9W`#QZ3*MLN# +M@?X*7I<\E2'/JY=/S3^1&DV\(7!T3N<7(Q1Y*2+$6-)L#>1)GL&,,NZC.=@! +M3409^;,SHY+_(#"#E3%+;2+RT7#Q4`X:5TX!^QFK78C*AG^`?";8TL7)^'XW +MV(Y,X>%IJ/;!M54(8<+.BA_/?*!>)N7OD0)A<*GM,X'<;WCR)[&PD,83A>RV +M#,YYAH37Q7X),^JZ>TP@[UBBO"0H:GN87)/GRI>8*LE'K.C>5+DK+,I4S'T$6@0ULC'V%M!+D#F[ZE>5-<[=<)'\FL&:=UR+&EM]>" +M'&]7`./;YR:P+_DA[L[_S:,K>>L;['_QWE/0>VBRD`J)A]465_;PP1XN5]7' +M]NT3LE-P06-J7#X9N%;+D&>7Y5X&;\&)!;4[,G +M`](!+3[=:59+!>(EW_>O_C$CNZ(9'[;"#X_"$U`JGY%_0T`.I3:XGN!#.QRH +MA0V^\0!!:T#N7IZ5[NB`_*>M^]J-X]Y!3"S7\J)9J-08MD^(C!MGMOQN'9?W +MXM!D80P(,OMG=_EW'GAV@W3AXWJ9QDZ);=(,."TMH7J!E5V(<@@ +MRI298%>,K)K=2U',UR8!+Z)YT;'=+J$?@GCQ?B3WS41!LHV,9G#)F'+(9EM- +M:;'!6]]81C'5>`BIX2Y/F.6V5/JJ?J&\VVTR`<"J.3ED/OJ)PQ`XK_\ZJW1H +M%G6YM3L/!=J]EO3T#>O$F/4<)4RXU.3')IE6\B@A0].`:W2[KZ(>7R:` +MD;16/W>EZ6%NWD>46+")Y.CFB5=I?Q8(\O=8-K5A]*0&KH_N'?XRP]>02+I0 +MI_2$[YDB']3%BZJ;+2*61:?058^5XTE_9WG*EQ_EBRPBEI."[A/"`3:0M+](D?E4;VOWM#B>.]0W3M/2T1"FW)? +M@[A_5\&RDD4KC^R73@@_2HDE+T)M,E+0&V8`NU-,D4A1HSZ/&3!TZC^MB>/)11)>V@ +MS$F33C9\?+$$#(*`:-K@7`C.@$)Q;!L$5@ZL"+4)+MK8*!B<]XA2:OLT.!!; +M%\6*FC46#5YW;YS!1CF^,.XUG^3^=S53"/0`I4`_&+&WTVIDX%K+G%3=C7W0Q'X_(: +MG88I8'_P\KT%+=A)-+6WZNH-(;MFE+!\D,C\S.Z9#Y*K^M$&K8CZ86\/%A,X +M.:]JI$25^HS[_8Z1\"`Q92>7+1]Y+-D.3$7"'PR01LRHHN!09,^M=N +M1(M4+O%A4LI[+I<^FE52BW5\![1W4KLIP*-XAV]84RM`&RVW@"OE(B04S!:_ +M(P/!Q?[2_\)@?8%OP0W$@O>X@+NLONS$^J04(E5\O\I"NV3WQ(SRU!+._/Q9 +M4#XK@UW7`YPYV[K)+1L74($+AR'H9],*& +MW(<.,]"S;8!\'6/U1B`%)>12;NKDRN%![JEX-$/Q;IP8M]WB%(BIAU0(T*3$ +M:_!.50C6G[]M1OZLE3@2W.4KM'(IND9V;C*`Q1>SD2QFX%(GL%JCDH2':!>4 +M;K_,HHLJ1V`R>O8^B24,6BTXT#>.5A$LPAQ/B'1`^O3A^8UJ*4"2-;9-F%SV +M,AIC40EN4W,(/.Q5XDW-F:YD+O(B\/(#*\),Q_-S.VYV,]N;NDD"V;##DN.+ +ML,/)+D[[+E_M-NN(,I4Z&6"=(R\[S*G)PG2A/PCYK.[T_#+9;"_S7MX@`*<` +M7WL7FH8U=H6CLZ@P!NZ+)@<8[AKFWY?>%9]?.S/OHI1&CD$$F?_5Q?`LRTD8 +M>W@?8,;366G#$'::!@!5#>S,L +M6278WC'E'008E7/X4@,?B(%3YT54/\2YF^.ZW?C3 +M*[_*OTVC%BN!+DIO_%]!)YZ5&>Q266#A'9J4MFZ-H^H$(JC.[36D&\0K5D#. +MFPD0RZ0/?+N'[?*`.%DZ;!OE$S$_T#_$@A")E($,;%7.E*/51*=2NP6AOJ:. +MY[6B[]1FAAE_)<1*BR)8K@M,12$3TJU0#MI`/M9+K"[.$L:ZU=ON$CX^=.S4 +ML+"Q\A@K!E;:I/A6P,0U?A<]N:::V`VV1SA>VLJTYD?).>;^.^-D7C!"BRH, +MO78DT)4PO,YH;4V=R"GI.W5\Z?_0M[[>1L-^EXT,%/3::&WQWP95ZERG7V_Z +M32=-6!]MFA*T:2.R#K/52O[9(I)@8R5B^IA,'@K):S8EPG1-SB?SBS??/@]% +M1_D(#''JF\HV43HHT;[@]0P?QG?[_Z[HYC*<1":K%V%Y0?'U9:\V5EZGZ6GC +M)L*8;DZ4\62L@:D_4J6A0T@>/!)(&"OQ70+<"*D[==]`\:WQ#6DQ.6+W!$*C +MFR0$)@K')]IP'&+'6@TA`(?,-JUV'OZXAKYUXJ,K9;^=F7E\)E62R8MW64R]6[J]HA-'?/5E;/+>9V&"%K7Z +M;$F`8`R$O6-^W\A*$7MLPAW6_P6P\@BL(ACY.0'2:V.5P_FY=>4O51S[=A48 +MQ]B0L2,J,T%*.%"^_*4B=7DY*\4X:/Z@;T6,4`4GW="\B#70_R'H#6`M4Y?C +M'S[$Q:;F,OU"L4#$#.YZI"[OC;KX@H`E_&'SA`S +M_]&[P1,R:>H'7JDL7GQ4-ONC7L#SOC) +MW(4X>``AD6PI_F&*(IGO0C:1VYHAVP-XEY,1CK2+#5E%?>S5BVJX,W0P(EQA +M#T5'"NONIU;9#/SC(,504&N^S^Y^NERSBQ9ZQ)L#:=DB&"0[OT7TY\,>B]SC +M!%5^F(-'5XGL(2/R0PYM9-D5LIQ]Y:#@KF,C7"]"ZL3,RLYQ42CNIL:$2<\3 +M_NDH2[BCB:9]SD5&1"=I(50(CO:=)?^W!)`$V%G>TCHE.NYG$&U8J:Z^Y4"3.ME`DP$\_9:A2$5ZP'1E0YTMCR>S,*O)X,"`/R +MB'PIW.M(>JLZN3;:Z&2/!NH1 +M`SHEX%R:..<]UI^\+E6'AKDB>8+!35,$1]?1<:<(YE#0:4T\ANU^3[MQ4E-4 +MEMS#'6+%PF?8AEU%[FPW8.^S-4'$E.CM_8/AR9!]YBHYK%2^IS"2I*V$:CH% +MFNY0AO)'M)Y'8)/Q17)'MUA')#8/Q/M&XA>O*D=^_K_02+`*& +M#W0FWF;M#LL0=;X@)^G9%IKA+"--=V(46F,`7L-8IG2,$GD,L'<8KKY8LG.: +M0`\]/P'N!8G,9+%BY5,&.T)V=?D-4J]>\['-]!,Y9Y+@[.E(@P+\8LQ\HDH? +MNT,C-+9#+]E9[##2CKZR]8W6B%0+KE:4W?6ER!H!VR2L3R!%YXN,?+5>+,=K +M'E)+3DM!51DN>V>TQ9TD.S>XS>8[BHMF()=-4S#.V=8+]#X2 +M38,2)ET+?:X;2B6X]R@:D.S$,IMPCI8:*`* +M)Q3^QAAK57J?Z-M9-DDMLAO$6>I;KA'\H9B*ZS$W9[TN:O./M$W*#<,AX"GX +MI:'U7L'6%D+L\B^.[MD-E(A$V7@\.(?&^H'J"<;#41[$Z!<.RQNQZN='>YT+ +MBHAS$_:F_%(@2X*1$'?1EZZX#L4YP8=?WP&`RA0WWQPPYAU#+.!FI2Y[%>2D +M7IP#GNZ]G.,Z!J7F^=;!"&5?`BSTF[>DJ^_!XGZEII@L]`#$W2\XG<]5@!Q9 +MLT87O;5P[G>E[_DN=6U,H`V12A>LH;TXS114IZO:EH/];&'KK(I=*_$5T&U6 +MW/7L;R'D'5K4>6T45G<:OU>)T"B=$ +M&_[65<5C'HP?2MZ0I#D(G&XXX*^D58P/YS,(Q>4?OGCKF#1#(1T*3)EOY;[N +M?07GS^?O7A;9`:JM:X(=&P'A<8C!>K<,CQ?^NY3G?,Q;>!DDP2BMZCL&&/[H +MX#+[3J])&$7_CO\96)K$'Q9]5G#(QU8CV)(WC/E#O/'?)=<90;'6/61O: +M]$"_>D$7"`#OJCJ^XH$N"W?2JIOK^:MO8P +M3]C_9<_T?KJ$,'+Q&Z/VK`"VPT$SWSR35P3#W'`H)3F!%[\MS\BJP3!.(\*1 +MG208+N!K22!'Y54V[G4G*(.R=\0__Z3[.+!P]G2-?BY:=J.]-)@D7GD-7/3L +MD"EEWI'` +M0V=7T6TIY3XXVN8E"^%3'0(2K#_['19@ZLV^KFF?5-2'6J3(\J0GU9Q/SS+& +MM9$^:5`:%FF-'+FB7,O)_"K8HIG!')=U9*QD6*VTN[\6YIV&&)!FNU5JAD&I +MTV)4K;0KU?(DB'4>H'-" +M&^DU=C`=LXD66:,["6[7.U=*`V^?[OF8`QVPTYROAR+(WU?-IDG;??@C;&;;]1_-U?@E7;YH#J(_B0_H2WV;) +M=WR@5P8^DZ6RMO:)?'A')DA53B-QQW&4%"XYRO7?=&D4[_">A$5!R&3%`P[L +M._7V.9T0B]U5XXC5B8["JS^"&Z1\P%B=P5`<56;DG;%*"LS;@3_!.Q?W@8G: +M/Y^/KM.+=/*)XV^>+[#)[C!9G).QBQ!DO7F=R*NHO[/6FH13UAM(1'4V;Y!O +M0)%N(UFL#%JI"5;#9G#GACB@4W3[A'=2U.T'U$HWQ-7G\%N%?]\IHJE?CR-8 +MI;1^81FV([W;:I\BWEAH`E*?<7\O?>QDB1\O-:7K?',)`'G^J-=(Z=K2)/"0 +MZ6'C>QV#/#2%=(D^@2..^:E`FSCOI!#Y[S?+%SAF"G%/WBU"0^?:%-I]/&YM +M48[,R`*K?%D[8@1J@]DP1J5;X^Q8MJ7#\%H^:WP3-1L&\2^;<5$HGI*YNLUQ2LLR +M[GZ@[H>6F@T.PB=*/1J6#P`!V7Q17^S4;B<;<[.)T[&9(ADEW9+EF@@P\>L< +M2,2PCZC=59ATXO_("FV(C2V%#D^^WIV7DZWZNL`QR^?IG1BV^-2M00QAS"WR=KX4P_IF0/5),Y:3C%$(P.( +MU-"#V?1?:OKS)7(.64F.VQ=XJAR+V^7QS-*\`[XXE383092F=C#WD!C8OS3^ +MT0'"%P*I$H_UV+N^\FD.LWE%P+A!_301#3&8>9CTAUKN:H!$_?"2%&(PM(%Q +M!3G@FCE\2*YQ[_DON0!142OR\S\<2[BDF)*#*0<\P]/;)_`HH+@`^10@+&=# +M:'ZG5"W2Z#9ZVH06A:$>PSA*=6V\7;B/:T2V_Y`>'EB%3I[I +M"*?L"A'"LPUVC;>?&YQ&N?4J"*#-@1>NN/@]&$Q^OT?[:$_B\H%B&]WE&&G. +M`\31";4TNC73HB''$XO(W3J$$?1R8CO]NH`Y%KGXIQDF7JN0S:J_Y*IU.#JT +M>QB>D$K6Z9^\43)0#7C;QXXK#6H3 +MTNBC3?3>`&0I9I9EP`FT_-^UEH\2I;'='H9ILNCCT8I_M.OJP!X;@!86_J!X +M+J`OPN++*1B1/&-)5[I+7B.M\X0)L+WQCJADVX_86`*O796$F76 +M16FR'0YIL6]B'5-+>"'!\Z3Y?@%N69":2[J@P;#)ML'L1NL)5M;W_"^SVZ(0 +MLUY6).2P`C[8#Q9':4_UB +MR>V")LVF3]B!XB[M8-J??_M?_'RS8"V/E%D```$``````!H``0``````3%I) +B4`$,`![!^____^````"L0?;=OX-*CDH_90X##_1@T< +M];==,RL,I\/9VH>/%)Z>_:ZS4SDB_6N)LMB#H"1=E*W^T'6/5=R+'3I9%JVP +M`/W$QUD9J$$":?1U-V.M]A"_ +MBJ=<*?B6VMA:Z/VM>WIK%(^--,QH\+P8\D!P->[9_W>%O/:-86#R\]Y!4RLQ +MQ:@7GT?14O-\49UMC=1EZ"CX373-#>9C*_W)Y3XF]5/\;`03YR709\T\<$C= +M(?O>E(E"T>Q:)(RKN_@J/C=:(AW)*=!U:>YTSXBEQ#B96G\^/Q0RNB9^"I:* +M3!'JB$H!,ADB5\UJ%$'<\0Z=UAU?O=0%.'=]/9"/K4)WL?`H$MGKH0T +M8RL1;!17_8`->99"#@L=?7>G!N=GWDQ*MJ&23LM$3$6^.$2[5X,]'2^+%A1+ +M*K.7`17/0KM]^2\!R4#+JU(2R9^O(&;"B1?<4QS,!N# +M[87;Q7'3YJM$7U%!4WZ,,GPF4]SK_"9MC!]IU\^!/W?;28*6S>>7,7(^I0CR +M*WH)-&0-=4U)C0\@A\,W7A:H,LWXWW"S>LICA#"L/V)K&4VF2>N9[Z;$#QNU +MP"`0>$CRU)NSX;#84_SN"TLSU]5F2-:[BV77H,(Y/"_S.Z6G:NGR0!0]_[,` +MP#Q`QFTHKK+D'JGQ-N/GW+)MP)UA=XO!?*U9N[7\_EQ'6G\3U;?=F_5=L83? +M='R7)WE#G47`@KU!.3Q37&I29N<8R(.\[S$*XL)_N.9N,=A79KF3*[ON;7IA78J>Y*7+(-(@L +M^P,4M"5?:AG&C]U*C[&[RPCA8Y]@B$?>]DLI%>&@B4*XM.[S]KIM(ZM +MOBOM^AX>1I`/73B>>[#`KL.'!1I1(]?9FT9<4WA5[Q"ZB>UI3@2[6?A/@\'+-MQN]K`&P;/M@4'O7L&/B.EWLLF/+O]80B&O&OPB7L+P96W65'I_,Q&@Z2(\]A=EJJ9O1KJAS +M(8M\93[Y2"O7$-!BY<986I_369=^3=+GFUPZO1XNKX^#680WE]&/&S\P27(K +M9QIB+_?JVBJTXR!*,QM.9MFU"51[ADM%CY5`+BCGJ^7,6[TK +MPI,BT0T7\>$D%VC6EK_+\[*]5_1I:#0ECE9J&])B+L$,^3(I,%O];F_X=`SE +M`*?.-%)\3!'X/G)#"'&#GH_R0>3Z-X?QCU3062B#DT\QV(5.UH;;VD3V_DD4 +MN%ETH#7T):]-=8:VE0/)Z?S4,G/"RP@V3+D!G*6^U=(QN[JZ4=GG>%LU +MS_/#J^B'8T@X4O1H83(X3LE'8T2]504$B[Y)YJ(WL0X<]QENV>Q?\1=,/W*) +M$R5:E`,N@W.'D$JVBXY<1D$:AQUJE4Q*NLHM.#^`&_D\^E=$K[R+#]9M;]X/ +M]5L3+!@P1AEBTOTAO3D+V%A>)BWU]FA:%7R5%JHVXHE+/WK/:DE8<'R&-^BN +MP29(77T"="9S=-?KUF2YC(.3@5H("SJKVQ''.8$MG)7[RTOB(9S'4]ORQ@6* +M.Z_7WXAYG[)V8C*UL?C@^GQB#%W2D/+^FMG5CZ)WR']\C&QVRBDM+ +M=3U8=[.%/&KH2/WJY`,[L<>$H+A&M."3LV\G*A5WGT`W&5ZI?^*.)^V3V3/S +MS("R\[7RP8+Y5V3M)-6?MJN*U$&N&Z +MYFP&UF7$42?W"HPTJ4"._:0U"K2.E``.[(KRS:;0^GK0FWYZI6CRJ"^/GA=^ +M:Y4)?,$IQF2L+A1`XA,9"O^%$6&=Y$ZJX8MWX4L>L4UX>9B+H9^BJB4PC^8_ +MJ6\@[#4.1*M3AJ5P!B$'7PR1UT,EI,$CG2W'DY!I::+^#.NLCKFQDB3:Q;2V +M@67H)N-7LV.<;S%/F%1R_#3+F0 +M^V0U#&.GEI7"5P\(AZ$-)`JR+[@7%-2HH0TR`3:1R9?S'V.F/ +M#SZT->AVTT1GL<*!O(T%OHD-\64#+0#\'`07ZZ1H/R!8,ASU307[:\(X$*[Y +MI(#-RH`.-*@]DNL(/,C<)&$F'!(@2S(XD]-QN,KR(8LWF]Q+G:SY+BK*48IU +M(CBU\@`73V%KY1XHA;IEMD=>!G.DA`&TV!I>JG,E:]&)#ZB*EZ@%K]=^=)R, +MI4INNLZS(;Q^+PRON5[A4K/MN)7%0*V\-(6&LU&3.=.V8(]Z)-8J',MP`:!, +M!PO_@8I!7\CU/IM%UU6"UKF]KYH,[I<;J!T(;##*H`OAL6R\7-%E$EV[_5]= +MX0#606T\\P1$)'D_%IJ+EQHJU%8(IU:%<:0L_56!0<4:W;7AICF\?Y3?GG4D +MGVJ?]ZM+M1=UD&-CCLT?J8 +M+P/WSX+<0/F21YKXX5@PEZUY-==!N-_V.)67:SYQCD$4/OD&DF* +M56/$>U[\O=<%4&"L4]$COA+JC4\O&#+[6NKSA9^AOGY_4]:&QL!E@1NVYW-& +MW:)JBU[R/%D*ZS"Y$MNH5<\44N^4C]#ME`^H%IN+X` +MXZV?_GW@'K*X_9:1X!:P@';G@KM9AK7XV;=6*<1X +MGA\JV2;$?6NF?G_=EN3T+^[%)7:8V'HD%EA\Z04?P+?/0;[J!(U_3-?]DHSXLZ-$I.10Z)2=`HIN!6,'IG#;3# +MQB0=4*;&T6\,'D+[;X!$+%&#W)67$50T1SNABMAXD$..-S;ZZ4'>('/$IIK/ +MB[HW:I?L.AD,:XE]?AZVD=FR39=;>=KMGC15Y3/HI[5EZED<+5KJ+V9#\R=GJ2@;/"\QXAI%V(*$:_T!BOWXJ>XAG-DU +MW(MO`A,-\N#KX=>`K?3Y-O"TR"0YNKZ]$4_ +M#LW!#9]AQKWGE8><$(X`;W\:ZY[N+,(Y[F_^SJN"SH +MG_G:5:ORO`H9I8:2^HP+43HT>G]ORJ8'A'-\X`G*[7,%)K4;TWD>F:M;88W2 +M9#MY->P)56[-O)SBM%FNT$)2IHE(/6//2AW9N:.9(CQE;25[8)JTD\YZO1QO +MK??5V-H+=.7Q1^4L1Z[=.2%QUVTR'OPX>L]J_R2V2BX/_W*=U=C%<;<^"7[` +M#J85&2=2_U7)C^%YK8_&.-'_AS/D1NB]ZE](F)/A(H+!=J9E>6CB;-INS_6\ +MT=/%:!E?[AO!C(8^[1):7/RNBY!I&?+(+/P[,1W)O\I"65QU=5UG#*1PD[`G +M-@WNR4=*U_R+:1_7A163&Q`/.M9KP-+UK<3`\_.<*`4ZYK.EVU!1E*PM[FY)]<00(%V@98GD9WXKY_HH\;G/ +MM?VM*XK*D0*A^/_QR;#C/J$C@E>O&-+0H=28=8R)UBH`ZXHJ,,F/K#4A":BF +ME9IC7)*6%^C;I9+OZ7N:258J=!\5\O +M[TB-!+V@NJYF)](.B+FLXI;N?S>>`O]##%@<*S@8<)'M%H\(?T)>^;;LCI&0 +M%Y`)KOX?A/U\[45]?:^4HZ1VO7:-BTN.T?>*LS1H`)@`^`E#"QGM$K<^$K+5H9DOM=GA? +MAQKQPG,[',Y)^_-`@Q5YNX3&P8XQAN&E1'F__*+R_,5(MUYS%83-KX:'M`G\V0A,M[[MH3E[OFM&&+5@(3-N0XGP=- +MB[0.P7#;.P9"9SL_N/;9?5CIX+]!$2LNJ@ZU7!;+H,NYH0F7F6O'B=(-V1;D +M_JQNU_31Y_EQ1@4`*SUHDS03O'YE'$?MN%A=:3BJPQJAK:%2:^C-%K\9C#>K +M:Z^OKN@'8GS:1B\S,V@9BZI%1S8B+I=_]M)9?Y'[EUE>:4$*HW%8(G*JJQ;?< +M'-ZHJW883"W\^TSOABE+Y-8"TO)CSCH:^YQY#Q5CX,?1R#+3@T+.FN5(`Z1H +M_3$[9F:[_@#0?ZAW:GAP"(W9#ZT"O'82@?=V?EQ\T+D[L&.`7#DAJ/6D835. +ME?0NG7QW2C9#5Y&H@)@&RXL'B*3/FZWW5I!#`ZNN5X.=NEZN8S451&K)P,4T +MX):/I.69JNJX/!C.BLPD5%)RDA(VA@;AH=)3YBBSMRZIO##)IR6GA5Y#SEHZ +MS8J.B@[6X#MI8>%GC4N#Q&L8@5I[_:'#KSA"%3XF(B/'H4FH.0*5J-]ISWYR +MDR&L[W.(A8LBJ*$"(.ALZC4Q#KON]CV-41=O,$ND,&E^\ +M/S7)66B,(JWS[8_#?&&HU<:"X?SI)Q9_.SX^N[37NSEF!P^)*T`WQ(9<$N,* +M2V]WG09&T,E]8J@!+AL@X\,9ZZ-*1[A_=-Q3_YU" +M\NR+VDA!DQ!O!<,\_9ZROABBD1M'J3P;.0XU_39Z>5B!,!D/XX!8`?L-D_6) +M8&F44JIG]B*`0JZ%6*?62@2W],'X^L5L;74I6X=N4G*CW9C<'E_R"+7R%<@Y +M^$;]KF:];^!F[I,1*$*=&O'8K>2/#*`S3V0WL4Z/9PQ\V8T;D\32NSS/45I24`7@+E1J`A!@*\?_> +MCVC7^;Q2+P*YEWTT9&W0D$SG&V.H4R,I?'ODRP!(U6[P*%3%XVH2S>^P2%A& +ML+HU;OUG%6[*,#!AG7.XU)/2"/&CS^EP>R<7M$HF:DY)^JKV3;)>;[.Z-3)J +MQ:\)I1M6Z5I4#*2#\HJ4N?9&R',"V1(4G>D3> +M5Q05OXK'DY.WK_2W&'%.(PP.2['T&5"5ESD%\^)R,PDXDZN<+^KG`P[WF5SL +MZ.8S&\QDT+XG1+>%J=H,18><2-K +M-)1E-6GGWAD'H8,>LTK:3:K#$B=AA-WJ*)_8YBJM6*]PPQI1O[6YMG[,:"A0 +M;K'*`""P;$@"0M8ABJ8NF_8,#B591U%&@4%]!?D8K<&@?2 +MC3ICP5/76@=HJ3F%^*H*(,.57/\5[JBMR3:X)QOH*/2*)&I+]$P?,JNT]Y6C +M]S0*;?.A9M.']_<2Y%WL.T>G+9:ME723WQ7;HE0..>CO:W='C;VD19!&-=>? +MF3(@ZQKO_?3#2_R7F*VM528)S@C25J/F3!RG/\Y+[)-9-[86)D?%%)QE'ALT +MG;DS9?L;<3%(`=/Q#_2;YS/"O4>0;F6)P'LO*I\?"W?PB]J9@&2'%&J*[I6W +MGC4?)459G,^!Q!,OV(+H0<7QZP.TLRE2UGK!K([6X7C.>]E)8__0->YGK8IO +M'X"&PHD[N%W2)OPM?2W]TYOL`T8FIB5B,YZPB94 +MB$K(,11,PO7HSBQE=JYT_1(BEPQS*"@F<9.>8`'4PFA0"3.RX>P5`9CM6N61 +M*_,GVM@JGI+*^&CB&4`W`D&$JGN+$F"HO]11IWDLCRHL-N)%"FEHI7^Y7&`NL8 +M:S:/T!V]XJ+!'3ON/^_@?U%F-[#8KH?_+-).H*/@N +M#E&O:!DFPA<2)C@?.1.:<`O6T]'Y1)'?N:%^8_PLR4L,]1CA23`5?-P]?@V] +MR?"CD4BQ87\FM@X@#][TC6UU<.5_^OF8GZV':&3LBEE%<1"V(.:G7C7<07H8U"2;Q73'9?=/Z +M"D62.ZF8/MFH6=//7__?I(Q2/&EB&M91=> +MDH.HMZ!M=(P%L:;A^;KF=Q;S(C7DTO[L/HC@-VK4!9#,^8*%$O1U +M8,`M1G'OQP`OQHNRDSR;ISMABJD1A]C^\J`[Z.@>?#QXG@E2(#X%P"IR0TAU +M/!,TR#X!7`BM/4D2E=O!ZGQY_%RSTP8("[*,4^'L +MP+P#4[`'?,3X`\&^HF5?^1AK9`A>$//OO(A`L^13T,SR?RMZ2WGQZ#Q*V>A\ +MFUYT^A!P6W+5CV&^@W$YK64'U9?N8V_NBI<'6=!3.C6N9_1?\B8VO=KN?525GHZCO`D'Y]*&/'])U +M[@6`<;DDYV_[-_&MKLO6&MQ#_@N[*>C;ROT+0\ZNV8P)\[(8V>`G9.HT1>:, +MCY?$C#QN,GF`G:%3"PM@EI1$.!@C8C3,N=!/\V,6OE!>P^APHT$$C#/2-C:H +MTP3KKME/'(%='^GF1#4]8?#BUIW#"W47&:6.Y`<0+>T_/^581F/LJ8>FN"], +M'#%"Z'O.KLG78?8,:#%7=&JH(MUXNX89`0IY5DUP[U%:&7[JR"@;KV=0A +MU0/:$?D'066J(Q>;,`]03>:Q71AA(W1RK'>)$[M5%I);8&6UM4F;`K[:GMI, +M!;+"YUN'MW`#@6P+9ZV->^$Z9.9Y,&FA?]Z[8S1(RPF&BJBIB5Y2Q_PP_)WB +M,>%$&RYNI'CY^I9>:O@7?CD=\C-Q2"(J(-2)L,DL&L_@OAXL:8WZ/'\0<6X\ +MB@J'%3J1/PA'GAL+1AKJ[#,TQ96WY]@%QL>7X343IIQ8(841?3X(*WK%M7H< +M6`2,KG,":;3743/YHEZK,_D):[WD7.=#1=B7$<8)U:.&)NV4%2(N19XWGV$;U@+A&EFN=%[\@_'1&L,8HSN/!): +MHO0JSJ!R%%1W6@P(Q@1Y8NIWTT9%LUU^>82]^=]1*EX"S2PA_GY2B0@EHL@0 +MX1>%#8C;M-0MUP_9X2TPIMJ:YJ9/TW9OH;:%S96QR#EJB''H? +MO^W1>]]_B#*DFMM/IC=/J&+07U.G5BU+N'QFY)9%AQ5B:>7PH +M\@&-M+,<"=?U].N(MGT4KF7) +M<[QM2N2!U>[@0++=A[$!`P"'F6B&K0LF&C__9[XC-H=-7EQ'M<+P1A;Q/T7U +M9P0"YA4L'O](:RZ=2\O":^WPUO"V^/(Y/(SM.T'.8N)3CN>@PL?`1UFLO?D +MCWR:!+.N;XF:)P)2>Q.!.$173<344:"?56>+!4JX,]CB33J>G[-CC!:6QPA* +MTP.MA_,.U9.DZ4QA'UYW@CBE]P)>.,8\',Z".F%D]:F*%=0N2!9W$M])Z'*/ +M&0D]7=C$._S`W;7GCGB3=$8_U@8P[2*I;3LB$,V>+JNGXZ._XSFD;R-H2U@S +MT7[')E@0WXY43HL"(+MRS)_U&E2F6+%+I,]+',4&]("O0$8`^TZU$M!:$D]V +MA.@`.(*KHTI!3Y,=S#2@Q7DX%,K4RQR +MSCS5?IB[,&`S@0_JENTX%4L#_P86$IW$@JWK$;.#;3$+7+1VQ\>+09?(G7L: +M?TEI&$[XUER],#EASB@1U>DQ#;8ITB60([BU)F5ER1(ML`'+.C)B_TC[6?L[ +MG4P/2LX.4HLN=C8>53>CF)275@:8HA7(82<=7&9#@%XBP9A<05YZJRGO-<>" +M+KQB=_;(6]H@DN)92UQG;:U_\RN25>X-V#-9J'^DE+17T_7":\&&4L<+NZR9 +M>,(1:ZRHY>`J--W\-'V>.($@ZT)W7**+^6CA*G#85CP&P??/SFVPYX'^GO@% +M!+POA)'`'=2'?B0X"G%W$I@N%KH%X=.1L$<8)==:$\6OP?H00)4WO/M[R%,[ +M8:.CE?_1.(-O8QC;IKFNB[@498Q-]\DTLSN\[Z!D"8$N78-JW +M,J47AFEQI!)>N3#M8"$Y$YC(Z`0NB?RYVZ278@-KW&6`G<1RH]';#[6.&(GJ&M?"WGVJZ +MIO(LD,]/J3X7I3`%O9A*'ZQW19MM7:``_CWT:]#4=>S2UGU?G1+7E%Q%Q/^' +MB0G-"2=M]MS6$QK:=X"B2J4)@)5'E>$SKH!%$^9/)`7$S>69&^>+G4KAOYH1 +M7H3,G/+LAA"Y2#XLD.46E6]'B9^]O?4ZN$:O+*09&7QK,TU/9H(PBYGM[`9[ +MOV5PX=Q9#PZ/Q$-5UY%;@*X>0$@50-)$[>4$XD:6$V3T__O; +MHJJ?B2R(D`Y8AI`#,:"WDP(C"LBHO1'"A"VQ=0W:OUFU2$0>O4LQT-GI\"LB +M@T.$^C99J,!2&J2YR](93N@1:MAY_=JZ>FFLWXLRO7X1&M?V6X^J;6&LW#[Q +ML&-'RW'_GO2?!S/I*G'_P^F"^E+_NQ]LT0QI:;-P0(G[M-Z*9PWUAN@(4T(T +M"W;_&9`LQM"P>`02[P3,9TUT&ZG'6\9)HHHTI2BR`3SQJYJ;44$5RU;08;S, +MAOK>-$?J`@.\&HTUCJZGS1BJWE=OV\Y&>C(50O4!TD4/,'N?A4U9E&AW@#4( +ME'YZ&V;TO]:5PK7#Z0VSAB'8IPJ3$&.A)'B!6W9Y625AO]$0U!XF4;:O79QA +M5CY[6:2%FHUME"F4>B0CHG1]@I-XVN(C]-<>CC!;^WZ4-7HCC'BMK+QS4$(] +M!FG2'[/DOV>&BC`\1P;5]NO:'@:#8]&D%#J[&F\C21CGX561J2(TVE,0W^?P +M*(&X<*.S9I<4\S,C1*S6QDCB@>B,*+U]H$4<1<:-4ZYS&U%IE>ZN!I<#Y3)Z +M$3.3=V?$.],E%L2IZL>&7R02C+37S:\?X]N53;37?>WK7+O^CD#KM%@,H'7S +M6'(#<4X5+(M18E&34T#:)P)CH&)CA6#:'>'ACIH><<$@"&3N+F@QL,[F5(*< +M6HVO+%_A4\ES&HYIM:*$'D.FB/5A9W6WJ+N2BL%$.M=IGDMZO8]\"@&P''@_ +M?"F-?N4V]W#2'&O(T574)>N.#()0_Q1X;L_LC*-18S]'.ZOTRGOHIB<4TBM5 +MG8-9B)L`&2K`&U!XL>\%Y?1<%1B95Y:.\YZ3?ZIKKW&EBU]-*.<];-')1#KH +M<,"*VLU+I1[@]X7,B()JN]4'&I+5D)U)-_\D2F+[8YWTBAJ6WD9W^7KJFD +M/I?[2-(](WE@`:8==%&F6+S\^]#!$>L]<2Z*@FAV%EK5/9DY1J%^T0 +MTIX=%R#L@>+X5P@]^DXF>B%'-XX@?2=_U(IFW_J$;.8GZC!UE7';RECAND@V +MVS3C.<`(K&%U?31G!.5$6Z9CMEL^-?)$O$(?=@4/\:GP^G63>JYQ;_OH7!5S +M0--EI@SO!'(*"?-6>@,8NR'H$]OV<9$[KE>NOC9S1O26V-XD8""5U?+6HAQA09+-EIPRJ +MG442+-N=0CH9`*QSF^IL0QPI275&(VC=%/:>?C*BLJ8B7A>[I^>)T*K-L";S +M%$ELY$"1?%QS`AN5N/C=1Q?8R5*#AOLG\,@("-R?[,0T8?4O*>C7_R!2-?%9 +M.K4!?UD6QS;M'TJI[,X$%E#(8.:2DXZ05;VP0(LAI.SOI8?C8:G3I6I3(ZN) +M2@ILKTF&:@**3O\0AZC!$K"F2-FO0I18OV\I+*VF]LXH[/]0!*37G-Y,E^AQ +MH9108MD0\'OS904R6`2G6*N&0C(]_&;X2')54]-15PHX>-AJJ5B\DS^]6Y?A +M'P"*"&PFUW;RFL,IZ@0TZP$X#L2A)\O4BN=JT;8/TZOP"FRC.4_@PE.$`IWE +M@61(O"2)'B6;QA3@UN`"G37'\*DY..&\&LOL)W-Y*E7T3O]!U.9K>SKN?L7A +METN>&/65ZN9ZZ:&-YK5_B#C""Q`)=V[IBO`CA`5X^QR]6]7VJ+N%9OH`/!G\ +MAC0&YG$LW5A?R<$^^1M!+L,9K1QK5]1,`'.RC*0'+^1*`D?6U&OS\9S7ASK_ +M&;OFT*)<>O`,CN".T.Y:TL9,,A-IRB'%M*+CK/J&ZR++'>&N1E<0MT&(J.\C +MTQZ/]EX3HCS-7"&E+EJ`6FT"XD!>-`XO2AB2;`?R7GE/F/AD9NN\+S?F'35? +M1D(O:52DTZD"_2,I)?\Q%PC9DFTTNXR"Y"#8PK6,-RX?KG.9OBUYVQ_?$3-F +M7YHECGB$208)K"4W?ZAAM0'\I8#\"X-V"BF+0&9Y4J%*!T4/`W6>RK+U(0=[T`$+`A]G\&2+9:./DE0_7_;2'!.Y&CW,&TG%.[B: +M&6M;J3(7@0&LK\.I:$U7K8%@Q%NJ1COC2EG-H%$9?77RBKMV;N,F+?-Y#LFD +M0EM"$I7UTUR.RW8/=R3W%V6-8&-:L_#/[S):[MN<(L^SA$["&TG%S52QP/FY +M6#1+I5']G^4>`*!_5DMIO29!?M_M4!.?<4_@FL9!)]%:^7,)\S-V^<:BFNHW +MR@[3<',1%>]U%(1:3)AMS:PFSO577TG( +M70C,5UBL^V0W#"(&F?7'K?'D@!L'HWW?31`(1T&W"V!R#'5/0#4G@"$OF,]HQ>FR:W70>8" +M=#5<2W0L(S'="%2G^.`<"Q+PDL.18;BL6_JY=`Y3Y?,U$AH:&X#Q>0/?$@'81GL^0X^RN)M0/H?_:,G]Q +M1E@(0J,;\)^NZW#@P7T8AGQ\3D>E,3)&*)Z"ZV!'<^\-<)D0(K[&_A"BQ69> +MFX=[3FO2;"GY!($X.*SLDF[9AU8_?L82#IMVU":UY0E#9XQ4N^3S$OZ23H`. +MBYW0-`IY1K"]1SNNP<$I26*1#LDR,9/0?IGAHV'',.B$^H-]6(^")6N +M-"VJ&6WOG_LD])-9)L[BCV7/9]<*EZ15X!\QB5443BR'\'#:F+==X3F:(9\Y +M0^1.I+/ILK(A!3RSO?Q+M54[?CUJC;%`T93:)+ZH^8>ZE//K?QQ?ZE.@NI9] +ME&RIX&I>\$3/VY1G+Y\5)F:"#>X,< +M"UNJXVT925OGBW(,.?LM82M`8[!&QM1WC\73O^!0LY%)6_LC7W)E\EG\ +MFB&EMAEOU\ZOS&1T@U&H(%B$I$U3"NV-K&6I7G156HM!/ +MBN^5),B\$?:*DTO:+Z1U.W2WOSY`"GU[@3"-Z(;&^!'U_T$F9>P]M9J3/**G +M;+%27\("A*.]Z6%D![D[F%+4AXH#?0\5ULM"ZI93I!`AB7!2.(_4]XEWM>K_H[`[6Z^-[8'.NTF^[>UDLQBI;JC'^'> +M,N*Q6K<`'/6C6W8#V,\WHD?[9":S@_T@3A+/\:53OQDUB:3-YKK78R]2^M%K +M#O=8_L;&7]BK*9K4JQY$*ULBD$9SY^VNHT2<=%1,SC7(6&4\BEBSN4&I +M.Z/SUPEAG5!A['@(9B\2%@V77LOFDN.E6$AA5(.:C+P5W31RB=EO"C!FZ'OZ +MF>=5U$-13,QF,G*`S6^-H."H.T7=DQR3Q^KMO`EMTG^! +M+ON3@U'0#'.UA2-I79A&@WYM8#VB<616%^].5J7;9,T>>PB$!YURL-WO7P+= +M$)13:IB:,AV(F/V4ZS7[KO_WVLM)Y?2_H`L=FB:0;92-:IK;,(VMINF^^U95 +M%NHA<5Y^IQW"%2C2VD,E^&XW39NL#>4AB7V98OWB[>2SBK[@D^>,UU"M,\>Z +MVMX_%6>&>,LB8RVT`CN\5%E+.E3$2$!P2!^41?3D*A++MIS*&0 +MU2V=_$O4#:DU!C9*XGP;"-#O>_Z.:)@:OBL906KU=/S1!04-F0QW7.HC:(S\ +M1)_(>'\J*!FY*W=)8&`KY.)H[I:SGYE-B$5:0L'.:U>"DY)5U8;<5=]+)LCQ +MDI8PSOAF(VZ[*J_CT.`$FK+3#N0!+C".!?L7D%5D`AOI$-]-H["BEB^X)>", +M^QGI7IU@%)Z>`R!T@[B]@57UI5TR3?F>5L'Q@U?2/C3*EJ166E7A@EDH.DQ2 +MAOH`XDLK74J[H!3\_D$D/TD&G,#J#SW;L_J*[P1@W3?_XDC4V3UN<7]G!O)> +M9T4C()FO`2IJ]YB+RLQU]"LO#>JAN_+5T,NK4?[G,]]\N/EN'E4>`O)^?=1E +MC2&O1-HE9**K\&-)_G"45"N8TP/I7)?(ZM&\&U1QR/2"@,G!:]>XM.PI7X#&$=TRX`G50=H"$Y@R +M8_7]])79.8,.(8R&T;#*`ZM&<#T["J$;![O%D>>X;ZIH:#/X9(PB??HCNXL0 +M%&/[N]T"GR`;:\%6U,\RFF6I.^;,DM(9HYN+2]*3H7B0:Q3N6CV-HKD!5LA9 +M,?(@VA.@,-8$\.X?LM(FE0=`3:7ND&Q\%@'GZ^6%:4AJ4>>%M@@Q@&`SHJ8E +MY%>N(X_]^LX]&WOUL$=`'HSX=W+>>? +M?N*2-H;CN=&UN/KL`Z@]ZJ>KAT_+"3F!7,9I!SK>[(#2%!'1745(3;^]\K;( +M^/$1J4/>K7*U7KHU?YE"!+SGK3I_(Z&NNHQT.&!JL%PI`T6%/C:F/T$E\X%@ +M6^Y5'AI3/FDG),LT"^T-!@17D](S3UIBI2Y^6K`CBUR&Z:I#9X12K>@.-3@' +M65"TVCDR*%`V73*E:@FF,>"!&596"RGR@'/IG"J@U&^5[`I$A,D9F'$[@R\< +M%7FMZA)3Y''I4]T,@8V(],"JS"&#Q2'3P(:WML:+#5"0:;&M')^.9H'V$"-/ +MW="L0S"8,.\%RQC"WM':18/A<>NPE^]SM7DV^T2C]OG3NG$PX*4"=+Y[K#7. +M&JMA9M8F-C:+Z))B,O-';?(7<&WW?]G(+'6UHDI;!.&(\+.<+Q,+DZR78"+# +MZ#F%A5K5*NL@!@(6SKK(DR:SOB.'X90C=D1@)$*ZGF8//1#0OWXC2:$_6[`T7F:(_GBTCY;%!&LX#"Y?8 +M$+8<1CU4X.A>I@578-@(DU*8'RKMN/2'3#EA^WLYO6IQ9K +MN[E>]6GIPJ40#E`(UR]DO`RF8?"G*6/=%IG*CHD>)/]E:!>%D\"!.O&NE.R_ +M-3WEG:#X6B(L[ZH/PHOS?U)!''+ZF/B]P+55FQ]E7>L]Q8*V=3:89F^\S2FV +MWV8J($'^:0REW86*5"$EDW&Z`F5AQS-49,!/BJ:KI3@/-)9!EY%()<)R#"^2 +M&4[HISGK`>%6I2_T#=WP*W%U[>@L.YE.C404IJZS#7>NK`^91>T0EHS+UD?%9$=>2#7VP2-C1KR3%/(G/0=$PG +M=R$RN"E<@1-KNOL=AUG0IN!55.[TNE-EN@&P1HR;Q3Z^\XZ5>M6(CF9DIQ5& +MI;ZD-QHK92.,"2?9_`OAR/7D;,H9L:U=]*U`C1(Y]%![,!7=@*T7)XHVN1V_ +MLM>\=">W8P>FV!UEEN;CC(5K*XUT5TSAY%:]=9--OLSEI2ZG]2FU6OO?T0^N +M.QZ!B'K>NB3KX^*H*6G@LP]XL+.0=@&S0D[3)F"FRDB)?(6<"-\=#9!;)D5O +MO;OD%#8EP]3PMCV))IT7%((8A3I)^=,E((Q(F#MNB]G\FA.@R-^US6R:P'XB +M2EG;3`*BZFGZG5V\$M8L[X*1_#>YV[U,.7!8/C1Y$O:3XU_Z +MCWWK6HG]?M:L]*YR0`Y"P.`)',F7WA#&`)*LR&3N)I?%^JRDG@68<)9L?M7[ +MD,CGX7/>!C7#P4D>C=9A>*:4@OOJ7D1JA63QL>0E0(C;3WT>V7[ +M0RFPW"!:#_Y[W2+.A#E7Y5CUL4N<)@(:6!BB>85SH +M#1NZ*1I*HCK^[W87$9`*$8)9$!0C/."6OW$%>AI4G2_5J&;I'7Q<4P%,@*(E +M#RO3A[8'GB_/.LB\[/O=6_M5&S,0!*2^V-,AJI +MISLC],1(&C#:7N[4!B)"IWNY!:%YMG""-ECO@M'>.2B#3?=]T +M\&SV9T+GVH[Q7#S&B$;#0EZR(\L.W*&_J9G&QSOM5A:$_WX,Y66X_6`@)5NY8)R)5YG,)C12^-BL,Z_Q9']6VNE/V8%8-TH +M:>3^@8;E/--]&,4`L]T3K/I..CQ0'-O[MW7?Y&0G4/01/RKN:C*]^#[%DJZV +MY1CD$)VYP5AJW+E72:Y=33NR?@%S63"1\(J49.P)J9R5>)/(ZVG0MO`6-Y&Z +MFS]G(]&HP`(1\[5,(""/*4LBAO%1Y.SN5Q\\3*5!SI[LHDDF,>2]5FBO>M2- +M0^`3P!5HR#M^5@91LO%"-_!C-5L%A3Z_/T,N[]4L(XAD3US8'"]:."LH=Z>V +MO26[]Y&OU2I7H<5XSSJ*U-Y&Y0^JK+L164AWS313F^=2^8Y>*`,K?7SZ83`1 +M9^T"+_#J*=I].TSRCQ,?"$:?,G_K[:>`--'?O9_6;3)'P>(Q8;74@N^JI?-3 +MUE+82Z97`[S3*5IR[XR9)^*07*R_T9[KI?F[03_P(30EDV^=N;$Z]T1;/QK2 +M>P`6^C=K%NQ<=1L,ZQ:^<8Y@(L=!):)H\5NJ$`/X6$2AZGO;MY6B6`GP04^G +M.X-9=!3[R$+1#BE?53RC>MW^)5Y5M+>[9L=3Q!@$J9-^.0NN\NA]=WF3&S"% +M<7QL5&M#U37Q^>-'BCD@XH6$B0DGY3**^_#VM";$\ZAA+"0ZW7=#@D#^;N@T +MA.ET&'5"`PQ&G&]I6OM$4D$$?)9,RX_9&UAHIN#)0XG]3A*39E+C/;P'Y6UE +M:B'=FOKAYRJPS+G+F(HH'^#P-#;7.8+S,*@%D]2HV*?Q`L3TG&,G$GVLN*E* +MZ`7(/9G8:K_;L(M>I_NIQ<7L+I_1E+!_8GE$6)=ODGD>+0_T"WV4B";WT2`N +M!S_NF"*-/5![Y\P94@A!]78RZL%7TGQ>9E":98JB2J^1(XFXQTBU[*R@6'[:9!6PUC"P\Q-(`^$N)P.-AU#PDWWD/N""^_H<6U`5%X_0,*VQ +M&_P=W1K)F795P?=8MTIDY(_LSDUJ^@#'"Y9SF.\N=+#@D$*8?ZK$!,3S2P=+ +MIA,C$7?`X0F7_41/\\O3UQT5CE*;7:9FQUI$32G88+*ON(9O.D]:A)3#UG)%&!BXAL.3#_\ZHXQH.2"->:J+#JB^#!VOFZQ` +MFKH7![_.H]=VOR(W?X))$2^7)",SQ#(Q\,YFT\!\-"F?B!'O3XF-3\:9\\T/ +M`L#]2]:KGQH3)R$1^6/A>#+GLQ9Z(A(,;0X6]'YG$`P>DN^X#3V%_YNO'B^K +MY5B].NR'1,+&#R;BI,C?N+UP7-`;?.4`RZX\N]`V()J(J.(_[V:=JMV3C:%' +MIBTL*3CC*8& +M"F%&5`B)1M;.X=/T[G@YQF^0X".FXI@HTBY.S#BF9;T![QCU$F&Y96PAIU9Q +M*KN+%+9F$*>]@D9X"TPSF*$!IY<8K7!*K\_1X'CX,;`<]H1S--&>]1%]]$M* +M:=X"QF_46Z^A#?*35IEG]_HO!2S\RUEUM7#A7E/F-A[(N(9;6I]@/Q)>+I;\ +ME1,T9BFCAI1W<#O3F)Q,'Y2467?.GI0<@3-''Y;+2%UJD?UIP?758&]`W1['-$V+(-BDLW-P2XF[ +MZ\<04J+R4`;*V-`?OLOW6]T8$`5B2Y"X\+@:IE?X+7K%ZR;&\%`0'M#'RN#.4TFQFNE-`I'G$(2?B'C],KVK +MNWY!\\383#.H]*1Z9YE:0.>L?C$OCD48!P85S6^S7+UPWF16%FSA!X36J*E( +MK)NE(_Y^0L&.A9G_070^^XB[9M(;^S87!(*X"+B5E:XOT`1SO.Z@'!1_TH=Q +MS<7+J$^4#E9TFO@2!:8KN"CRG=T-@XMO&\>M?UGS+N0VS.OXXE?)BV-+?&+8 +MJ$S?I!A@.#ES%M@4!VJP^%;?XFW(??1T.:96OGR@:&&>*N4E^1^R?!3E;;X7 +M-.T/8,H#;'!.);I%U`9`4LQK%,8V'3='3V2)[`C3PARWX5LE+"\@9*[1C,I*I#;WB,`-!0EC+%= +MY]IFYN,3G9TO(IC[$/AN;O.H!XPWM0CP,(G.F(Q159_E\.:U)MQ4/DWF$I+, +M0&&U(!JWT]XE:.D/QGU4".<*'YV;A/;E;M\H'UQVNREY:``?T,NI\N!_^=6D +MY$J_16EZ<)6GJ/1?*+;YR+:R^Q;)!,Q/0&=NT@M;I@HI*"V[K)F([AR5!%I` +MZ+TGR@7W&X99)Q,8[J-9,1ZPR;T&AF'.LSL5!$U<%"1/9)%Z2V[@Y`%-DOGA +M`KH0Y?H&82FBH.(RBH^B2RER?BZ^42^&'A0>R;!T205P%#1;/NSMW4BBC/V+;I +M;/@O7/K9ZMP<6(<'E4EZ.OY?HJJR`Y4F[@BAPGA6(SY9'M0S'1L_5BLW\QAF +MVC(Y4"5-)2?H83U8$DE;4EX-DJ>79-8A`^A'?#AY_.;C^?VKQVY5#4/9X$_P +MKT5@\.TO<%EU)_Z+ES?G-\-7DU_=8UQ7)8^[B:&=*D?V/3_[]<%9_PI@6#D\ +M2A[$K['Y=CR0MU%2)< +M'F6;L2Q!P^E#:0A=<*7RUL)7O96.JQ"__7N$330.QYKRDUF$NQ='0^:@0M<> +MQ_>@KV.O"-8X\E?K+LL?W[M'3#O\(CCVB<78]:-;3))45SG=E!>V6#3%])"5 +MOGS]15=&PMM>E+_]O23T'>=2'II'GMSKE8CJ/EQ[23J'CT;7ODFL*\'<.C[E +M(*Y._\L@]K@_'26\\RJ+R\X\IS,C8:\YKCK9\R,\L+LG'"3UN.'/^2WFH(;5 +M!K+-J)@^$O)I%^$W,/M.>N%XS0.D=:!L;92J6>>6E$#JHE*FQ9V!9[M;?X>P +M_>$MY@'/@/)@8@4A726@^TJ(I_)0:R*Q9T&[J/?_[?%6@TD8;5&_%Y=ULCBT +MT%"(AS:`%[M5B)>HF\R,I5009P.(-.JKZ-H/OY@5%:JZ2^1L9:-V;`>>VW$$5%55;7G]*YD/KB$,5\'=0ZA8D^CT&.N\H66EB&M^#/;M+2YFY+K^^[I&Q;/G"4%'V,![D]F3LAS03>MGJZ91>.8P79^%6 +M@`_/F!6DTIJ"89"^1N(PG9J.N&N1.YS-5$X=O]L$V02*<4^T$P[Q)Z.X]_GY +MCY$VV"9;!]><9=,GH;Q'@=]TFQ6`LV6%M4#)[H5T`P(O?="$X:#D!=;DBFI"8&[,C)3*N2W6M"7RO'!!G=P'\*W!@[4&I?'M.NJW\$U +M%"\,UL$^?&&\7A=>Q"R3W]VLQ`?@DGT+!U0=F8SFR`7PL_`54V4)TOR66PG\ +M>LZ%';W;2Z\;ZUU2OWR*`O?Z$-X;BKJEXP4AJX[\[^-5:?)=98DNSIXW>AB" +M"[P$CV8^(I,=3R%@<=2)/G^6-"))2/*L+["PJ%XWWN#3Q5>J6A&'FSB+-D]/ +ML_+NZ@F2-"0R:/ZSPW$"U7\+D@E.U+M6PKG[&UB2LP@+3C8]TJ4/#!EC>[#^_FCT +M,LK#;3[><*.NN_;$7C2$J4]%>5*#IOZQOQ7B!I"SYYB?G5<:27?R88F=>'S1 +MHFX`#?XX3!8,-?-#]OGK6:D?E>5S\`?1=_S/?C)P<9(&=/:H=A5ML./0Z#;E +M2;ZI7)WEF6E08(P(P=P1QI_;MVV13CZZ:R#&9!7Q@JJ!/Z)MDN]P$:.Q&V20 +M(7?+(35&_#L6D&\@5AR#1V@U3LU4.Q"1E;@S\\%4WRH2-N$+.-'6&N<8QKW>'DH#&GCW@]5[^SR;S#`U +MJ744'._J23'6E01S[?").@!;_^%80]4FOR8:N^*)@\>/B&Q5F:="!J<`_ZZ4 +MWM5$3&QJZVT&+_\.PX=&!-K8@"FI&65D*M+Q*%._^W!J6WG#6!JNAL`_L1]8 +M^SWA1H.T6=FJY.PUORQ[>[RNKQ/GF1U+VKX1P6R5G71H`\84!O +M*;NWA0%]W>!:`FLA];<$1(1&A1@MB`L>1&#@=VGO96[C;[KLY<3Z!$P\%N1D +MBQ3V,R%(5P9EC&8WN&I(IR)VI;#LXH$_0++(UVERZ9'\IM.4G0I.A2%[/9)B +MX:/.KN]AS7K`FGF+9IJXNK87C>?Y$U6;B`;:IN8SL9QYW/S!68\&\%O^G$<KIW'9EXGB6C>OLMPBPUAH!G2M+:C4!XED#7,\B'7<`!`\]);U]3-&\2- +MFTC,=GVT,)ANZ6"(A.^#"3C:[`_+<+4`8VC'`>-F""3)VQU)NMQ%[P.NLG.H2E8ON+II`;%R2C$1L%'* +M2:;NSLA2Y"_:&8($CL9ZX$JM3V&T&N_OT6N\U+;(09C09&1"[O5KSN/L +M[GN`A'G62I9ZA\!!C.3.(6D<`1I42#$N3B0S>$4I_P#&@Z5'NZF2[,MPQ1LW +M+E,T1M7JJ!ZV/#%GT.0$F2R,[4`&V`!F[JJ)807AA'VMEM^2_'&*< +M/#0CI,>E:RF5MDZ[VHOBIRN+=C-^C0[==8?3P$5W8PD._H-3@,#=.O@Z +M*1].4A2K&CY>-1W/VW7B7VV981ESW`5_FFH=--1SS,3U?1]E?80/@<&`P*$/\OT9$LM;H7]JS\G@:1.\:0<[YJ6?ZB' +M&`7DU0?1\$"']$Q^>65*+B=+$=:8,&'JX6GSK!>NJT:-B?O3#ANE#V%')1=F7IUCST(Q,1>;<;/8KJAJ +MM9.;$."V\4ZS<,+4\NA8*P'EG7>0^F\Z$N#23.7R5ZI:.:>IG.P6S$)9X7^L +M0H8%`8W^5'"?\3C?D>L'%<&:LHEE@G`02([CR+\#DX)+2G1_0!#(@=NXDU68U!>C3*3(AY5U>%/PEW(=`[YTZ]CD%N +M_FT2J:KLI0K;C#$INRN:I'-284E8K@`CX\>RGHW.*81=OR\Q/.N@9U*A_3H[ +M?3%<6`ZF[1Q(XG.9=$E;MHS)NX2O+=6F70&7/!!H5;Y^3IE/K=$U +MXVET*/1**IO4?5U?W>?@(ZN3)A[/1@NS%KK`055KZ31A>2"Q)A3;L(2VZ+41 +M[,YB"C^A'_'VYK2W +M_4'IDY>0N"`CR7;!*=+?8"BD^&V9O4BK!<>"XP1?NA(H/W +MU^,2./L!1V.\;0.L$N!^9=;PW6G_)/=JK0WG<`J;C`S;E9C@JX`K9/U"!A;? +MS=?=/M-=7*4+#Z!_6(GZ=CJ'"$1%Q8M1@=MQ7[$?,IO[P0*?+S_?/7"3_CQP +MB(U&J[RU>^Q/H(EORB2F^RUZ++]?,\7BO0BR<3N;Q]4-L,T4%=#$L9RF:?37 +M7V<=I9VMTYJB*>18M\;NH0H=B>8[:X%X3)[10)B<;]$4!S?NG`\_]RJ +MJKH8\@:RH8,E22+E?DGL+-9VZX^O8 +M"?0N#CQ7C;\U1IXC1&FV9*6@"T4<2B?'N]'9+S(6_#$^)2W16ZVV.,Y03`XH +MA%E^X9I@X1=$(#FBC/#V!`*",/'^15ULR*K>)S[(#[C(JM)UJ_BY2"NNTWBV +M-.0)PI_A=\@WXK!K!TE;2N8^^LOXF2W+!DQ=/,+AL3O>S$)ITL7BD!?J0F=D +MJ/>.;O9![[\.>+5;J!:9""@U?Y.*F"X87.F-YM57QML%K`AV&KCP\9:IO2"F +M`D\MT6`%(%_I1X]6\G9G/V%)3L2$9^0[ZE+:I1)^7\V5:Q!@?"G/"4*B="0' +MK]-'[*Y#S1T;10/4+21)3B*FL?TGFP*CVO69G"#=JDW^6?Z,>%EI]Y>P$QEL +M^IZFEAOJ"'_4G[U +MA_C04IK/@9N"I%=B#._\(VKP6+9K,CV)1%V5ASLM +M2O17'K](VCNQOR'167I:=KS04^1F$X)&=U6U!T290",JD@_^$2=5;CKB:%K5 +M!_FCWG.8W4N8&HP64<>9^.%[5Y:;.A+(QD4U$G$!F.$JCI$Q>Y9.#I0S2)_H +MY.;KOL] +M%_HO,;?Q@&E`;.\Q>6"_RTR.^_NFI6%ST$H][,*XX3`%ELNRR^LE0]V5C%#5 +M'97CQAW`K3&2XF'^QB=M6PU1%#XAD[VBYL?'R.)PG)I#/>:&SLJV%:Q7RX6- +MK.D8P<4(GI,6_V#+%4U0T1>[.@EC'W0@'85GE.CY*H$^B+'5)!?S0H/\^[`LI!,[ABY][B6?+&\0&Q.L$)94-\F/3204$#&9"JK +M=6!Y!TLOG]B29\BJ==1X04H&1C!4E7N-!$0Y5J-,KL1@G0]">S%'TR;CGD9` +M)J$K6B**V:7D*RH\+\+V_=-0BS)2^<><\6"XNX3&B/AW\(DT,T_#06$D((&2 +M9W^K:N>/`O5Y2VI>7GVVN?=&4 +M*]XF;(VE?W9&44>"^SX$A9]6XEU7,A9H3KU[/.)F6?RDW!OXGS+/8H\AJ+#" +M+01-!NNQC7,>7=6)V]/^.)\SY9#YFX\O'(!/U3#ZLJX<:40JD/Y`+9DQC0Z5 +MN%!]]5[H8X@W=+*RWQD]UHMIESO);Q*JDWD_NC3@ZR\]WYRX2$UF%FE6\*08 +M5>HA.RK4X+Q8_W4BE9UDBQ@?SQ^=UBXTBE).$X'.!2YUB"6&?N`[7%I8,%6E +M>:4*'!A7^L7;:)/H+UXMHY-PU0DJQ[AT%(F*M?_1__\Z/X,ACS_N^=K_N5 +M@99"TW98K$+L/]7?M$4>LZ6B+Z'>(^;/J!N#;)P-YZ;N4BGY(.%WJB +MA9^\-YJ32K4.//PJ/YP\?]*I\)6N.E7U(;M8J2BZA^(34@46'(M%/67>5^]@ +M@2H$2-4F]AL9S^DEH$HM<-!F%CYZ]!7HHKN''Z\5\4NAGKN']@,J*M+A"RC& +M"M^.IM,+^QBZ*B?_>YG1V]DD&L+_#)EF]>S9"GD6$><#V"FC?MG/AE2D,K,[ +M%,87:I?G3_%:;>"/EOC+/4OXD@!N.<]]3Q,X>I&+Y2*LT\X,19C?#Y[?.H8. +M70S9WR[N#AR?L!AC4?9.$)DH-]"L5I`MD:KEX48I8RF@+Q<:Y1FP23/WV1GH +M,QQD;,KBOVZDDZ\MY-5)KT2"3$HLT!AU`F\CPV9NIA'/#]W/O\:W-E5<&J'0 +M(>_/X]93[\:MV5E?'^1XY6$H=TU+X^1=-W3_WZ@6;\]4C@111`="8#8,MRH_ +M=3K,"M28=\$\3?UI[]&GF)N!E6?Q90`TTZ-EL"O54HDM"0,L68NSL.;@3T#( +MB.(#A`S1$R%P:M)CXZ?UMN`LBM@)T'YUD&&\=_L5Q@,<<+65E4NK=U6+QG0G +M,ZBM:C7PXI?,=U[SE5L@<1D3,,OTPL64ZMY[Q.H?YI8)=:ZA^9BQ9.P#/MOYO/Z26(1Z7B5;*N.7TLH!BQO2 +M@3IUDUO6`2?)*%%+?/O,UMT>W5BN,.W/GG,[AM9(@F@J"9T9].,Q"DFR<]9@ +M92W"'/#:^-+UQ"?*$_"#JPHYSF@2``6*U]$Q-Q]C6N6L[)FX.`XNHLNV1=-A-SZD)#]7>3W?RW7]_M3C;Y^LJ8]+R4)' +M31G1'H>.Q]7^5LH4VUJS@'3@59+OTY__UOD4/V;*>?`5(T!WMRYO6,D9NT5, +M`J">$7SEJ>3IW7LV=S-X(_69N793OF^:^XW95J;E7.*PE0#6_L*75\'!G\Q\F4OOAUS.L+E +M((<^0+Y(_-QT`_#4\=#=USM7NJ[-0[%Z3`$*-L4T:CY"O(X&RB;XY^@3".3T +M\0]&_;!UH&1&"U=CRBOH@QF'>+JK\M:2SJI:AQW!EEC4RPX2D'5/E-%<^#GV +M]5??G#K59Q>[(IQ&<,5B:UN%4F$:N(_&Q?*)XHUF$H21W%X1=Y7L4JL(O1". +M?&*[ZJ/GG()(WS:$PO/3?>=[DU?'/;R3NB`8ON]!II>U22.38\8%Y^]5UM`> +M'Y:OJK[Z)2<)`O,VLHL?*ARE1YJH +M;VUMD_O8P_02P_)J/V!I4@XR=&@%XJ3FPQ%F8[Q2BHK@8$)`(YL?7Y.PBX1, +MV%FD"1'V]:5L$1A=./+"2J<)XCC[@=5G>P1&4*+]]7)+"=-D.'LE"N#+D^;@ +ML\F)U2)W6T`RJBRB0?M[ZJ_7#F,C1]W?__**`^%RBFFV-!1XJCN)@8,4-,`; +MC&T6Y`^C;65%CH-2C9GL<',[ZX2!P2F4*(Q+^&,AOI_-Z."M/9\D>6".$3SUM,CP"&5D,$)QUBX=+I^*5-A@ +ML@H+H81JYM0E6*]3@RC^LN05Q,Z4.-/+@@9K.<39?]_@(^N/B8V'W +M?M%V=;P61E9T8HF^!6/S)P^@G+#=H#:[%+6#5/IQ!58TY=NN%7VX_JMIS[IE +MH$6S+&=CO_UUO\/W^=/*KI2%#8C!`=1OJO/[S6S91>57!'6",4/Z0X*[5+\B +M+_""BXS.*`7>,5$]A,;$BCJOJ,>@XZ^L,$G4/WG)K3RR)&T[/")$25BYY6]L +M%_B\K&\H+06TPQ%G^^4+X#6(I%H4PW=Z#O@%;FT;>)[.$F,@QG##8H\=#Y'O +M:0L'7(T3*P%36#)8V/A4.R"SP.'*>/V\K?0DJ9Q__7V[V\F3`JH;90_^N:&W +MEM2TQV^5^ZLC.4^BK="J>%*X#@+Z@ZA^A'W;.ZP3(4GSY;P"@-,1_[BG&J=K +M>>.M$S5,E/3!R\;.^,SCBA"S7YA!4,T0/LF.!`)/5#)6:1;&Q]ELP4X_:LUU +M4WR3<6;Z.,]Y=JSP@K8I:8-?'$SQ3.[=W>^[K>9B2`^OBFO0)K9?]53;DU$W +MNA:"JJ`8DB^9`,J><9?6`2`8PW]U\>WM:#E46)7I0#R+7WKJ"Q\["'(>L)J6B_@+Q2R#@-9;M,9L.Y::+X:N<$AY_['@F'HHEY8RPWBY%0F +M1PO)1F'P5#5D&8EQ2VTN$5EG43_XCZC8J^ +MZ@--.2)P,=+`K!FM!X0#T_WCN7=X8GMFRXK[3_RYN#H'</CP6R!K5F(MW%B#9Y;7K +M4HC?/F0:K&YTHW6?L&KE%5#1O,X:>WW!;8/`[GV&%%M#5@^T$R^DD88#G+\D +M$!!I^8]E"[8HW0/9$*56^9%RGBJ#-/QSYS/L6SC!"(7Z6`6V32W?Y`M,;1(5T*X[4(1E4[Q +M.Q0;\#!2W>"\O\G]4B%!!.>.GFG!798B.S<.[.),E8.:1_\@4+):S^*28H@& +MD*T)AK+[M.6J,J3<04*D#Q?][2[L1&YP:$3?A\+(,RO5Y9TO:"8!=L?]1CR- +M/JQ5B1W,'NGGK$EBW+,OJ(%J^AV;5ADJ-NLT=Z;![EC#I0S[QZ1W%@-[N3,X +M^[=1E1P>[?SD8=@*/[O#?>J)^./@QG?3?]SZR&!3UN?[$+9@_ZTU3.[FA?.' +M?O?`0".F2'.2UA3\<%\$*Y7*;JCN./A=2K6)3RT^7;,DS"+/7*5Q\K-9$6;V +M/?G0SWV0CF:\X8F9NG-5U'&;T@DUW=[?7N=8*^!(F^P\=''CB?B,EJ$=*CSQ +M-^A1X\9W!KGQQ?;YGHFQ.63Z#DW038C,+_*).?VJ=4-%AIQ#70@3\FZ39D", +MNJS+1V7@=LF.<.!>H^[#OVSEK#$5GR^Y9S`R.+IXP`/E=;HOEQ^N9N"3MZ"_ +M893-C6;)#]#,@J/]DO9V:"$='4[S.H@7"+!-,Q7>UEQE+& +M\>G@$TG*<5GH9,A)Z4U>^)VL3Q4)FS@->1?9QV%*R\ +MQ(C[E[8GY_K)"YCOI3'\F:<6I-88GYR#G\4MX&O/K^A*S1&;)U1'62[`V=U< +M/N%QD30XC_SZ816^/_KTG!9F4A-O.?H<\!`T;RX:Y#=[HN$6"YWBPC +MGS#8%`U&'3Z*_[_9#"@;]\$3-(=PMEWD8T6:S]WFJT-!U$BF;41L2FO=* +M$_:Q'97)D4/DNYWWK/86CEKR"F:T1*1FY%``*P?6Q&]XGEIAI\4E*\38G5^` +M1RG`Y[AN&+>P>!PJ](D882>BPW[T^=YFAG0@YMUKZ7?KG.4(/L(TR?-6P(P] +M"`ZYQO9Y:MPBK$6*+WZM$HU5.(PN_0`I9`L;#$(A2GCKEJ;*JN$K)#IS\>&< +M2R2S&&?S7RGH;K"=U.D^UWI-7"GXAX5J2K@G$\^J*=7Y`==V(]P/>5'?2!R" +MD2#+CO/\@M2GQ#[-$ED?EGS5QTW".L/JON`#X:N^U;GEW3.BZ0W]4)"1698) +M!(\D.P?N2GZ31(;I/6Z.P99;%_R]%L8N'Y+Q*!45#4#".*C\O&D;''ADPURW +M4/2QSF*L +MX`HZC;6C(9;WV0_7!'3U+(=H0;MTOM+X##[!M6(5>Q]8,JO._9G!JX@OIU#&_13'&[O7X8,':OK)=4=_L2BDEQS1]M +M_*WRI7\9MZ7<1Q"!&5#LZ'UP39]@0%M2-#3=JLG`^:Z?0AJ,1APPJN>#DAT=7>^ +M/DM".DCD?"^E[-2,:\)O[X2+(:Y484_0K7MP/BL/EO.[RYUC5T:5'`75/5I, +MKLV0T53+Y_H%(_U5L4"-'?]+#^-+N7\AB39&T#\U0@8?UVQ#O;_IG``G8:9. +M`NKXB1-\*S!_CC)T[9TK/`"61B$MKAB?,FA>`2YYVS(T/!E +M>YP`WXRQ;Q8DS1FGYZ>RKI[!<+H7PYM)IW]?SUH-48?>&U]+8!?N2J<6+E2; +M&Y2(V/LAEXM&6"?QXGE?E27EJEG?U2C^O38-?RUAX7H"<95<%H9%W/&>,W]K +M24\[9`2?95[G"J&UW.9_\OH!/W4I4I&AZ][4QX3`R0_SG4)+;]%JC+,X):.S +MEW*2%,IV&X+ +M'SJJR26Y<+/?70W]?;`EOL^D_]9MHS!J1IQ1*]U#T.H2+3#?K-AE%!L+PLL& +M:=M&'T>>&_1<[Q6`RH/*6VAS6FZG8YHT?Z'^X/PB>7H#YI$-;07Q.E)Y'M[+ +MVYV/"U,SOG9;*L#86>U>`1O(RT^#+(!>P=CMFO7W1RNN$!\!\ +M\G>N)8:X2>C57,V@B]4VX7%0RN!5.G;13T&2G(5[UGVW]@P,6SOS1DPW,RBT +MD8D.)<-@)L9;@QC3$GA)K%L<5&UOXRBX]U)LBN5W,5-*\D:WH8DK[N1R`FSO +MH;:>-=)$\K:E!/:Z?^=CV#[)O&M$M=9Y_C'+YL!>C9_ +M_1PQ7\_7C>V3&$$!QZ=@Z_*,$RA.A)6WY#[=3W9`L8?BN*#+A'.NE!H'U!F4 +MK66XD[.(Z8VC`$\T^BQW,F:7RU!_E);\!.]Z=ZY@D=WM6[]UY2M4/L%YK$WW +M_HV8PQ:\,0Q]QH:2O&L'5[G$E#4X7R.(W3K!'-W=UZ*#S[F*Q)F']&,(OJ"H +M[ST;GDFUADK`Q&!^4X9HE79AH.'AN%:GG4MX.O"3%SS%`L">;I`(+_:]CA0; +M#V8""B+1MOKGR$M$O%=-Z].Z=#2MET`9OSCI'U'9;,,>.H;DO^Z(OS5S?'$- +M&/=[&X=)AXL?1K.`X;&Y$7-FM[VN6&ETA'8:PAA&R=9DE>IKTXT6NH;RV98>O/"0`@QA +M=3JC(D@I?!S,9J,.[-Z>R^)U+IHM=R7HK`0E/Y1IK-=&,%2KWFP4J+[>=@\4 +MU];.VJALJ&2^*0E@6_`=T@'_T.(,4V-Z-@C58S_)&83:VFQ]B;#P,(HU<)-I +M"E1W3GLX^%T8>EXR2X>3#0=3SI@_6:;6/@5]%U0I[J]OW*FW"^CO,5`V78TH&#-$OZ+Y0VFG"QWFLC?3$L+]XU70C?"AKP>CG2C>%4T_`R6Z\!^/36L#[[B`^_;M=NX$I[`%X"4;0M-%C-HGO!^:9I]2=X.Z3E$[N&">0LZ +M:PJ-@NF2*,!O5:+E.JI(SN[`TX*_,WE.CW9X;2Y\@_6(QM'B84SG07Y=?E/, +M[T)=">*-\1+C-=`'KJKP_2QHPT'>% +MV+B3`\M(0Z<\9`L +M8;C%<]@+(=_^`\?6HL)N:"BSH'L:).0^&KI%KA!#@$FP[^F$AH(U%^_2JB>H1^V`7$]X$9CA +M"^?/K2R[EZ:;('!0O/]/)L93Z3PL!W(#EB9#\-&5=$])<$MMTTI%]Z"$/H<139'L=E]C_S +MXE6/VSYLV"#)0RJL>H>VGR2['WH*P",JC6D("PI(^>T27@D"*B`GYB(R"\OY +M.HOV^ZMR_@CQ_X"6TJG@5*!0U;&6^#"=]/UIU((6@N.\2OZ0_Q0(Q1!6@&7S +MZHLE^T_09?%6?1]>N%*C"#,".:L,5HG%T<]'/!_EB[("7"=]:Q*C'<+SV1,I +MVTB7,('?_R+2VNNMF"AYH"8R(-]I-:-N!O%3QO$%!^9/%H-Y*-H_SYJ1>PC' +M:+ZRM^PM70J5OS#WT=,!HN6?@.%J!` +M(:%3AM6G"J6K-2S1Q@&8U;.I)% +M)_>%IK/T2_JR-1WKW3\YO?.;?""'8MZ%&*EX0OO)K6WW62:X\GQ$CS$E.S-I +M/"CBT(_\(E8J<8;=M3W`T=OT1^@X(I`(PW`=1;4'+021KOOV4P[# +MNEGT0$?E+E)V>^:U6"6#0E(XBRG^K#2?P(LRJA[XGGMNIJ)63Q`P5`UF](D` +M)%9L=`->.G,PT*G(?&?^)4_): +MY$=)7`!0H5R?PA?+N'35G5^RL,]B\1@TMT]+9HSK2S=Q45[P,AB:\E.=,=N"@&#_"1)+'(S_Q4OHT8ANDO+-]V +M,U!++H*9T,?JQ;*JZ"HJ-8^TWNE_#6*9],U[H&HPE72LFBB-9K0H[M--$/M)*='92<`Z_BHUSFW8H&F6:.* +M;-K#"Y6KP$2^XGO\PW"#F`^!_QGBO]T>QL9WJ[08IOI@= +M&8#."@-ML?M[G''RZDS$RT"H5ZBO#/]O](Q?&/-83H!H0J?=UZ7HQ+6'0554 +MWUN5B>UUWMEH0/%;;F:V0IPI'"U`G);R.QN\I')G>;(R=0,GKEZ^-@,"/8%P +M+9J$3I#]?[@@[A'X/:94/!9M#"!/2JF4;@=44I4/`Z\\JQ'J5&RMD*]%%!R8 +M4V-(*8.COF$[[V&\UY#9`Y>E$PU/,ME*,=,*QZ35E#$&9JPZF>BF,,723&0$ +M;"$?^W;M>44=#;#`8'-N,/%!BS!=T4Z-Y_1>7-)'W+%V@37('\FS0]/\ +MA[FH"'#B%H92>-'LR=V11WJ$.:7;)\4"UW*TK2-`QY$=!)M6(1UN_C`\'PZU^D[UN_VE6[[4Z# +M:X88KUR`6;`7>Q4<+-UP/Z6J'NBC"FP.+@F7#/^U^HC^/N]]'1PM+TZP#4:X +M//W"+SC`[F&'LZ/$Z7HJA2.8*+XR':0%Z/"[GFQ2,P_WTD7KHR,,#C<^\QK*J)<%]2]CP$.(X]V]UP2BK7"ANC\B$$@_"R/,S-! +M]VYQ9*,-O.C%\W'8:ABY)-TH$^.RH`)JU)S?3N6%U/`([:BP(./FU&Q;&IY/ +M[NENEJM8:M#$5IKD27+!+2\L@5A8'+)&#L1`_+$%VV[,EEN\P$_`K@"36+_H +MU:*O<>HG,.N&[C+AMTU'H\W0Y?B]A"?8B,R7T^5<\R:-\66F^MJ +M*&H!Y8$"G>3"4-,:L;02)!-S2D9=CX5Q[RM,)N?CN3^BU.H3.+2JR)].YO+, +M+(/'NJMU1-?I9JE=B8`*?&IXNM,72PNT)>#/Z,;E:#3WT$Z6:=Z`J!_I?/(0 +M]9V@XLM<.E^8+3=4('ACEK!U'M%F^0GYS-6*'9W5F:$N#H=NW`$2]DA04LQI +M;8,8K4)L<.0ZG^H-*TH,5##\=]&P+!.B8X0Z-_XQ7.#?UI47(9C,%[ +MA+LF\K7_>B*<10HTQFCWDKN_BF3]RG%`AB[#(;#P;\'T/D.&M]3*,GI<0K*' +MB$]L6836;+`<1JZ$3A904*`#QN\7HZ>>"ZQJ2<&J"14&1?V\0&Y1/?*+H)C2:=HS/]=VBI)6G',62&9/J96J^7D"0_J)^V%G7HR?9Z5Q$WO0%@<#- +M#E&^L2^`K+C8<,*3=(0,:/4?)&>\^:ZG1H)=5UT?LR.K(XW>`Q"9SO3:3A;_#IRLW0D[*VQNIHF,K@8S)_$0%!0)3$XQ2Y>B +M-E6(F1288-F3U#`&4=V\,30$&N0?35Y$'7XMFR*V%$Z<^;ES=.](2SNP@:($AQXCO.& +M!/_TW>2K.([#,<7]+E!`@T2*EL>ZJQ>A!8I4:5_:24IT+82Z32-9RD)+V_*7J4>.JMV*S +ME/)LA7JD,L=.`F:FGZKDM<^H.&Z1'1;(S3616&+RUGQ9_8`"U4=OU)DJ@!Y,T,M[%1NDF30=6]I6[.PD/CDK +M^WD%9VB&&SLGV;J""W@"Y\L``:;^+]FS!0ZD'H%S>2H>T%5CV4 +M!]XT@6VRLT)4^L`PP(-T(ZL.K(CB^7*@ZD[PXK#^-OP$R?G?S8@)`WGOFU11 +M^7$8M$?JI73Z(5R`H]AKKY[#C,%'M$1([I_5,;,A2<2S]P5^-<-(HY2OBQ)X +MN!IXN-\2:;:UT\,@.?-N)QP$-(Y9AUNQMCA\^:29>;:!W=>$]NH3!)>TT/##T3_JZ"+E$1/P_6_O0=HX-630/XY='P%"(&`14J6AF% +MGK:%PSOT^QT7?-$)8I88]]3V6&IU3TS(VGL6X]>+=+\)'JH6#_0/RR&G#HW* +M:1-/(ERM'C_V0YME76ID,2@>_$>U\7]!V(#Z*21E_!JIM5Y0!3_,<\BK@**" +M*Q'"KZ:=FQ_O596<>8Q_QO0ZBBH5AU#9XT%34^)NC=2(]Y["AL_5._XH!I(7 +M4P)$)4KMHMCXTR;^.\21,"3A``=H(`>SNQOJV\S)_:G+LV/5E?B1T7^4BE;% +M>C7)_2'K]7)&P^S(9A+#IQ.$'!S_>B*#QJZM+CK"'*GISW:B"NCIA2.^Q38> +M?B=P29WVJA[8:/Q1PV\5++3[O3EY`&[J8F484]9A_%0<:BN^AD``Y/BOZ)TN +M:FD7UH?]7(D1"7*'3O-9T3R4YU*C_TGR"474I!25GUBCWFG-H<2C*4#_LBWD +MS+%M$YV,GK&N/_"-G-0]J1U:"PC^ +M#;O:VTO1FV;_I`FCD[[Y)OS.I&]_=^!VZ?REC3[V:! +MS(?3=VBJJ.#VA]ZZM&W-@-&M],EK-!/Q<<,O>;]+JCQJM?XM`,#AAEKN/U=B +M?P)M"YM,-/)*_J\J`-#9*(2@3^ENI\>4&GGD;M=6KT>?%CS6F^QRO[H>%@P\+4&46&0+GV#:\$.5Y]-M] +M1NPI!Y=_J0IE(IFOR2R5F%N]-(L.O4:I.[A[XBI$?ROV(2(2A@U=[V"W>,JS&^DG,$>\1.;>5!O.7-[5>J.W%!MW,MLVVW!Q-W4?;%3! +MFKEDZ^Z/-7M3U92D?Q,6R#,7&?):7@U.$\?L?N'D95*#>9;5Z>?3\S3M[IP< +M[CIW>H#J>R1THZ"#DZ4BD[RXRZ&`'=)>I''3H'&>)J/V38ZO@![E`#Y\Q3`/ +M8?&""YQ-W\_WVA\/2,N;"EWZ%@+M.E="/^4@MA-A-]:S[^\51_=W(RIF$U'` +MP:;_IEF!'9@DD,I=DQ:12)\IW+'DEQVS-U^I2,^S(9_&?,#<'!AX/1:MHTZ4-A[!BQ#'[ZJ!#:^FN68I0W$'?6%7;4-M +M#70$[1>M(GH1H#@5!7(T0K9:YR+!;YXB1L7U@`]#_FJ#VSQ4V(B;P<:;_B6S +M;IFS`IDW["P$/!,NT=.O::E"FD5FDR#1M!COT:P<+$*+++QTB'G7GD6 +M'U/%Y(GDVS!W$UR?SNNW1;IU>(5Q4A/$4Y9+D%]R&1"%>SI^BUVQ'#&BH$OV +M@!6C/V%_4Y2%8'Z?8"Q^V[''!73%ZYP8!!#A%KX:FC3=U,N=0OCW6*3N2;QQ +M4)#N;%C(S]$H;FH;,HC2/G]@5#D9\7->!N7:A_))IT=0L?Z@0XC"HK!\G$A\ +M[FC637[>>58'-D._P'<9L[GJ5Y34J8(:97FOU4KBO=CT;[R<_)N_WMBIUP'D +MGRSZ-T5J1G,452*$1S@NN-&"E'P2@DU-07L]^4;&QQTXT$<'D:`92N*,A+Q: +MB-P_[$4?_4M1Z[6=V:B@4BTZ(-7$GJYB/N%ODV!]A(DH0N-?Z^Q`' +M^:BWL!F5^%+,5.F]UYF,4#>SC:AVZBS>:>^1*.(PL-ET61GNOWR`H-^ +M`Q/,0R,.J;;QWY>DE`G#L+X_6>7:@1RGWF]W>X7H4`MM03?Z`,R*D7;`Z?]+ +M0K-:&@0",>!&%J@6`K1*:FGIL6ND?W9(DD81DFJ$4,^Y^$]G]!-@``.68[C2 +M3JR_J\46;T@HESTBCMI2'V7=D(=,RQN&M?.VF'!SZNJIQ+\+IYNB>KU+RXC,EM0&+MH-,[7AN!\QRY[F3`& +M5SGHPE_\Q^HI%"8$/O`Z?UY=VA*<;&S=4BW!/HN1=%\D]!A-:,< +M9=\G85>,1)XZD)A!;?2U-PJA"KHOXJM_5$]!NA+5_LM1TL`OXQ,4=\^)PZNS +M^4?X*D9;9.UK8FE*Y538!$LA#;36>4*/U1;YI.WOF84XM5_IC,7/[_[X)QN% +MA%*EQB(9?&..T$_@NU@@4K+/\,?2-(IQ[OKO]UQA#8(6B(D/C$<.DC\5.J/F +M4!O\=XH3;GOM7Q].;JUD+$(2-43PHUAXP]+&`)HZMW=QG]_7[ZS]/-\S=QF_>9F:1EFN3L')0J +M;>_0;P(\\#,T0_,]/=A$DHAJ=GISK1OW(^73E1=S'5:0*\[C/\N%.4".?4,( +MI^!<2\5=U;P$;[;$6B#".KFP9G]$+X[7O[7#Z[4PCLB!5'U[-^\'E:5\U_5^ +M0632ALPGQ5PVSM+WZ3[_69-452)P_K7#<_/MC6S`Q +M,4NS_9DGRY=WD."2JJM4GEG.*8-?NRW3M).P9M(2I)"M&$BP9T+M"-BZF>A. +MQ!'4;:'6T?R^PA'V#<3TRP,_*\7XII^\7+Z/-;#]M$%Y^(L%LE`Q-\).1?RV +MIHX7U7ZFM])29'!CM:(IL'%-AO9/5FQ`H:<+QAE]MDP*Z4$5^#E\QB5G)J@E$A@>L<8N+7>]<#MH"?2S5F.PB?BT8GR]1E;5"B1^1' +MJA7,R!^!FK$J>5L[V4.6`9X_E^-/WAK%`/H4[G][)W'J%ZZ7.LLI7$=W2GQ9 +MX5A!&HGISC'`W`9'WQ86ZMJN#-5?H(XKC\MCBY_9?_P`3RXXXU*6NK@N)38S +M_SRV1QI.YU(J59V?R^P\^.$Y?'G_NM),AT\EUD(X-)86&GW/=%5YO=-=_<\P +M_RQP:HEQ:UY\%+A4(41(ZTB5@/H3K#99;T;HKK^'SXA<%"\^N;")W`>>1*1L +M,YB")RF]XW-H2^%@_A"&V_870#:R(=R'TOG!W.U3=/T/>VR94)_54B-X0_., +MTH.*9)_J`<-E#CJC2B8_&!.MQNI)\H,S5!A9=,J'E:U2QI@*JF_!8&FB@YPJ +M6"OPH*2/(IH.8E:*XA80SO?5O\1-('`/DWI2U<44P+#[BDXJ5=YIZOZ#**KE +M^T6'OX!%/:7VXX.N\VY&'44$-I[[935J-C4E=ZEW[^@*D2^J(Q)?M!`]WB)( +MDL^/8QUH%6T)ILON24OFL?X)EGZ'.E67.L.99_;,-:#'`\K4$RF:#HPJ0F*` +MV6#N]TV\\3QS@FQP'.#^9GHI7FVKQ!%%Z.,KUH%R*I_B8/ML5IP7$QNZBJ%V@>>VS=5`&G#XO1O$ +MYF0%:^'F!L-]RZ#&"9HP=B3-P*^=9HWZLYB9#JJ]Q>=G/Y4=F0OGRLR4;!#4 +M?;K)X!W1`9--EJJ=#EV)_B$[5^L<'L61A1(E!.Y`++_)]8"=\*869A-1ML/" +MQ)-^[0=:FDM/1@:DS/<+V@B0$W:C^E!H(*-<^'X,:K9T>O/[YE6AM`\SZ1'- +M4.M62VC$#$Y%<4\ET'%AXWJ[;240FOPP$4QH4QB*^S:MXREMB.+YON8CHTTA +M(EU&A0^UE%QN9@B[[D<]$Z@$0*Y]F<.&X^XI`?@CJV*S168U%")+W&GC+.M3 +MG9AYO:@5>XC\]0F[`F[".ZBH`CLDGF3W1P,T.$!^QR57F_LS\`%QC6HN1^9A +M*5R/CRVR..!L7,(WPB;233<4KG=IY+N=4^Y1;M*V@!H&V_XD%74A*R"<.+;5 +M;1-J'$R5I7F0'9!#CSAW5ON,3)@!(GX`+H\W%9N0(O2$IE0U9]Q8E;*KV/0+J=`DCM"JB@+JW*-)WC1-8OJK +MXIVM4,&>R@+Y`?069AN+?_T69_/:9"7/>7H?"[Z+25%&3OBP%8@=EM##Q0JE +MH_&=/[%'W?QF!^!U3!;GD58G7=GG+/1<`JUTF-*;WXUV0/KE3_F*(OA>K@[N +MZ[CC4?5\!9\8TNV&P2+[S8A802E.>TNNKXL"6H\AH$3H(L^H;>6)HKJW`I>>H(OF +M[0:]\40#L*Q.HN>?";;@?=G?RRR^1=A$60A%3/T7M\K\B!S&>PJQ5^`<^G.H +MANZSE?6,?!V_B"9R)ET^.2V&ZH\&'QVR):-K]+_U&'4/OR^$MOW[C$>KO@G, +M5D*HT%&677]^1>$ECH1]K0T"-(^V5I6BBX(S[DF\8J'JUL\HI?BX@/-1LL0" +M.`ZZIK(FI-CDU7;E2]]>H%A)K[G'+84=I)-%YO^=O/)G/XF`-K-P;_$`^6#R +M$7'T"FCN9LL?)^V)./L(FL>+5^1`'X6`7=J-1*>R$XICS\0=:@8Z_@KU6DS@ +M627U5HANIF*2F(QY".P2<_V*B3HD=.5H->K3GP/;=?TDX*%RL;F_9B^:`3A/ +M"SL9^&X_RN=80=U=;]!=\&ZM@?Z>J@0%'[JV%+(+P>Q2_&F3.;O4JG^5BZ!: +M[?B,/"G%>;HKU+QLFTC>;-!)*F217Q&A1#4OO'QI1M2N#">1!\H7D"=80._. +M%R*<;,L^XEK*7[)#@H)*'SP90H54V-J5C0^&:GF[X+AZXNB#\U[`%X;C;E=; +MNLN;,)BY#$-[#JV8C1!XM,_:VV%D,UZIVP+KW&R0):_YV5#K4%>RHT80:!CV +MIO5Z!@4VHL>^BVG5BPAE+OU.\<1U@+3'8=P#US)2S87L.#2P/.G^S1@U&76$ +M9>O6$H2WQW&9F>&(UL&-@">&F`V.R^AO;\CDS?IT\ZI(.9MI.+K@NZ.H)T74 +M98=UYTS0UE&S@7J7HKCJQ-]90C9>&?9<$\$''+-OSG9U9&25-QROYH40@9)HQC2)VF]/%G:I_V1D,!"`+R2D4_Y%HNVE:K +M2>Q_C)5(N%'*G_+HRI77W^B'M@G31EH3!TA#\NTYO7SS&W4<]04'.F<*X4OH +ML/,Y?SH7N!&6/%\*ORC3'3N6Q"UPGMW +MXSYX?1@R=JO(-WZX##N&8#G$U@MS,!/^/]<6!E*.A8B7_,FR48"S%8=@#_VX +ML^;$>9R>5NOI+EP_OY"<1[/29#P]"#U[\94U>\)L_'LZB"NUQ60#%L;%T^AZ +MA"A-%+J?X+3GBF/T2---^/-T+,`%Z:L3931@P)C5Z/!W+T;@-B*O +MF12%@J."HQ(]_+D/&KN:/\2`>CEN/0^T`^9O"DG(8+D9%9K&.M_7L$[GUX6: +M='$[].JP85;R:(@G/Q(P6W#A(FH"4QQ+'TRBE-2O(0$P5M-JO@>)OE7?F\PH +M%B(TB!&BDL.;<$6O/EY,($Y)OW=?ZF(R+2; +M+:GY_.9`@!TB4/"8&*5;XH8Z4V78"V +MR,L9RF.?_DW"9+PS4V/U(%?0>`#X,HI\52VDP14S<22$7K'_2AB%WH6J>*/( +M*J(NZ+V?V\GTLBG>H8R,NN0^_P>;!6/:_Y.:+;#[$>WY9QMON.*<7O!_2C>W +ML+*D`,H4EF,19RMH?O4'NH&G)#0+[&J-RQEKDJ]QFQ:&;CMVZ6I! +M`V5()ZF%)64-MT6J-,)TA=](MCCCAO"DM43[(HVQG;::ZH)L4=877E]#"81S +M8U/9?9I`70"(?"R\G!+W#2\AM'`\R2&W:^!%>4_:?4\%3XUW\YPKQ1O3!-1Y +M/>(0?M=.S+^197Z(X&A;)3H(2%KDL>)AG]SA;VZ@QI9G8OP*K_.\L.0V@P$!_>\ +M0XF2G1DA-3F:^&PA8;MROQ+CK^$+RBKNL`ED/M)B/A]"Y#\,Q"B0SAM%ML'0 +M\+16"SHUL/6>E$3@EQ,RXD?3YZ((33_3,MA_=5>X^Z.XHCS-W[!^&ZKKT[C
    O30W>ZR`=EJK7Z +MKAGS>$(M*2ZH.,IE6WU5,R&?18]J/^SY1<(V;E[-,FOON9`@9K=!L(C^XD5S +M!`@Q=MI3YY@A1WY,-DUTIEU0T(,P<]@!_/;.)`#?-?.Z;?>76!T"ZSWTEM0L!>R,XEZ]FQ;E-N?HXMR:,9<@3_ +MJ;OIO4:3V=]D2@)AK`84\:Q@+C[/"X*T%=<_&L^9#@?3\-#2,.Q6'`2T_$RE +M!.+KM6@2+B>N5RNT77I76>Q#WA>&.8F]FO]W00*]UM#2E6GVP%RT:;IJ^Z,P +M"=3N16=16]%?'!L[6_XBO0O\5:SZEL5[A,_6'TX,&MM'S\6?R5D`DGTWP*J7 +MWITR_K8G3$;19+-3][^&[P!^L`YPJ&IU/93NSFH0:V^J@H`@DU\F^@C&)LD">SX4$(.`3W9S3FDRRD6LY +MHS^^E'"MY'?5Z^GV-FBQ(EKG78CD$%/(="T@'!`#TYK_V@96&ME%=(PC/.^A +M4]A1Q<*786?MV=#2##KF#_#?M0JF=01H$<>B0O;IN`I%BKN"!S&GQNT35S5+ +M(E.C8+1;:P]9CLQ]]!11QM[MR8IH+64P/4;EX$U9G7CVY3;-7%(3<:F=OO_J +M2?#H=#9YN@2+.)^:3!*;.&<'BE;LB9[QE3]Y;\U78")WJH"L5YRSE2]X4P=S +M^`_@'#A98%;9#JWQL&)Y^:`N'O&;/U#1XALUYJAT#IANWL.2=[+-C?<`GU6@ +M)]`)QK_G8GT&`DVR8]CT2#O`&`2[[>H,:2@4YUT?[BB.3(B/%4".FW'>I:Z0 +M-29S,@H(36V0M\GT^/QP/BV#%:V3V_C1T62MWZ]45IVE/4GT/H..9%Z@5QXY +M7N+*.ZAV@<>D\FCA0;!E',%"T:STJDC,J=!3NU`@AW0LP6J\X2G>QW!!CY]! +MJ/WK"H%9:0,DXTC2*T"C-<(0HX/2E2,O*/0V,^FF?'%M#V9]3O"*3KRLQVK- +M4!F#T(-";'M\_DQ8_/CRG(/"*G@!K*5DZ?:UJVM4;4EF%U$@CA@'W4TM?T9C +MJWY.M`TK4X/\%%QX<"G$;:!+7<**LP^$;DU67M[3BZAGQZ,)907'B +M5(6'`_8GL;=N&X'3?KM+N+H[K7&R<3/Z!,W5LM2+'6*$72P,%>ZWXF-]=34N +M!7^Q,[8D]$_LCBR.M:$NFY;7V;BF#=W7=V/LO):XETK;#7W)=HK%1<7F&2:: +M]49@I<.,I65Q$$(I>;AE5C$T0^+GDKGR%>/W<8/O%D$6SQ^>B3BC)>DA@&8G +M!40]F%X0O.8F+MJRQYCWW>\@Y<#WR +MB.<4?U,UBM'J;I[6-_5_3(0/ZB`9%)SZ3'[IG0/+#$E/W&4MNKK2'-.>U57L +M68B%KFF_AC]\FLP^CXS/RX%8A!5LE@NYDTY$W_/EK78!A#IHO)*1+:U*"G1C +M9KS-4:;_%7=5YG)"PP[.U8O1+.A06/ +M@DW+(8?>3ON3H-#+`2L)3"0YIGE8_\`O28II_R)."QMMWOTU+[A:>V)`/__- +MK5$60W]A0KH^A?O^1;3R+0*('_*K2'8K&0YN8=%&&+)UVE=Q3!M3;2G5ZF2+ +M3=D-1^3_AP?OOV0BRE#:CM\+I)6DUCEO@_,;PF@CWUVCZ`AX@"Q)Z3$4^>P` +M@B-^9?_@3Z<\C>`H,`BU-R(I01BJ-YM=C2VWA-A`]IEG=@9]K>>QMOQU7"U( +MY%X+_AH,`-64[R7>BY'CK&RYZT)[2`$Y6C23)^>\[^^56+N+-[+L1VI&["V\ +M$),@R?#EA(>2W?)5S0M4-)M! +M?!0SPMB1.;"'DU=*5[BF3SZ"%(*")/S(9X?8F4^YP;7-`]U$'.6.W*I'A?AP +M8T:):]1#7S4V14S/:(HDC?%=38I_*XBG^`/_A8[@!4Q@&&<__Z98LH%@J^F! +M.3E+`FQ+\UOR9BSJQB= +MSAU^#[TBF#9+?9G_,KY"BC1`;X6&S;M'>6:GV1NUY"HPBL)W87`YDL[GOHJZ +M:V1&,W%+^EM7-3[D8`>;50T+;H'G_-G\@(1T#KX0L_['4J"KU9_"^H;K/B&) +M2/_[*&!L@M_^0UW%`FJ`ZI-YWQ"\B&!D+O7*XK!P\V66C$LLK@8 +M45\3(F&^')XSG>%\3NTF[&6;5`/,]5,]_O%:A9<`^JEM:38I^GJ+RL<@EK8Q +M)^P9?^.J9CV7SJV@=S)"T+^7`F%V^OC?(03Q=5YYD'H:8/5M$.FQ)($]XLC+ +M46D'?\#)FM1*6`Y)NSFR;*L/72=TFT(\X45/<%$B7V2-GX%7$#*JOYN0]?4- +MUM&&FA^B5Y#I$?92;7SVP`W<;[X.FV';'&=4$Z,^!@":442X"10L)1_333Z; +MWI"DJ5AR!DLIUQ\JY)6@26IZXAE)JK_U'OR[`-Z;[NAM%H!4"V>?-+#!CKX8 +M$`)"O#*";=E3%'?^/8KK\S6Z0]57'(3&6BY!6)E@[^M.5PGX1K2O7A@Z.1@O +MBGL+6^Y0L*$5>!$^-*>`$DL^92K7N!*S8;+ +M*#"E#HR?@APHF6@6:XK#)RDMC!,U%2?S\BQV4*+-],_*K/':0:DANDE;\6,2 +M+Q8%&+$9@:!KDBW%,W=2RPLPU%3M/O?R7"ZYDD`CGGKL^NO+%+#R@&>OF3-Z +M#]!J!AWF[SN1<4/!>&_Y/.)[".%ZGDO0X81NZ8$U1D/,?:M?OKXKQ,;P@#0A +M1)SIYA_WW.AEY=N1W54O0S0DWI?3Y$-*:HZT`,=22`:F6Y@&8J;6;'!]E34J +MR[)4-E$0:3ZS5=L6G';-R7QG@#OA2%WS+B:#,`JB*C,2V^ +MX,J*@NSE7A*>[H,X*01AQ19)J"D#Z[/4V!1.["(Y"N,BQESY:YAF:19V9[?<[JL +MYLAN^K0*45LM_K\-\Y2[N+*?`BQWUZNO3%S<.F7Q7[Z;8#2B26EE*$%W=%UN +MG+2)-:XR7?MJU.$Y/78);.[%C6;MBP?/D%6)FX#19;N)$`,NS3HX08]:6^[E +M5AHZ`UOENI,/&CW2F3WR +MP=;43CEDU93=X=Z(#[TL@KTGF1Z:PN1@\*30S,";XRVY)HT:;B4?U^O8UM84 +M'$B:9"F2'A,&K)_F(RKUQ"LL#)RW3U!%NK0OV:4@SWAAM?BAAY8^J>),1T^W +M\@FYQ5BPRC$(%J,L:091[E'%(E<@DV*IKX8V*Q;/@8CGO7"BDR.A/5W=K)KF +MW@&43HU9!SN&O^PN7SQ"!GS>>N1-!)Y/3/0Y9*D*@-$#]=F,8HVLXWH';TFF +M;7=ZOSEC]ZD@JQUU#&=%HRQIXT"'%8<;OQBP0#2>NX?ZU4';$MS!N:>SY%6I1N_L$)6MTN!?"HVU&*R:`E_)+E%.L!*L,R'&NSW-*LED'6]OBVG4]0?(E+9+AV8"PJWBT"7G@0:Z)W +MY0%P7CZFS:#!!,,L*9GF:7E-[TC2'$FATP50:S*Q"8FEU.K: +MN?^/QFO2=SP24;_>#K\5TB$:2'P?`+..7%OSV(97*RO;<$33CZ7G>5XI?>!< +M/)E\ME'=.8+9EJ&@NPY^K5(>L_,FL$GKYJA&]:$VD+<$TX9^5B7R_P+\PK\K +M.3"V-$GD5'#:T;44[\/#Z<')+R1+',]_YQ8*/5_`Q?YVB +M,93%@3(;B/O^K&9?]L'"O'?]A7#=]4QVQ*NC=/ZU$Z5Z*W>15!*?6K;WY1:L +MB$;][N'Q3W([>\ZI)?5`7.>C@`DQ\;MC:7>K4AVCQ,/2E7U>5\J0_EMTX.OE +M-`'I.US0\-7&@G`28;Y8-&UO+)D:ABA`%33-L.DRG28YN<`>=RZX$1-SA:9K +M:H%4V7JI8_^?D5:AG;/>/#7\_!H-'B&//C;`?+LQ3KW`>QU\6HF2PLX5UO15 +M*U5-A;*),38(:FEYY5V+L=@\RJ_0O\\#]ZK]-(3JT<'?P,`3GYG)US\2>B/( +MI6>NE`M^D0V+P4Y-E%UVE]52U9W*? +M#JJ_YHP8\HPPUMI+:<$+,\(C&Y-*UJ"Y5M0B:)^)_17$P9GSAN2GHSU"WW- +MX4N?@RN<$78R2G7^FZZBAJJ^,>>1$R_J_!"UM?,V,EV,:8!,C(X^^YOR)[^\ +MLS0S@?WM'[VYK%<>PV?#8T!&"!_;&1TXB#H#T;Q+@F@-FM\_`N>K#_1YP0EU +M^:)U7S854`T1U.O9.XV^PR_2[@CGJ:_OB\>=C$PO?Y9I(8:4,R$EE.R_'?W@E_T+Y`#8+28@"$1@/OFWTIU#Q_KXF$$EU9]3GT^+-C\@UL^(J3=?':"5195;> +M\ZMG?,/RBL+L,86UGAORQS`EIHY.#]F==@&Q+E>8"QW92T((@"!)+&00.-*D +M&1"P4#+TKF&(TJO$/`;]?9,JO:JWOB/Q@T;X'7JNQVSF0@4\VY__UV_:'N6K +M]Z`"/(E?NF,U0?HMMC4B9*].2;@QF%_X!_U7599\$3;`T%O=H2%.?:4^N,A. +M,=L/:D=RU/+N\"`_YB2.5.:1/WFL[W,9 +M_X;S/WH5I?&YO*]=X&F(>A44+FOL+B#RC4C4,XLXY\!_@@^YH<9,@PKJF +M^?;V9(!2[`463E3/-H%#_$1NG[__?/!CXK,9:K;ON80;<*4*)"[3J=PLEY7" +MHD5*S\ML'[F)D08R)SI]EM8$+I_QVK7%O'\._B$6E11F#\YRN9U:,HR*1,&$ +MP6?RX,S;8Y+7SK&_(7&24^QRG'X2%+(=2AX;QHWU_G4]5>`'$G!7@5+H]6O%ML;*NI!G=,;10Y +M8QQ&R-B,5Y*M+1(:7.IF9.V"Z5-C2,`JV_RV"MX6"<648CW(D^D)6T5RV,Z3 +MA1O5I(T;B"@8E!"[U79LI?#Z>=4] +MMK1MMH<7\7*1LK/4\LTGM*,&O_BX:6<+\Y3!^RS:4-__XST>BH+^T[<>([3B +MWW#7#4O3TME1FZ=>(;8TIFR:\ML#JKAEH<.+S=2Q"%=YOUAU!;PDKY8:J3A^ +MVT4&R#=B-L8T,Y(3,?7Q;IFZ6*=IP\VZ,/)]'F^F5:F"!IFL9?O,TYUBWDS( +M-DST0:&#H-NNA`S`>)2X_'TR;D%^A:&@#CUZ!K@9F+N&$,,T5!05G)213O5! +MA:W']F#4^0FW1<>9WQ.!2G$'&L4IGEW9["W7.[)M-&,"^`4,RCI4$&:B1;N: +M_CT8@$7K]9D'5)1Z>9_X$CN6^)QH@TO`[4?(P4;F?6ML'N +M%"__6A5]BSC'9:U=*FMZ?`O%8A.54VLLBF2\'/%+ACA./)27KTX^@GXY\;>6 +M3L`1*/Q$F1/=J(1?"E\94P#H'K]=H.Q4MPA/Z[MM_J'U]YO+[Q,T:DQ3XX;M +M_;7(;&%^Y=-1PB#L/H@P>RG)HYR*YE];'OY0VA1K95OY3OJD +MTBR/CDT(R,#S0%N8SD+$B'HB#F"NY^_]P]9.,^RK!Y*:3YR2KGRW8D99 +M;96\,%FCGNPC?R!.C4W_1?(-4XZ%(F+Q[:QHZYP@N8-@''M;KQM&+^$86^19 +M0+PQKJ14$14P>$I09N6`XNEO1)%B$<=FYMDI/7(K_BC*CB<.V2M6#E<%)K6O +M.^S[J1J^\#])"5VU=]O3L[6Z#5^ZPN@H]*TO=*H!$J@@U-+V*V^K?4*:^IY? +MXT>'0=3(WO:;+$"WC)0$/6NFGL&T5UH?IYREZ;>"1(#C9^VAQ.%+P6^ +M*__732YEV]8,4J83<"*%]CMV%='[C5J*FZ*C+-,L""V/F0:R76E/1:'B:[AD +M.2``C(B#&%^CK9(M/,+CVO(`@=K%:8RFG7=F*0M4:12>T#>*7H,OA +M?`QQ`%W[;.L\B&Z)H)E!K^]0]G1E'K6+P'X/,>,Z*U3,`.21F-$22SB&W((0 +M-;L4`F+0Y68KTF;_8Y#?+=/_@I5,0+3 +M$.9J?Q;X\]X>51*?DYQK<"PLKDF6!8ABVZ4%UH"O76B7!^95P@HHAC>#7B:Y +M)8N')LX*#J8@1#U790"B81-A09F#MFV1[!:!-5Y=&;5^>0G6^T/IU+JMTCIN +M&519.M&<$#,W1C#"RF23]-*UR%Z\C;9-=DBP5&6H'*A?H]A@Z;X_O:./_?@8 +M=65H+BR+%1`5C48FB*,+"K6'WQNF^4A;)I7"29&:JRCB5[ +MW>IX7:3EWE?$M#ZM14*1NK`/?9#F<*&ZT\"!A]N"$J#%;]'^X8]R(0+MN$O' +MVWBE8@HLI!Y"CXV7<=+H`4BG)TZ7!28H"X?\(D%C,'1[+H%OMZVZ_U%$LS1I +MAC'G%KC(*U?H#,Z(?P_5X0A&UN%V%`"*6N_!R="0R=@!2($CU&YV142TV4%% +M'=-T)2TF?@!*;#\Q8&]^]?.3"O>NBJ09.$%$8@KY6=VN@5;2RY3CUUM(7OF# +MS9.G6JEAPA%!"9"#[N".Z)33R=Q>!7!Q*Q7V)2\:-,!/C!S?L`W;3NOJR,6; +M),^%'6N_%U,;P\F`LZ;'R\Q\$828E#S5UV'F>;VX +MYH$\$52,_&XW^?6`G@.=E!+Q';<2T:VQ;'C:,_W&"[)+_W!]DV6Q-G<'87I" +MQI/A9F&/K&]=L'[\16+'L,\24%"(SXQRGNODAZ-D6FZZ7BVC:$C#R)TO5`R_ +MWAD0"QT^ZN2N%XP!FW"&"'G\C2&0U"THR-2/RG)*#T/J&<-;8G/&]TUE@M_Y +M*CXQ?^-N$`P/F66\4S_BM^Q+1H/5>9UQT5^ON3C4S9@L+Z\&&N/QP]5[!#LS +MC]6NEJ*2X-S=:"A5Z5)GO3ZO]F;*?OX)I7U<#^(97*5#WT6RE?.AWZF@5>GE +MXW9=N]WK!D2T?.<>*_EKKH(,"EN5H1GI:?C@\H.9)S9(WC:PP^$W:DP#7VV4 +M'I"L/)&&V&9VV)R8>K#>!Z`0PLTLKBL_<\S"&88TFZL(_/`1>%."\B&NZ0TW +MN.2>`I.V5QS1BR7I`4$MNV,[:D7L*C4`+@B!T)]L_D1G +M1^\)-E1J0U@&`UH06W-G4@ZS#[S2HLZE6C$C9,`+L/"IM>>=Q#4TD7SZ@%%S<.KIWPD*&$UDE3A#-F[+*2$_2; +M)42>:R;5UP+%9*=/@)QGOMZJE*-=/[OQD0S47",^%Z@A!FU75FUD1^0;>C^% +M0JK9(@QYA'D'S5&G&[]]B-*F7A/\! +M1!'58,]V!3EA]]DZ2#VIVY?JEA=_#YIR=Z+[`F1EL;M)W0L*A/(YN9+EE)ED +MXC3:-S:0&(-_0`N^=F%MD_28@^'/,7I\3L=\3OC1)ZR:Z17DA>$-$K1!%0']E]1**"#B&49Z\5.)VL;7 +M%IOQCGJBQ#1V,F=^".0RYO`.7WR>N6@:HCA9;"\_72"!!+2`>5*YXRYY%>?P +M?+YAI"1*ZA6O*!4+]:W-,)NI:M&"_@`R!(_PD&T2N)\QHSRBI'M@EKEQZRJI +MCZ4II.(.C/2]U8(A)P!6@N%^`D(G])ZB/1AORKD-O6?OMIB#G8>`I?,P*-*= +MT+-]OE72`[_6DK?>YCI2#83SS_*+->^\@@). +M8H/?:*SD+WH&UP6?9M7+=JKZ3ZKB3/UDWN(_,T?>'4$%XQE7]^*EHORRA",XMO1C4CR\-[ +M/P"O!U-AABK@:(>;4C[9YS9^F<-:>X^ZHR_1*]'AR:(D:;)^?W20Z,1Z#BHQ +M$]H#I%S+5/BB)KA6O,-U#P\R)%LD/Z,!*XJ_62@&PI\6=ZX<2<7C0DA'-L./ +MC0FE*Z%\%"8:9"T+9$[J6+WK3>DWQL^R$#MG?`@'I"?^:B\;7&0-GY%Y'H<^ +M*(46K6^>_-F>\,GO%M@Z$6)<7KZ5&*.G!_`=@9<"@>\^A$62"$`%FK%#1RMM +MF>4K3?:#124VKLN,G@H0*_C)*4:#9808B4AT`;!KO5`@+"G>P@:.$Y\LMY&L^<2J09>WS56-\IPFCJ$*]"P@HI!''E5DOI(<6&[&T%DTD7 +M.M9`'?SKAKRZ4Q2G2)S<>1V0XFT;:-)-.&="FT9&Y.62N<6=W^@F[!PUE9&Z +MC#ZBR(AOMAN@SU"0&$CO_T;-$D+.O$LZ)YDWC+QH,@#F8R34:@FWZ:"8VX9Q +M(TIZ;7_0P&6$X">456IW24Z4FQ-*`%.;L4!UEX74R.:O?KCN?D+\0XM628Y: +MDTD`U)RW89I3X^PL\,LZ7>B=UO:,,'-J5H56N`)H@O?5E/I +ME?>$J35&N;1$S\!@(,#*6_LNP`^N4*082TS3G\!"0L*3EEE-`,_72V$.TCH: +M$O>5]/TF*I-6A_1ZK_B.]\26AN\]4>F".8Q04+*QGF92S1#!4)_$C#TX)J!) +MYGG]*!M0J9,)K3XJA/YJ]H?G6!>/\$_ST?TZ;%\6;-CPS0_N;Z.F"N^7*H(, +MUK6%T(Y',/=ONZ9KJ5SFJ0HPSBH>>]28:T:PET`5?Y?<:_+#/?10I1Z;.-BM +MR')Y>@425M/U56/`Z7Y&[/K'O0`E#*>Y*/X":6ZY5Y-1%?"JL%HYDWX'?`D_ +M2+`S?AX&7L0T63)U/\9P%&10Y;^-9KZ/KU"N[-2:EPMIO(+:WQNBPLF2N,3(PYQ6<"D;6!Z(CBZC>H>I$5`0ZK^>#? +M.EPR/RKH^2_6\:[6!13EGEFY2[ +M:-_C]$NZ253#^#G)/T^)[HS1GR`5M%JKKN0?$WZ4E.53PC\L'.LXU2RB")F% +MCG.B$PM[,*M7S6-`[:=O.NU5^WGKP#F5Y)'VVL/3K7]F_D&X2;QKP%.42-T2PT5T&-"I?MDL_8T-66HU!0*_)HY#K6=DJ2:= +MWK&A+S_T33_OR<5\K\[VI9Q++7W9N]+'Y)'&)K#M +M9:"TDI66Q^SGQK@0$0BZ(_ZO-X>K1C1=%VDCGU)\:(ZK5\;6<(!IT[D8BA%F +MDB_:8U8`,3EBD.&-PNRO/[W+>.)H`6$N$.L\JD6!X7/*0@!LJ5PJ`K6=7ND] +M[H.GW.C%,`-`3H?&+F=.;R[JTQN]?/1`89SY/^9;2H/CO]U\@YS"GY6 +M(CG`*3@S2AL0K+5&:V=%+5>2*!Q'+A!`K/8T*L%TK$)I$_?\:AT0/8TJD&_5 +M65.:O3?XY=.42Z8`/@WS\`]9I;K1B*LX?2Y)P#??A%S04OX@%0H>K1=H%!"Z +MN42EPOM:74KG@C7+C6HX'?PU;(A/5&I5T]:H13_'FM6?&F;_WFEP`9$1)1FL +MR<'6BRV5T%Q4R!$INA=!OS<"RL.8_&V@H/%#I`A1<=>*^OCAUJY'*.D0I[^B@^.UT:CC0"[ +M@<9`D<@W!F./AH1MQI3M<(HF2!$[<_Y!"6W +MNFNG:8:N;2=(%ZMASVGQPV%`!SJA'/6UH-#J$SR=N)$/J$8FN_G6J$FV[2@L +M5V0#C:8\6^=+Z0_PR"/']]S*;:M)S[W3U7[!E__V#UO\V3?\:$[]"?\Y4(\; +M(21)2&/_Q#E\5Y'(!(:>YY*%R0MXF"P5Y8LF.HZ=D;0(`S43;!@RA\L@U,V- +M+Y;HL!;47!4GCTQH5[VN!9ZXB_1ISP@D6L2V\(<^-LSK9\&D'_T9HK-5C&MZ +M:0"6WR0-A-&-IZ"WA!36]KS`M9P+4_*Y2$=H;&2.H+_9L*/ERLZ'Y.5V_I\( +MXX,'_W?M?"KK/D2I4(9#&V$\F%MIXU-[VF!\%?-8J&FE_KQ4F'_+%"1D@!$@ +M\\R:7^\EFLQT6=L9H&J1GPB%YM#8.CQNDT<8*W[T37%)FQ;R;O,/<7(VP09& +MOP*9-%#:)4JTE#R-OU['`C#STU85H>LDRP-46A11$DBBN-60"/JJJET!*4E^ +M]KGW#O8XBF=`<4`76@.JQOZ"JL=E48+4@97=!_XLRTO +M:B<$<60X^^,8\#\1]=J&5HJ34N29L%6:#@>035V/,]YJ5<*;L-M+.5'JZI,* +M5!G9NBJ7T,(N.LI8U>ET7RGL, +M15HZ>'2+/SN<>D26(,W3YZ\+3\KH:&!FV0N#868U(WSOB23/;[FZB#?H!9V$ +MK;TA%=S"RI@@]9K,;=G8F%DH:5N8,`TF>$ZCTKKBXU=[!>A;UZPCK;PV=7MJS"56\A6B19+!G`C;2Y6B\ +M*IYRNIU;Q2)EO\'V5/(QRWW?;D0*[Q5?AZNX?!M9+SWC(TSE%V5TW[K#SW+DQV'4;.&$/A3M[3&$RE +M(M="'OBZQO@<4N6-ZU4U.V4V@<%4H#7J#?1[E+LZH2"L!T\;4!=P.[UO_63\ +MZ,;H7Y4O((<;D+)H_\@'))].R("9\N@,^G63YGYG7/(WU]R*DI"ZU?ZYVNX& +M76@U)/^/9NB7A"9W?!RW!QZ^D8=1U/!8#/HH159WS8?88'YLS;%>00;LO8DX +M,'S1\;.+;-2^%0)Q`4UO:;\]&K,D(E+9"".H(X7]_V?4+LD_@MTP?PLL,A72B+$+0BP>:0A;;XT/_D'P-?D)\=L +M7Z)L@;<%`PA7QS)!R^B'1"(\/L%L:%JR20Y+!^)VXMSVB'*=(8IE%1Z[&]4' +M>3R,0M]%QFR^=<<[\^4>WQW>.R3`+$4"JKB`5+Q4/R,>2`4;U.N'CCDD+A;!YHL- +M,;WP!.Z!H0M^^?4Q,KV3%%WZB$34B:LL05"X8G2&`<$Y[NS!DS# +M$`HDR0[1&*;-N3.$Z8B/02HRVES+5*GI)@F\>KV0U-F8]6@X;4NH(1[=?.>J +MR@M5]S_ST@^JK0J4R)#\\Q*?B+CLMP3G-7S/F,,S&'&T`(D`E=M6\C/^]_I< +MT/YLT._K'932#OZI0W>^3AL.B3V05X8U[@!3+-HO-LJ>JX^4+A]$[T7J@UK!\PN<%A_I-G:5)=]YOOJZGXT5A&V:&/=UWF_`Y&`C[^[1&:`466X[53OWN1"?[MU0S]3$LS#Q?\`(V[V(V\XCK;K;>+E5]N:-3'&WDI5 +MUG^(%"`0S9_UYLL"KZY[=P/[N^]S0]#);$*SD/1R#''HH]=D9;2,K0P%(^OX +M\A52.Z)0#_1/M)FDPT:';4@F%+4-PUZU(-8&L^?WOPHS2THT*$8X1[ +M$^;.@F>A"`YYS?'WL&J2>8KJ3^"B`6CGULOPA'+Z;$Q:;^W*4R=UI8[W,!P) +M?D@G[>'.?6:?-22+3]S:X +M5NZ3G5;ZZ2KAXG0_(]^)10%;TP$XBD;L30[--QOT+63L9G9J7).HC3M_]S7R +M1)@3$.OBL'_Y58<"0O=0M121 +M8)=!7#<%ULN%@IG#>)5V4`J93,M:GC12R]."ZON9$BL<4DB0'CA9L[P8N3`L +MR`2!*=-'``E$T:QD&:CAW]2T<\X')^F7CJJ&P:D7PP9P$Z5T13-;=GU8L_6U +M^+T4)@+A`L*_:H,TBP/66W/#1WU0>MY_U679HTVX$R;:3H]8L*EA*P(9)C*. +MB_V3&?<_;+V-@'37J_O.J]?A&TM^/15Y.R+\IG):BJC)["PXTYC#9A>0G=-' +M.)07C_?`A>\6%\GV$FN[:'!#E^,RTY2J`&?3(!A3D4(,1] +ME:&07(M)B'5_(#XV*$?*H]EC421LX`:5KL-,`:(,%2ASM>L]K-Y5';RQL;Y1 +MD7*FO.)U`?`8_BH*Q52,Z?A:LH9D*1%">L)1,M4S=2"MKM$=W6@,5*)W,``S +MCI,#9\/>:T)"T(BG>?O0KFYS;0VD,@L-';6?J#2\",Y\A?$@3:(Z!N2#<,AA +M/@9\N9IUG#MM/V)O)B@A\"MLJZHFU6^2N_2X\=TB?Y@8?2=%[J"6.YL23<$F +M:Q'5)-I,DV53?H&M(*^43(-^Z`97TH%C%+(0A@H!X?3%+D8V"(60%+GR-S4I +M6^-5PZI*LX,'E/UZ'26 +MP\/^N(*>%H7A/T]2'=T'#CAZ.*FJ^_$M`3%^A51(B75,,\$M!'7WISF8L4E7 +MWA.^?\87*T=OWX=;HM;69I^B,!V/TUETXLPM**F\*V#0F$&6Y@-/4ITI$V$$)8) +M;!$W+;M42NGUPQ^`>^[/6[WD+[%I_2P1>NMB&U:, +MLD-V/)KESF@7A=S?/\W`>0O;K,Z)>V_U>':><#1\348VB^H>&=HCV,QZ$=?O +MW4=O]6=4L+]^?/9AO@G#4[4L3@NHMT'-$9+ZXF6FX[Z'K<5O!>_*,P\#IJ

    ^PWS>SUX4&YE((-U<32M@N)UZZOP(*Q3[]["2_(&.'UC0)DCN1>-9*= +MNC<2(N?`&V?]6\!V:42G-ECE6^.-S%;1UU&BST/N9PGO"%IK`\E$[#8/8-"" +M"U1.Y,1#\9ZT-WLA+5S^3CKK'.1XL)!F9FF9.89"`ZR"+2-[+%K9/P*7]=EO +MHK3="C%Y*_0+Q94PC\;^0ZLR_,*?YB]QITD75:U_87QA.E=$CU\Y[E=+A[I# +MU:Q1?X]GXX^G;F(-\9/CQ%Q`5+$-8$>JV53#JJZ1TRJ)\\\%-P)086P%FS&D +MB8,,44A80IF(H;*,91K1GV//N/^OFZ:M$D]2]POV83JMF)F+[F65^#S+E\?I +MWGP5TT1,5_F>G!*&_/]/GZ:7$*N=@?#LYR?2WCE6:%-U&;,?ICF3G%#/W@O+ +M"<^!)K5A7DKBT=!DQSFPN@MLO/RD?"]K]Q,RS7F$34V+]IF:H-%P$U2%4IH& +M7D0\V43)\A>;\=Q:.*Q=G2U9D5/K=L%:%1>J:Q%(?6"KR0&7C#L +M![P$",-2!,G;.5'6?<:KNDMEVI.S3[:\0@Y.4ACP/R)T<*RXK^#RI(7'F4L+ +M[GX+<`J.H;T8\]RKU"48CJ2D\).A^+"ED=L[X8-_9782R-2`5KP>$P7-%]&! +M\T;T'#`8&\A]DG8=SY`NUKL\J]U7Q!-,<*F//-R_SM2;_<@.<7_ +M*FZ2&SKH-,[%!,4[N=7P=K^52YT^>YGIN%.*6;P`RE%KC$_OAMB_]"D%0M[%?,0\3#+S?4JT=(GZ&4(]R;`"43.#FA(SO +M'RB`=$M;(SA-E;=NX:"$=Z'?@$=K6+R;P]?3C;E!F"CG>;QE.F.CTX`^A\8U +M!N<892+U)>;VCB^>V[X)<%+9.`'$F?L!&C7-HY'1`"A;B3C:K<4 +MPKZ2\_X5#6R8Z$CLO,>JWM0?D?BUZ]<=#S>K_7+R.VL$`]ZQ]$[',(U4&+&0 +M!.68,6XN`Z=;JB6+/IF<7MID]XB^VK`,4MZ$W);[(1\[KG0_`\9;5@*503J5 +M+,\J&+=Y+U^""QX$R'@Q<$-N:3_QT4@QT-6/5H[[N;/N_M/#D<+!XWC1`_A9 +M^&V.9,:T>J]K+7AD=MG\)+.I9Y5ZTL9,F+IF_2'>&PBEAJF\]O>H8?.VR(N5 +MM$DR?]_YYOK-7W+,EA(\TMS^!%/N*^''5^ +M4SA8N2BNZ)M"54;X[]%!,7RLF&/SPA[`:OMWY,.D23X7Y%`X-M+1(G52W)8P +MNS_@,5_5STS:Q&3H>UMFO?B%*$-RV/:,&79=W]HZ +MS)C\.NR\..&=QQ/*B,1WOGG$(N%`9+EF:?I'C>3H9?X.(T=*A`74C0&@PTG. +MK7=0)YH25LLT0$)W+/,4!'5'BR>C'14X-CBA[;V6&GPC-77L.$@YP@ANBXY: +MQI'*Y8]X"'`V1:_CW?$,NES!6P]Y8;DIH`HACX`H/ZHB@*>Q+;T48L54@/)) +M)_,_A>UI7B%I2N3M;`!6;Y/+"6'O\[%]UWCNI[R,%PP.@44Z5.FCM$(R)$GK +M2(#S`P%45GG1?8=A*Q=_*R]GGEY,,=AN`PX'Q18NRC+_N];('.T3>896HEKJ +MAVA_1[5_6I`17.2*9#UY<8H1<1.1448WL$<75,^3A,&^\[YHN'2!;7]) +M$4:ZE5[08MJG/+,7K54?XZ*Z_HOW3ZV?6#4_E1B!$[S+/JR,R@-ZJ`5SW8#` +M@RKR3@(#M7()*D[>(<>*VCK(MB.XF>HA_@T9<_+NA$?1J\=:E:G:O$XT;S[& +M2=E)+`7*1J7BF0C3I;KM_>$C/F(CG6N=5+"1->FG&DPX!.Y-[)/M>M^8[J4S +MYMOU>L^6GKEQI?@M>6$XATT320RWZJTH5:(_'&/`@)FLTV&K^Z +M]MG[-YR\C_E-^J+=5TR;D*>;_KM9Y()] +M\5QXO;W(/ED88M=-40YA+2Y_P)#^]G1X#7A90H?`ERN?ZDEX,=%\N90"3N&.7+F#FC;D1:1&Z9$I`?31WOD3GAZJ"V\P!9T4.=^0!J1?6/A +M)W+T1,_9M=Y8Q;>WNF\XK*+Z!)QBX;82./SR;HU!3OY;J0*.GC')<\U""(`Y +M0QUIZ5D,`X71Z6WDN-Z-37"V2"1][WO-69SDE(@_,FV)GD;TDQDKJHJJ-I0* +MO-%3K8J"E]E]7X0K7V02:^G6XJP%3"S>)S[3PZER7`*R+<%;J*0^\1^,Q*MW2F.,+ +MLI2*\`EU4-"NDJ3HD:;=I'8A`9@QM_6$_=F4B]=(6P +MKL*K203L?2'MT;,R.1.\'J-;O[W^"$B2"GT?'4_%L>M)^+,SS8Q7)W9$%)L?PY\1$6S&]&2"D>LY +M#TB7S3UFN*]&F/)@U(:O9HC +M]E,$H37.^2]>]@SN=7SG0>83N(Q=ZO==I.",RJ-&42R82!EO&#A-$)NQ#%). +M:R;UM(.RCZ*@*S;/L\^">:+ML\)\C&3+MS*NR0R?"+G`,;GCM>+:8CT0@7N'H)(A8J9?XUQ1W2APUN+FV4),2RJ5LJBW#I=SCNU)N!RO=N%U@G[I`ZS)O8_=ZM7)2KX;TNRE1C[>%^WO7'3F +MRR]/Y=`4HK.2+%K'EKA#FX&,SM>&E8^1#1]$&96G$2DV%FJ5/ER4'Z+9>_EY +MU#'..66*7B7-M6TE!J[5.S=%$TIBU-#/,:,YQ:-F#5Q26Y&8NC?60"`A2P9X +M<0;M.(FSH?\Z5N#`)M39VG8:6FW0OBRQ\(Q/O7"QK +M/)[0)K1-2O+NX8>S]NM\3&RFZ4%D8S!!K,I) +MC'Q!M-VPT:XZ94*GZ,V#6>?)2L"T=(=GQW//0@C4_NL[EI,C$/:*M+S%8YP& +M"G"=N`ENU[B**.:B8=XE0I;J;304Y4!3BB09Y[\6U>8*EZ@,KA4:0RX"%1P" +M`D\$]U5E+;P'??@K#NJ<(0_?4[U;18NJT4:5&GF2Q/HTO_").`YC6]]4I76^ +M`*U]%&&PCFVP5J]`5=R;3,I[*E.W&0!C*ZFD8KDU<[*'$CEI)D2%^IB1U=4G +M6=([`QLK8]TU)9A3F!G1N6O]L4/V[*)&"V:#$5,DA!!(3+!O/`N8BY#H4*M7 +MOG6?7$7:V9LYG.7QQ`_>)-RGJ]7H&)N!%D6"R.@7 +MC(Q[08B%#<&[_SK+%EWTVHI#R9TX#>]"A9VW*1^_HB^N#L-G1G;F]8^U)A<@ +MYXKJKB0!(03J,1@CMJ&Y&CNE^>+S +MHB]YV2?.U8KVL5SBINRH6GI7O1KQ;4QV(/(U5.[28[%E1$,&%8#I9[C@:W^5 +MM]JB/^+@G7Y)6Q!+A=-"1WMU!?LJ!WU,C7"FN;Y/'6^=XL^R7&?@V(O'W@IE\?,6>?"PW> +M:J66J/G]B*MHR:DU&SK4@KI-4]<:.UFL=^]*QLA<>IE1K4XSZN'Q`##$8=[1 +MQ,RKL;(F^!7WB`6B(+*9T$A>9L0RV)/R#MW89?Y6%JH2L;Z[J:QV+V@5\5XO +MF;;2+=`P"OLP5L)-9^_IQ!J%_:`0[F#YJ=16Z(6[]H1DN"=W2_EF9U_I?F.@?]F!$)G4?4'S+1-DO8V!U)5C1J<)@ +M4*8S'\R?=%R!7\=O_7G^X:6U@T;LW55UE'JUQ=[BRGNZ+7AH +MVN,+>R=M-,,5G75@+GNAO`I+9B$?Y#A1EF16N;JD-@7^65G`FI`J%6XU>D9S +M]O%H?`357S">`^WC\\Z@/\S!-1)`7L72TN[6^ZE/N!00T]>ZGHF;!JC3XH%0XPN!G5Z,"+D8/4 +MSTQ82E>CD2NW'3+NQ$YW&_)2X>NLYL*"V->WP80LE`D-C90LUA:[7QN^/`++ +MG$&0[[>MY-Q]'P$4ZXJG@//>2_)4<3@5E=PX$4Z,-SX=^Q+^7*'?*(GI;ELU +MH@7]YR0ZSSS__P%HL"1?MJ,7D)\3A.!91+0B)UQH[^Z\JFCWL`TZEJA8>#.P +MF8*N6LX[25,4WC&"8/08L#\)8?*HX%@' +MG4!KX+]H@^`O\?S7+C=*OWA&03J;XM0:F]9P'$'8:/D#)B><^](SJ4;H[`Q= +ME'.'(9;7Z.69;KA%Q[Y+R,*H,W`Q/->O?1@DVU86T.%T27_LN-^0/OF_.5J7 +M^QPNXA_0FP"R72O]-\8(6+XQ.8\_$)%&54I=PK`3G!KG/.HX@BROF50?$_\6>['F.Y\Z<0HJ;M +MO8FOP!AQ>Y"UFJN`LG\U.*"Y]MB-!0$3Q$Z*B]5Y(5..5''G9WF+>"?U++CI +M>UP4DL3`,2$2Z(X-ZUFSMTOVAU7PC=[?\T(^!JT;XPU](E'?`>TD%8ONG6ZM +M/J9J\%]%CVKBH(M<;A(Q?$S+&AN7J6@DS_8!X)RB=4CS8`\T^Q(OY&H@?K,G +MW&\%R0L"G+#YD:T8MI9@AS*=%H,\P1AY5P%]X6.3>O^/D?'3VCPB[,=K.4HD +M0%D&>XWX:2).9XBUH/"?-20F":9O.`>]YO$$-#KLL6L>K&H[=,LL->I4@/9C +MGQEEJYS1$(CC,P3ULY%S*$#H:N`FL^J=L[.C7T8B3X@8U$N3)VQ)3AV3],(Y +M<<*+U>O"KS^DSZ957'#R,BY6/FRSF072M<,,2:'>4.?8+2ESL%M1GBD0CC-- +MY:\>5ZWQ&3N5-5R"*DTG$ZGTK?,>)0XVPU`E5+/420K'A/C0<=V:U<8$/FO+H4R5FB.6(#%NJ]MM=UI[&V*LGJ,Z[8DH +M^!4ON`#]0K!=8J=4]C!]CDD0%>2B?BPYKX72DA\3FN[K4OM@9LL99'Q+18^W +M?`U`Y%CX,D4D92FB<"-=5SF_:+%V%,Z'W;%/.SKH*PJZ+9 +MT:C`><$D9PIG%]E173QD6S%YRFQW[\QGPM57TCB&LU)EKWXZBZ$^65$3O#TY +M\U97F#!X)=!([&;/'(?F=T>NY,6O9D$9V:DJ=WLD6^ZJT?]F.D+=S#!@?$D- +M-S<(";-\&K>#B%H2H.$%%2G7?:SMEJ-?W#YYV#WG`Z2S$?`#N\P?1ENOW[BA +MV:K`++'P!;.&)XY3Q^9\13*@,YI,N1BW>9Q3HT`L(Y;X_O8!#J&?22JOKC*_ +MWC@^`,MU,P8KI<0.:RP)\7C"SY?,K&-A?SCES5D)]">*6V!!1T_`OE9%60&> +M`G5"9K(KBL]LTCMIK_)@!!T#1B"LYF]?CX>::K5J@S^\*JC<[%;B89>#X\^[ +M?N%P`D'L"<]`TR2E8.5D9CT%`<0VI:OF=;-3)M&SJLMX7/P]+]-,K<^@U&GJ +M'8ZM#&/S0NO@/A68%FIK$)7E2[GLXRPT+ +M>;Z+Z7?A@,WVNRD9'<_9S;MD*C;],L,_F7:#&B84RP%&5C._NW`CK7\.X)%E;H-1S^(I,F8,+,7'O;=G/@^+YW=[I8\Y-8 +M^<7QB[W\.T$MUFA=\T\RP@[U0WB`;E5$D;?%&J2K(1#D8T8 +M0WA@9>'#1`;WV;BTT^59.P?`F?.85V=40(M!Y_*'NCM&LPWSOS5[A9^@4>`! +M168.+I4O^4`0H[T2*&5J5GCLK:V<4FX+\0!9)_SUH_%3#X!8Q.R\AR56D0;U^0"6-FW05,A<<8:LQ1U2FF-Q<8RI+X! +MT\03>EB/ZM'G(&(H:.GN9]0J9Y:*XUIK<\S%+*!H#KIM0^D$1RYL.TFR`_PQ +MZ-4:AON"D;)P3PE[S&RG]EA#QXP(KTHBN-/L9/WJ;L:$.\BA>NB2Y::WD^3H +M=5274?BBO$@XX.E&?GU6T-`C\%:7$Y3IK_U5"W(GB1P`S%6V]:'N*[ +M+48^RH13>ONN+N>5VN6!C#_&EI.2OQ5'` +MB"3KFE<_FB(@K`'=U=BEI.+RJ"`Y`S/XCI3N()&4OIL,=R\%SY8,MIQ3@CDR +M$6';""@_"3`/6'H6E4AE*.8$E2A3=_T[^V3.RUW5,+K8?3*AUY7)13V\%;XW +MUFJ,S@-FHG[51X(4`-F[I_Y.5)M]?3$9KB+44:\K6 +MQX*OAFBL;_\6ME#EB),W2X7TE?R-=X\SC'2"O^8DWY5%C"UH@'P!3!@T8H'3F=?8)877J!'N33P'< +M.*E!,R8"_1M_L4Q$$P(^\!IN!1RW-/X+6HTZ=2N&S,OQ?K)?R1PQ:=A2_Z&\ +MD8[^KW-T]E$\(`.QNO]+HU6Q>#+U:2IZ,E4]F#_$3ZHY23E:4#;W^KS>ZFN$ +MG1!L;*>=%;JR=,MLT^)")7L275PQ7U9AK^?QEMB?[S]NF7E5]N%178'BEZQ, +M<5MY^^/G,V@G)]11.*S[K]3T:7I"6^GK?(2X-/X +M'QI!!2-:Z?6/;"F-D?P8?G502XJ6J]]I6R?N_\WD7,M*T=;X&P%N3U7I7$B= +M*0RG@[G_K!1Y(.*-4'6[RYALT%[HHC=^E[14S^M%X^HO@E!OP*VQNMH!D=]W +M#C;#^E1AFM4G1\."^A'D,&W26\NN'Q#$DFM,G_1JJ,IB+OF)_VL&0W9F'V2P +M,]]L7\S;9SLOCT"QNTM;&+,E>D$;13SYXN(AV)60TI9_'KJL3$(2KQ5![N58 +M'WA[)X,D]OB@"_&0KU^EE(FS>GB%&W%Z-I?YKP)NXV2ZMN]V4[V*?W(C7@!# +M8,$O_BVZ)9"YMZ@8@PU::R3RFRPH584MZ)'HE_?Y?G(RU_0Z`<.KDP?]E&H( +MSZM)]PX/`D7YFD8&;YH5IG$9T`TH5^X81Z?9ADM(]RAB`?D&ZF>,P@ +M9-HNFEMP$>8Q=+KE]*MC('[?=37E6$Z'C-;7Y;0K>YC9PA&A3+`8$%$^"*Z2Y)%D$R>TWA)*6 +M:1>F>H:Y8"?,,?D&5)@!E]`3&<^<>'Y+]@)OTZ-Q+%"4H5(*F/JJ +MJNJ&05Y5[G#Y3BE#S]#Q4#:/(,Y#"[@*-+(][KH^9B$2*'QRJBX/FLD.SI35 +MFKF#&Y33Q>Y())J;-<;%E_X[V)#\Q]&XU8O#A*`T0H.2)OXN76#!OF6/6@F]7 +MW*,\3CX=;"'!*"P;W<:1ZOOI@3]?([YO,T^@QV2>\`YH+0?QU#.<0U%Z"H8; +M*^'EC4[,9%;ZLGF0A:QA=W-'*)LE$&H1-A<@Y"-:-GI2#/_*>F%='B%"ZB>9 +M?YS)[948MS-`.4!81\Q7![(6T,3`J+F5+7GV0QAY)4/&5G>*``Z3#;.37)O> +MC.97U3@X*-"1$SW`MKP$4Y"NU4,FA%WK6#8_Y5^]?HD[L<@7&\4CVHK]$OT2 +MT!@B=%5H/53P7*N"AC4]KX1T(-+"$03\Z#B,:VZ&1DDE$OS_<[]$QCPP]J9K +M>NTGRBZ!*TLXA%]?T5IK;;+@1]/J2V$#\!0KNRL78R-@YD2-:!^U-RF5(*S; +M6QAV)84I&4!$=02+&Z!5-241B$8]$'D<=D%7)X`77N+($NZ)P!0$3$G]XQR: +MUBIU&/ITB.D&QD8_#!BN91P@AS>MJBF#VI53N_42=<6S,]^TRHBDKM27\5#L+^('";+`WO&3MZGSWQ%J;*%97;O85S;3-ZRZ#8; +MDW*0.2#,\(($>$62U^W98?QPI$!\Q#I]1[YJZ_ES,1<6.L$$ +ML82XLI69F#5('(4Q_@R9!,0M7X2>KR0//LEXQ?8L7%B1%W>CYQY'8[)UW-/4 +M[TFDYQ!`GQ-50FC/>@32\WE$HEK*Q&"NFWR\O`;1NL[ +M`(?I\45$C0Y50%^_[Q#Z"G%Z(CM_&=*U!\B6?\,HQ>CV*(8PE.7E=.&;DMRV +M'%#TK5,GV9X?6.Z;P'#.*1G%C9VHI*L-L71HR<%YQ0_C*]G5P4WZ634JNWN# +M@1H6BVWP3]B)?H@FW9J66+UP#5+959JHONG@_3=($`A!B*;&"P=H;IDGT8-@ +M7\C_8\"FT$7@U;C%NOYD=&/E,5%,B/#'>_[XUI28"0\JN_(OZ8OZAM-,@4*> +MWA.C;;F+[=6?V_-P:CBW\H/<:JO\X,%$;"E+0TE'EK89MK6>^C[9;=18S>8IP +M]9VA=>`;TT\9U*(4%]M`PRO)>7L66CIVR[@U/!FL#-9\O'M3.J`SZ5)=@\X$ +MAE83<$K:ZI4:Z%]_XD[?7/CM(R_&N.DJZ;P0=.`P$JV)0L3BWV;3\0^DA@ +MW<12/__-/=LLS^HCZ5E><;RQN^^=SJ-SNT%?91$>Q1]!+*#RX30AIN#]L1NE +M4TMF*MW874]046/XI=Y__/^&(?_.5B251)6L$^7D=A85\8'%^442Y,;6@O?< +M)N[*8P'O8\/0GDORO:XY:=Z^P.7"W3';"/^BK1Y5N;Y"4$*S0+GP:Q:M%KI4 +M3U\Y*"726E811R/EMI8`V%,%?-O\/'#UK*0=5#?(R^5U7.GH?YJ6TV;EP.9G +ML@XY\*DU[FU4X+@!5,//6<:*3A:[YI-YFJ9PF%!4;\K:=Z*^WDH\]&C5 +M4L#"7(X866A%@D]95;+8A9SMYV`O'/UATL`W<][GB!E+FC=YD^*D%,F)N8T5 +M6E:MA+;%0LYFIJ("95F)CK=63E3"\"FV%PZ`/0H9.WQ?DY&*QUMX(RZOJBP] +M*P<&1;KUOP@UXU]H2C`W>^84I^-XXT$/]@5/PDP"QH=M]FZ(_W$$02-+-[H` +M$5CB([_UO4$N>"F][XI:0O=*>AS+_NE@`?W*R6B`51'#:"8>\"C-6NXXRR\] +MR5<&QNJ`:I:<1D=J]#1`>5M<>USVSQGRFA&MZ_)3DPZ-I558K.9+IA$B:;IB +M-HK\^NI:Z]"HJB'J>@EW)&MLKFF_%H6LPNV^F$?AI;TH%+Z-N.RWV11[WC&: +M:BCS'HL+DJE<2J2^%,"(_X-\O\`RHBJY4O2XDIST=9'"Q?"XWU-C;@1H73_8 +MX+1!(D:M+=G!R"%!VXBA,Z4"$F6JIRD6';&NF(^G@,T_)2_=IG#$";1(=UV( +MH$1LO7?BN;\ZI6LI^R?,/U:M_CV..6M_?YAMHJ?=.JZ&BY`GH8$IV@56BCC) +M[&WU/A#>(Y$*W-"+"%YFX>[+3$5>31FXR0Y8)DM$IISZ^I5(ZLL0R!/XO>N7 +MN8'TQL2VE#N^*M?BX>M`<4&KD44&$2?*^7S"U7XC#`&L$ZA/P\B81\_ZT4// +MS`[#P476`N.D'X4N&X,\M-TU#6(K*3SXA/:!T:D!NARGY%B#6)5KE>2^1Y<0 +M_,6"N*G31C]7TR^P-OIPW),9^UI\DZ._G`KYL`P;4Q&^?YX%[^%4)3.\2=Q8 +M)0$88G#QIV<_`._E'ZL!.4/5!\&7DJU:,/)2;P54GBQVV`#0.^0WL<<(# +MI9[]AZ2L'6XP':P+NJXWNNN^%0J^"77.N3HQ"O([L%43QAKOD%)X,_!?M2?` +MKXG$'=N`K(J>[L`J%W?V=]K7957!][IOA(8?"H/#P$KL&B[67I!74W2C$12YR?R(N*T3.Q?5QISK+[4005!MAP^%(QC5%A)IID4` +MAM=3S8!/,#;Q`\%F]-KX5&J0W&T/[;7!7CC*WYM6"'*N;:JN,JH7QUE\PSP) +MS=[1R"JTM-I]#OV[M2?!Q[3CT(RCK*Y>J1+&M`T0E4Y2^-.C&!%PD(/NP2HR +M8\[^Q8XY;UPNW^T'+T0".N^)`"XSRJ_5SILV_-\@"8+8+]'V +MK(T\T5V0R.^V((&%V'$><#@N!Y1.H9<4:ZF +MX>6#ZW6S&`B?%HM\N[Y.QNJ*&0U5)9"=&=G)*P4<.",+2C;AD-H-/Y^@5=A.`YHIQ, +M%8@S$;L`,-M#DA<%C`)0(CS74?2)B+FFSN2`Q^4@TI>0;5)?7UQX`,,BU:TN +M*M]GEDFF$`U3#Q4W4NYWX8!`9$RXZ(3P9GKF#-R=`B8R5X6_R&7A92B?I&,U +MUJYY_+H!)S75Y8%!\*]EE):+/X6Q[#3A@A]>.B0ZD/8*'9DG?^(C8^)O"E^G +M^6;J2RZ?JL90W\;$8"=?Q+O9;R;+`)XAI[VIN!G"SD_BQ4'A_NQ:SE#8<9F3 +M*(@?H^&!^6]F-YH.O*-TWCL9/GV'0&:\`N]04`2?3-]-V@J5CEZKA*08H@&1 +MDS6992Z?MFJ(/?:57.1LSGZGHQP'B*C#F9X+*8F1S&YAL@[?F+68G06 +M.;:]TACHBAS*4'[]2-HG#*1O;)P5SJ71:_HP1!Y-"6!/VU!'F<_SU%Z;\BSJ +M0@J1=R"ZFU+)IS_G1_`2BPVGQ:\LJ[@\)]?Q4^TN^E]!H +M%0WZ;EBXZ`A%I3S&I1?Z?H5=]@RU`RLUJ@[[#B9+N.\._(!.@8>P3M.((2A0 +MZT9#R[(_+C1?)KM24CD;L$O(!/:<+;*NX?]0JY2XD[`"'(3U&R$Q8:/_,P@- +MZ%^%G;'TD4Y6]QNNV4.%Q>U+&;GW!X-1P2/P#A;,)SG^/(I&[K?->4(4/*>\ +M"LMD@*3)#66=-9^.AY2+WA>4&;NW:"O`O6+7$T)3J5($(ZP3;O-#+W-A^$_9 +M&13\>L7>BZNB5Q.4?UQQ\G\)L&;[XEDV^WH8L$DKYR(P%;,#WX@XHO4PG-#4 +M:#ZS,+*+L_N=SR487I,$.J,.1S< +M7T1*3/\7+<.]GB50FD_")12(R+^LDQ9I"X'$K"BG=FBC\+A_0"PEF2#)A/_9 +MRDW:%/:N31?H[F!W*^O7(!5(%K\;Y>K6G<,<;Z2#:IP8Y"SAF3:LG5U7OY9L +M^XE/^2YV."6=Y!YPKM@G1ST!/1R=EW+)4RCZ:'-&%'W^S/W4C6_>$ECX#H_C +MD"8E&58^TZVDM*4RT'DMQ(\"G%DKW&XA>CR()Y-JO>2X"G>CTNG1U25:0%R- +M7RCVR!?AB_"^5L[%W4I_F@#FL!AV6^KE>B8A2Z#SS5<081O=C%&W6WP!VTSD +M6K!(2EC;&A`X#-](S@''3AM) +M-$?R@"?.S#!/Z&PP\Q+$]ETS2"3S)['?"83ZR)I.XX$TF;$M1MZZB(FLFF4# +MX`/*@_'U?R_?-5T@"^6'<5%EW&QSQ%.%)&1VQ_N+`J12\\*6W-_!CU"NK:1!)Z1FB"/AAU)WA6WG1?Z` +M*R3>VOR)GRP,<)$S8UR&#'JD]%5B^X]0B!\I(/LQNE^0GMQ>H%+B]P'"I)+( +M6T"67Y1CZ#^^'IDSJOPHA+)6,]V:,%O<\@E,,UJY_;??E3)RQ#I_8K0#\T6M +M:\O1GEDML+)@\$&`M41F3T*^#F^W>*9?9"3L)QM$Q[-)^CB1N(5J_$8OO$@^ +MG.X;8)OS^#I#^74ZKO.+Y!0HEGDE88DOQ1_&>J?JG5#UUVY2^JA'I9<0!"^X +MT/Y?&H3Y[3\=PW;7P]&`3)F``9Y+`.`=7GLHA/` +MC*N]";A!]9JS\BNKW"?1*]*9=AU-MQ#/5*,#QL\TUB+=,8R&^S<*[7E^ITGT30?)9, +ML&$MN>4Q:IF4^H/<0!N^&)-2>P76:XXW.>_Y>Q="V4@\-M&W7\%"!?M(2`:. +M/Z:B.(3W`"Y.I/!6KOR=5$3&&?47ED3WNB,1IXBU@PR)\.&K9':'SYNPTDP3 +MS8AR'ZVIX,.@`I#R?'FF/R^BPOYA7MA9($+3LO&PXIMGRUO=H@60+A"K+=(@ +M#PUR+FF<2=534=H!2X%%A6F@(1*5O?M1^"[K^$R;4&F^Y83Q-VEIVC0.297Z@E+'W':*LM0IWMW5L!!T![#!!0S%G9&-NQ +M@/W\NC]>;8POM;Z61H%49+JF)KG9`#`JE/303-_>WUAWFL26$VMI2!YEX@\( +MI":85W[*,X?#Y8/,YAQ/40L\P]=H\S4)R.K+B$)VR'8SE/X&=X#T.8M3WFN% +M_J?IXO>LF)=XQ(YAYO\^0PI,R'T@S[4A!MJ58]O9YK,HQT[[36CD%G5MF?"6 +MT;1W8&GN&9#!VNR05MEQ.E4*_FW:'0=+H:=-K:ZHOTZ8J&"5:;- +M4R,P`L6EQ^1F>[P\CAZ2.13\'/T5W+;_T5\"`EIOJ8X"6I!`U(66AE``>@6] +M+J0"7D8H@S_2MN5-0`_)R-O5!F(W?&8F<^44U+RQ)K$A`KH_(?TCO)%9E-KS +M+B6'#+_@Z2-:.^'J6(9EX"K=7)TU?9Y7+$7WS@$V]KU?@4?F0QG/UO[;BI]1 +MKRSX]DP!QY4")LD=DMK!E4-%,86SXQ,WJDMMS75LX?"5(MD/"-*W;T*A-+HA +M"I_O_VZ)0K?J&&!MYO,#"3C?)OS6Q/RDB;V'^^`L)!?9IGMD3^^$&53GKPFJ +M84YZ'-Z,J(:>(?*^+83V#+R>CY:\X`G/F,2]76%+@SAK>3;++K%>],O/YWU5 +M`@;9_>39<_[E7Y'*:C4X`V$N66SEONK2&Y'\2/;_$?ETG3QV9T"$\B(67%B4 +M$V6<,[#VA7N(S'UEHNTS-!Q1Q/CMG^"9;P%Q>DR+EX-PH#NP*]'V=;Z+WMP$.Y +MG_"V&,%3O.4LXO#:3L3$0',7M$/&$.56L_C9CD[C7@Q0MNXL\"052\Y:--X0 +M:[1%6#8`C[YAD4I@IT8COD-!#].=VH$Z4@EUA&R7?H#)8S4BP.TW;EU3-U%USDSV'AX](K#UHRC''`K6CZC+,8G_B&&0U7G_.&W!\A;V4?PSUV,I8`C(X9:82ZUEC[/3`@U +M-NX<=/>R`N@?M#>@P(6W7-!\:@Q7Z,+/"2]&^`B6[\Y4M?+[F4"CO^*R)221 +M8XGX:^GN.D2A\SMW&4J79:'/+[5U`'T`NVC26]C?UC`]#K$KUVL,7*],.I-` +M/W>;+J=`%+[.'K\G(SBY;+):I5NO?Y]_W]CI=37#3&!^GD'+`B$(`K1\[$!1 +MZXY2%RO[U.O$>(QZ!W]EI;;O)JR#9@<6"MBCN'G/_V_&%3`<(]H[4`S_FXI7 +M9<:OB3357K_&W:?JMWVH&!J?^(DBK\34]/N-,0!*I&T`V7^A:1IHD$VQYR?K +MT1^&6\I.J-R[H+)2NE_`NDVG2WE)-A6R[\A.CR@=`=]M3H!\!Y)UET(8I9,V +ME*K5,1P(YV_T7J5Q#%Y41UV_>MWOAUJ/*B=WT6"#J,G%I[,@!/[_Z'[56[]1 +MP*Q$GLNEPNVZY-(=L:<"X9/[IOM.LHVXQ$\B6_KC/N)9Z@R[L17-W2K7M+0R +MPI$6)AT,CE<>0U2"2<5W105@/<^B&.--4MAHP.1=-IBK[&/!*:)JFKF;T]CYA.'+?])HFZ$=A`W)CR\4:?R[.?;X0GF`%WKL!V:Y;E[ +M-OTXB=9]8$S/ES@2(QY8H6XHT'PP80PJ%G^7+;:6G#DO&2/Y[OGCNKI0A)3" +M*+OYH>/@]U)!1$4@!5+G`YK4,_`%YWY!*VI-]!K^44):8ND?.-@G%E=?&.\G +MCB3G#)SV:/)H@$]=VXME"Z\]`YH:'TYU]]JU??JV($.RL*&32)O,B5HFI9BA?&)<<^&W4!??@$:MK844Z3%;#`C+X$2:5 +M176N#/W2&/LVYB5?^4]/WP3%U2<=8L9_"DE`7W2A`[\6[*,WNT=:+I0#!C6L +M;VP?F($*'D\7'\#*K/B_LH."2?F0T#IX@G> +M%S>"2H&>'0D#JUY!)7K+#*WLN!7[_BEAMS):B^F^5(](O?UZHT[;"8<9P)_W +M"N1_LD>T33CL:!AHC9?/7DIPZLF%;2FCW;BY0E2)R_QQ,C.L)V+0B(2*M1`U +M9`S%9+]#WK(^@OA?;B&6X_-QF&YR1D@"&EJ'-H7M'IKO:\3C9QE%_6OZ,K\A +MW61IFJ5[V\/G5=CS,:W_?6:0725QW;/X"*@/J,J@ +MATS@8_VSR_B_J,\7,Q4OL<((NJ\B:T$_<[P4>R'Y'&0QR]3UW/@T1:G, +M*AE8RMF@AEUL0?'PRY1*)#\7[=(0Q>"=R<*@3;R?OM^90%CH-Y_+%-O*@XM7 +M&5VZ/`)#7YJA:JGP5ER$$H`W@VPER@.R2[6Z;.>AJIJM6W""MLC$D5.$8%SD +MB2-9O-IPM]`UV?Z/K6!><)S02;<*SL^)'0Z[='PF_<(V/Z:`OQ'\;01!>VYV +M:`V5C"2HM-I;H\JD6TO9$9>LK2;%2S@C@5_*?EF.B>/SAQN,6L$RIW;UEF.4 +M-$9GDB*E(M`-@H[,T0\:YAE$FZ`6R*T_+QZ,.YB%#$=HFP/B4F(<$>0P`4UG +M9B.$;M4"SKOO-,BYO;,(\#==^(M]GKV#Q]C*0**5+A7#_MD>(Q8^$X!107P1 +MV9L[M>7*40--%_%`Q4!^Z'A3>57+3M-'KMV'[E`?M:2"'YRAWX55S55THU]Y +MX1`!DXMPV\<>%CWM#'D_657/#KAXP?65A)AV^Q\5N:KZ!=Y+,7LOJ1,G&5K1 +M7B*ECY%2T-T#Y:;N5@)]DM:2P/QVM0G:R!QP[H_'PE2':J-;" +M\#>`(V@X0E_3$;XEF$]`3Z\_,IQ1&3.@>?]^#%?^0K$26).3"$@X(Y.`$$31 +M7A(ZFMH$,Y28VE1W>N.),6UVF$Q`)`=J'.:07A<,X"-4W^[5CE5``,8GQM$& +M!K=DO%#D%E&D";^@HU6)ZM#_0J*$YFQW&UH]^3=I +M-KY;J8HMFZ:"N00N1^`&3+8,9H +MLGW[.W0?=NS1;R"@*;&(U@8TJXOL\+>._))=Z5MD$6;C[0J2J+/E>;)2++QX +M',Z)CDUXCGQ.TX_<:#R6!"; +MUV-42_0XJW\.U3&.TQ-_L<,NRU;>KA_?EJ9_BF!&S%N?48'O^'U)7?\V?C86 +M;$$9M9?=S[^X[9G(@6VDJ9@"18308_M`(N!XDE+$;*B]"#@0K_9G)0]5>^`X +M#I!_-;S!8BBCQ.%A#W90L%_6'<^71:="8*+M-&(*H]M9`S!?PY,G';L*TOE0 +M7/P(6*IXB(R,LU84;T'Y8'S`"I+@&N8S](B4=X%=VD=EPDX--UT3DHJL:&JT +M';VD%QW0B-]6;X=93Q+-V/L6*@G+`=^5F2!%*.JHO)*A32O,6<)._+M![?PR +M8?<1;HABO=.NKP83.3).\C2%EZ7%56F_%8QD&(7_KP\83`-\<#(D&8/]D*6ZZP\F+$B$#!T)!)9(-P``0Q3O2S\S1S-/O3&LQ-<%LON;CVLCG;%=Y^@0 +M.1G2*'0;8M"3_-_P4ZNME"0+[Z.92%FH9+*F: +M*")C;*"HO9&>^"S:Z)39+.3?ME9XD"?<;N@YVQM$^?GTU]E&EG +MEP2Y+H)B'L$PE4TGIIVF=+R1YA(OKDHOF75ML5N*&=JX,S3 +ML'UAYSPMZAAJER!\*^0:[_5!=QN9N$!4DCFR]<%?^,Q_E\Y/(-A4_;"<;?B1 +M5>W8:+35*=7F;R(:%P#NR?UO0ZT\&(N1OSP8KQ'"AU.4E#>.#P[` +MV'<-QL7:^AX<5`HGB'_OOR9RQ@=D-.^)BD\H'Y/?I(0#6&&L6$D[0\<9Y>;> +M(\Z6ZO3WN=6CR.9Q%(4%_7Y^Y"I:J=&1XC/+(#L$JB_(G?R\:O+3"!T8\RFO +MB5[X@TOPK.(*T(>5??Q +M6<#?4P6W+3^':#3(=KC,&>3M2?/P8@*G:DM4!),8 +M%WTZ;+WJ'`<73NB,!SVOP;M3G9(29]^ZOB^Z6*=@UZ(EKLE1)%L9UR/X',B[ +M!2,U\N;W*@(6>.VK/#8Z=).`6%K09Z7KNWHUTD\T4BAA0`8VT4$0K@OXK#:K +M;<8"8'_5QN4WI*-<""F0D%J-5868;M7\F#CG)^:]WUV@^+)1%:IZ.E(M1,_B2*>I9EYU\>Y10K!ND&UNG5"RHQ(3\+P3JY+NW4NA +M39JLJ'@)!-`(^+7N$*,62O)4R_(M>7&23^?DGKW&"/AKU=+WC.FCBG;F;#=W +M)+X8@#U7>`G-IJ_?YM?4?:P3&8D-HLU^+_&?YWPONC4]7`C8$%YH2ZA?A;0A +M1&&!OQ#`+VH[KJ;*LT5^H;?A1JF;`;,^PPC"NF1O-$TE;?VKYG`ARY[G,'YH +M%8K?-X.9'&C)15)2SDT.3F[]'UFS[B$34!P^:X%'%1(E]7(I%5\;M115L0&/ +M64DIODCFHZRM2_9*:^RQTITZIPV_.AUDPGVFG3_YDJYXTA0<\['7!I14[G]@ +M6"[`8A2$"DN^;&,/?)#^4#5*3P*\E1.:],Q5)$ZV&3M9U4.I%\V"EGJ,@OC6 +M5_:MX><2!ZR<7=M2KOHL2F$A6J]I6E\C_<0&E4NQ?7V;E)QQ8D2DUE1R3>\C +M#$V9Z90'4N92-,1*$D=*G/9?7S,-\?/S4LF=^PM_)`Q*O"O$7#D6IA+#%8LGCX#HG/!D?HX'AR=2-QR11\Y +MWAWK$L^HXENX<6"V=OW]_91'J+BH'.B$S93#/FEA%9^SUN7Z`"XR#?V93=_P +M2Q?!KF2:9>\NZ@#+IQ&8U[018*Z._Z^%:K^:'3;(Z>*_*Q/D^17203^,MNOL +M>>0/C7>IJX>A+Y/V#<6^F,IKW\!!IG.-DFL4V6=B94'Y%B5T[3D4L@)91EZ, +MJ(W+-F#1U/<>N2L(DLOTT[N__MH=(-%CLO@```$``````!H``0``````3%I) +M4`&-`%P8!Z>2U-["^)5].:K-BO[_0:QY`;G+*KG)^"B=_8>[3?I.H=7"Y%,> +M2>,*FBXDW:@+"'N"6Z97U*LPCB[;T"#;PV8:VD4_Q-ED*N7 +M?VXGQLO#_V#X&$GUK<=+U+5&CCX[NL'1CWC,M3^/PUC^L8//T$^;TD=07Z+I +MK&J?QMLOX#EV1B5CB2+>=7BYO/@#?PTA(DI8VM#'X7J*:I@L3F/_W1,9Y(U? +M+P6@U#5+?22WR*X$2HM68)@0_QOR%Y>.D_"BND'^Z2$TN$9M,\GZ`N*5#I.I +M._$ADQ8@O7F(SWL@UIJVV,VR-%11O+71%6,.Y(*(2<6\H;;MT@]D]2+0D] +MS`B3PE8Y`T%JA@I+8FZP^@5B$/V;K6G& +M)_D71^K31&O5]R83WVR6V2/1 +MX23XQ9TS)M)Q2KL&(NP15;E^Y^GOYH#R&`+'\-16VD8%$;^?7*\U,#O)-^X! +M:K\,_#9G>M!CT$%PUE5HPCTC:<9_E!_%@,J>%T;8_`5:]U`]58>6>;.A%N-] +M52?*B11FEJ;*^3RWD+6R_,#95S,V>ON/___,%P``X)_`W2"/3R1F1:P:&Q9A diff --git a/libarchive/test/test_compat_lzma_3.tlz.uu b/libarchive/test/test_compat_lzma_3.tlz.uu index bee82897beb1..1976f364d211 100644 --- a/libarchive/test/test_compat_lzma_3.tlz.uu +++ b/libarchive/test/test_compat_lzma_3.tlz.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_compat_lzma_3.tlz.uu 201247 2009-12-30 05:59:21Z kientzle $ - begin 644 test_compat_lzma_3.tlz M70`0````'``````````S##P;IXPT!HUK`DO\DC[V2OB%Z^'=ZT59ANYMTD(1 M$Y^=;\4%U_CXKQ*F$OFZKEQUG)1U8="](V<2K"U1\Z6%H(UNQ[Y3.=D'>_G- diff --git a/libarchive/test/test_compat_lzop.c b/libarchive/test/test_compat_lzop.c index cd43afcf3e99..2da4e8eb6dc2 100644 --- a/libarchive/test/test_compat_lzop.c +++ b/libarchive/test/test_compat_lzop.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Verify our ability to read sample files compatibly with lzop. diff --git a/libarchive/test/test_compat_mac.c b/libarchive/test/test_compat_mac.c index 5caa17f83e63..976f04a473f6 100644 --- a/libarchive/test/test_compat_mac.c +++ b/libarchive/test/test_compat_mac.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* The sample has some files in a directory with a very long name. */ #define TESTPATH "abcdefghijklmnopqrstuvwxyz/" \ diff --git a/libarchive/test/test_compat_perl_archive_tar.c b/libarchive/test/test_compat_perl_archive_tar.c index 165a519a3432..94abe3f056a3 100644 --- a/libarchive/test/test_compat_perl_archive_tar.c +++ b/libarchive/test/test_compat_perl_archive_tar.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); /* * Verify our ability to read sample files created by Perl module Archive::Tar diff --git a/libarchive/test/test_compat_plexus_archiver_tar.c b/libarchive/test/test_compat_plexus_archiver_tar.c index 0f8bedc2df5f..419e84b1c4c9 100644 --- a/libarchive/test/test_compat_plexus_archiver_tar.c +++ b/libarchive/test/test_compat_plexus_archiver_tar.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); /* * Verify our ability to read sample files created by plexus-archiver version diff --git a/libarchive/test/test_compat_solaris_pax_sparse.c b/libarchive/test/test_compat_solaris_pax_sparse.c index 0ab333bb180b..c25c4eb8f51e 100644 --- a/libarchive/test/test_compat_solaris_pax_sparse.c +++ b/libarchive/test/test_compat_solaris_pax_sparse.c @@ -23,8 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); - /* * Verify our ability to read sample files created by Solaris pax for * a sparse file. diff --git a/libarchive/test/test_compat_solaris_tar_acl.c b/libarchive/test/test_compat_solaris_tar_acl.c index 815977290670..df7435c7cbec 100644 --- a/libarchive/test/test_compat_solaris_tar_acl.c +++ b/libarchive/test/test_compat_solaris_tar_acl.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Verify reading entries with POSIX.1e and NFSv4 ACLs from archives created diff --git a/libarchive/test/test_compat_star_acl.c b/libarchive/test/test_compat_star_acl.c index 824710194c18..749f5ce34294 100644 --- a/libarchive/test/test_compat_star_acl.c +++ b/libarchive/test/test_compat_star_acl.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Verify reading entries with POSIX.1e and NFSv4 ACLs from archives created diff --git a/libarchive/test/test_compat_tar_directory.c b/libarchive/test/test_compat_tar_directory.c index 5750db3628e3..3d086f1da7bc 100644 --- a/libarchive/test/test_compat_tar_directory.c +++ b/libarchive/test/test_compat_tar_directory.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Background: Original tar file format did not use its linkflag to diff --git a/libarchive/test/test_compat_tar_directory_1.tar.uu b/libarchive/test/test_compat_tar_directory_1.tar.uu index 3e1ead9b5172..513d55ffcb78 100644 --- a/libarchive/test/test_compat_tar_directory_1.tar.uu +++ b/libarchive/test/test_compat_tar_directory_1.tar.uu @@ -1,4 +1,3 @@ -$FreeBSD$ begin 644 test_compat_tar_directory_1.tar M9&ER96-T;W)Y,2\````````````````````````````````````````````` M```````````````````````````````````````````````````````````` diff --git a/libarchive/test/test_compat_tar_hardlink.c b/libarchive/test/test_compat_tar_hardlink.c index 73a4d54f97fa..b8517440aea5 100644 --- a/libarchive/test/test_compat_tar_hardlink.c +++ b/libarchive/test/test_compat_tar_hardlink.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_compat_tar_hardlink.c,v 1.3 2008/08/11 01:19:36 kientzle Exp $"); /* * Background: There are two written standards for the tar file format. diff --git a/libarchive/test/test_compat_tar_hardlink_1.tar.uu b/libarchive/test/test_compat_tar_hardlink_1.tar.uu index 95dba54c256e..eeb31786da7e 100644 --- a/libarchive/test/test_compat_tar_hardlink_1.tar.uu +++ b/libarchive/test/test_compat_tar_hardlink_1.tar.uu @@ -1,4 +1,3 @@ -$FreeBSD: src/lib/libarchive/test/test_compat_tar_hardlink_1.tar.uu,v 1.1 2008/01/31 07:47:38 kientzle Exp $ begin 644 test_compat_tar_hardlink_1.tar M>&UC9"TS+C,N,B]D;V-S7V0O4D5!1$UF```````````````````````````` M```````````````````````````````````````````````````````````` diff --git a/libarchive/test/test_compat_uudecode.c b/libarchive/test/test_compat_uudecode.c index cfb17c85788d..d6936d9dcd5d 100644 --- a/libarchive/test/test_compat_uudecode.c +++ b/libarchive/test/test_compat_uudecode.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static char archive_data[] = { "begin 644 test_read_uu.Z\n" diff --git a/libarchive/test/test_compat_uudecode_large.c b/libarchive/test/test_compat_uudecode_large.c index a2ffd22663a5..c4ab0ec3fd0d 100644 --- a/libarchive/test/test_compat_uudecode_large.c +++ b/libarchive/test/test_compat_uudecode_large.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_compat_uudecode_large) { diff --git a/libarchive/test/test_compat_xz.c b/libarchive/test/test_compat_xz.c index 572729c48542..f904583782d2 100644 --- a/libarchive/test/test_compat_xz.c +++ b/libarchive/test/test_compat_xz.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_compat_xz.c 191183 2009-04-17 01:06:31Z kientzle $"); /* * Verify our ability to read sample files compatibly with unxz. diff --git a/libarchive/test/test_compat_xz_1.txz.uu b/libarchive/test/test_compat_xz_1.txz.uu index 9d4b8e8ee6d6..af47f4eee314 100644 --- a/libarchive/test/test_compat_xz_1.txz.uu +++ b/libarchive/test/test_compat_xz_1.txz.uu @@ -1,5 +1,4 @@ -$FreeBSD: head/lib/libarchive/test/test_compat_xz_1.txz.uu 191183 2009-04-17 01:06:31Z kientzle $ -begin 644 test_compat_gzip_1.txz +begin 644 test_compat_xz_1.txz M_3=Z6%H```3FUK1&`@`A`18```!T+^6CX`^?`(-=`#,,/!NGC#0&C6L"2_R2 M/O9*^(7KX=WM^(=KA(RH"\09$$)!Q_+JUHQ*`]R;ITL_F3/I6:^Q0550A&)B MHS@=K]7@K1-9FOIP#PU!I?E5&IHH&Q=N>_C&G diff --git a/libarchive/test/test_compat_zip.c b/libarchive/test/test_compat_zip.c index 813ea5dc6701..e2d41cc9b439 100644 --- a/libarchive/test/test_compat_zip.c +++ b/libarchive/test/test_compat_zip.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_compat_zip.c 196962 2009-09-08 05:02:41Z kientzle $"); /* Copy this function for each test file and adjust it accordingly. */ DEFINE_TEST(test_compat_zip_1) diff --git a/libarchive/test/test_compat_zip_1.zip.uu b/libarchive/test/test_compat_zip_1.zip.uu index 29cdf96b029b..e13a6cac29d9 100644 --- a/libarchive/test/test_compat_zip_1.zip.uu +++ b/libarchive/test/test_compat_zip_1.zip.uu @@ -1,4 +1,3 @@ -$FreeBSD: src/lib/libarchive/test/test_compat_zip_1.zip.uu,v 1.2 2008/06/30 15:49:12 des Exp $ begin 644 test_compat_zip_1.zip M4$L#!!0`"``(``B$@S<````````````````4````345402U)3D8O34%.249% M4U0N34;S3!BP$`4$L!`A0`%`````@`6'QO2_E8(*00````#@````@````````` -H`````````````&%R8UQT97-T4$L%!@`````!``$`-@```#8````````` -` -end +begin 666 test_compat_zip_8.zip +M4$L#!!0````(`%A\;TOY6""D$`````X````(````87)C7'1E!BP$`4$L!`A0`%`````@`6'QO2_E8(*00````#@````@````````` +H`````````````&%R8UQT97-T4$L%!@`````!``$`-@```#8````````` +` +end diff --git a/libarchive/test/test_compat_zstd.c b/libarchive/test/test_compat_zstd.c index 134775816a94..34b8edeb924d 100644 --- a/libarchive/test/test_compat_zstd.c +++ b/libarchive/test/test_compat_zstd.c @@ -23,8 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); - /* * Verify our ability to read sample files compatibly with 'zstd -d'. * diff --git a/libarchive/test/test_empty_write.c b/libarchive/test/test_empty_write.c index a983df503993..b5572f73d77a 100644 --- a/libarchive/test/test_empty_write.c +++ b/libarchive/test/test_empty_write.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_empty_write.c 189308 2009-03-03 17:02:51Z kientzle $"); DEFINE_TEST(test_empty_write) { diff --git a/libarchive/test/test_entry.c b/libarchive/test/test_entry.c index f20576490a5f..228fdd8bcc56 100644 --- a/libarchive/test/test_entry.c +++ b/libarchive/test/test_entry.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_entry.c 201247 2009-12-30 05:59:21Z kientzle $"); #include diff --git a/libarchive/test/test_entry_strmode.c b/libarchive/test/test_entry_strmode.c index ba183db025af..abeed4c483b2 100644 --- a/libarchive/test/test_entry_strmode.c +++ b/libarchive/test/test_entry_strmode.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_entry_strmode.c 201247 2009-12-30 05:59:21Z kientzle $"); DEFINE_TEST(test_entry_strmode) { diff --git a/libarchive/test/test_extattr_freebsd.c b/libarchive/test/test_extattr_freebsd.c index 7cb30b56067a..9d9a26e9d9f9 100644 --- a/libarchive/test/test_extattr_freebsd.c +++ b/libarchive/test/test_extattr_freebsd.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_extattr_freebsd.c 201247 2009-12-30 05:59:21Z kientzle $"); #if defined(__FreeBSD__) && __FreeBSD__ > 4 #include diff --git a/libarchive/test/test_filter_count.c b/libarchive/test/test_filter_count.c index 4885ab89a52e..8b28795ee0d5 100644 --- a/libarchive/test/test_filter_count.c +++ b/libarchive/test/test_filter_count.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_file_nonexistent.c 189473 2009-03-07 02:09:21Z kientzle $"); static void read_test(const char *name); static void write_test(void); diff --git a/libarchive/test/test_fuzz.c b/libarchive/test/test_fuzz.c index 8af4c2f296f8..dcb4f73ca372 100644 --- a/libarchive/test/test_fuzz.c +++ b/libarchive/test/test_fuzz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_fuzz.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * This was inspired by an ISO fuzz tester written by Michal Zalewski diff --git a/libarchive/test/test_fuzz_1.iso.Z.uu b/libarchive/test/test_fuzz_1.iso.Z.uu index 07a3e934da43..0eb3f7deb4ce 100644 --- a/libarchive/test/test_fuzz_1.iso.Z.uu +++ b/libarchive/test/test_fuzz_1.iso.Z.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_fuzz_1.iso.Z.uu 201247 2009-12-30 05:59:21Z kientzle $ - begin 644 test_fuzz_1.iso.Z M'YV0``(*'$BPH,&#"!,J7,BPH<.'$"-*G$BQHL6+&#-JW,BQH\>/($.*'$FR MI,F3*%.J7,FRI DEFINE_TEST(test_gnutar_filename_encoding_UTF8_CP866) diff --git a/libarchive/test/test_link_resolver.c b/libarchive/test/test_link_resolver.c index 8332c4f985bd..5bea9a463b30 100644 --- a/libarchive/test/test_link_resolver.c +++ b/libarchive/test/test_link_resolver.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_link_resolver.c,v 1.2 2008/06/15 04:31:43 kientzle Exp $"); static void test_linkify_tar(void) { diff --git a/libarchive/test/test_open_failure.c b/libarchive/test/test_open_failure.c index 5316a872b6a8..a8eedadc95fe 100644 --- a/libarchive/test/test_open_failure.c +++ b/libarchive/test/test_open_failure.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #define MAGIC 123456789 struct my_data { diff --git a/libarchive/test/test_open_fd.c b/libarchive/test/test_open_fd.c index 7da8b5ebcb56..bd73fb36197f 100644 --- a/libarchive/test/test_open_fd.c +++ b/libarchive/test/test_open_fd.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_open_fd.c 201247 2009-12-30 05:59:21Z kientzle $"); #if defined(_WIN32) && !defined(__CYGWIN__) #define open _open diff --git a/libarchive/test/test_open_file.c b/libarchive/test/test_open_file.c index bee4b3b4835b..f4ca82bb01a0 100644 --- a/libarchive/test/test_open_file.c +++ b/libarchive/test/test_open_file.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_open_file.c 201247 2009-12-30 05:59:21Z kientzle $"); DEFINE_TEST(test_open_file) { diff --git a/libarchive/test/test_open_filename.c b/libarchive/test/test_open_filename.c index 91afce244ae4..09a83690be0d 100644 --- a/libarchive/test/test_open_filename.c +++ b/libarchive/test/test_open_filename.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_open_filename.c 191183 2009-04-17 01:06:31Z kientzle $"); static void test_open_filename_mbs(void) diff --git a/libarchive/test/test_pax_filename_encoding.c b/libarchive/test/test_pax_filename_encoding.c index 2fb7f452d54f..737641c5abca 100644 --- a/libarchive/test/test_pax_filename_encoding.c +++ b/libarchive/test/test_pax_filename_encoding.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_pax_filename_encoding.c 201247 2009-12-30 05:59:21Z kientzle $"); #include diff --git a/libarchive/test/test_pax_filename_encoding.tar.uu b/libarchive/test/test_pax_filename_encoding.tar.uu index 47db18915698..1c221fd6be20 100644 --- a/libarchive/test/test_pax_filename_encoding.tar.uu +++ b/libarchive/test/test_pax_filename_encoding.tar.uu @@ -1,4 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_pax_filename_encoding.tar.uu 191183 2009-04-17 01:06:31Z kientzle $ begin 644 test_pax_filename_encoding.tar M4&%X2&5A9&5R+V%B8\R,;6YO6'AY>@`````````````````````````````` M```````````````````````````````````````````````````````````` diff --git a/libarchive/test/test_pax_xattr_header.c b/libarchive/test/test_pax_xattr_header.c index d0394aa09eda..8af81079ea7e 100644 --- a/libarchive/test/test_pax_xattr_header.c +++ b/libarchive/test/test_pax_xattr_header.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static struct archive_entry* create_archive_entry(void) { diff --git a/libarchive/test/test_rar_multivolume_single_file.part1.rar.uu b/libarchive/test/test_rar_multivolume_single_file.part1.rar.uu index 22b5c8dfa3e8..b2afdf152a48 100644 --- a/libarchive/test/test_rar_multivolume_single_file.part1.rar.uu +++ b/libarchive/test/test_rar_multivolume_single_file.part1.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_rar_multivolume_single_file.part1.rar M4F%R(1H'`%IN2!R=6X*"6%L;"!O9B!T:&4@=&5S=',N(`H)/"]0/@H)/$Q)/CQ0(%-4 diff --git a/libarchive/test/test_rar_multivolume_uncompressed_files.part01.rar.uu b/libarchive/test/test_rar_multivolume_uncompressed_files.part01.rar.uu index 876b7e9acbd1..b583f86f869e 100644 --- a/libarchive/test/test_rar_multivolume_uncompressed_files.part01.rar.uu +++ b/libarchive/test/test_rar_multivolume_uncompressed_files.part01.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_rar_multivolume_uncompressed_files.part01.rar M4F%R(1H'`%ING0AD%<`W`(``(].```#8Z8%7KM,-4$4 M,"T`I($``'1E0IT:&4@87)C:&EV92!W2(^/"]! diff --git a/libarchive/test/test_rar_multivolume_uncompressed_files.part10.rar.uu b/libarchive/test/test_rar_multivolume_uncompressed_files.part10.rar.uu index aef15d214a21..66c22262e189 100644 --- a/libarchive/test/test_rar_multivolume_uncompressed_files.part10.rar.uu +++ b/libarchive/test/test_rar_multivolume_uncompressed_files.part10.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_rar_multivolume_uncompressed_files.part10.rar M4F%R(1H'`!EZ #if defined(_WIN32) && !defined(__CYGWIN__) diff --git a/libarchive/test/test_read_disk_entry_from_file.c b/libarchive/test/test_read_disk_entry_from_file.c index 7a41034ac37e..386c3c48ebf4 100644 --- a/libarchive/test/test_read_disk_entry_from_file.c +++ b/libarchive/test/test_read_disk_entry_from_file.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_disk_entry_from_file.c 201247 2009-12-30 05:59:21Z kientzle $"); static const char * gname_lookup(void *d, int64_t g) diff --git a/libarchive/test/test_read_extract.c b/libarchive/test/test_read_extract.c index da0f2265a02b..32c1b6b18142 100644 --- a/libarchive/test/test_read_extract.c +++ b/libarchive/test/test_read_extract.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_extract.c 201247 2009-12-30 05:59:21Z kientzle $"); #define BUFF_SIZE 1000000 #define FILE_BUFF_SIZE 100000 diff --git a/libarchive/test/test_read_file_nonexistent.c b/libarchive/test/test_read_file_nonexistent.c index acb72a1e32cc..4a6d5d266227 100644 --- a/libarchive/test/test_read_file_nonexistent.c +++ b/libarchive/test/test_read_file_nonexistent.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_file_nonexistent.c 189473 2009-03-07 02:09:21Z kientzle $"); DEFINE_TEST(test_read_file_nonexistent) { diff --git a/libarchive/test/test_read_filter_lrzip.tar.lrz.uu b/libarchive/test/test_read_filter_lrzip.tar.lrz.uu index d9bbd6116e0a..2272c2778e82 100644 --- a/libarchive/test/test_read_filter_lrzip.tar.lrz.uu +++ b/libarchive/test/test_read_filter_lrzip.tar.lrz.uu @@ -1,4 +1,4 @@ -begin 644 test_read_filter_lrzip.tar.lrz.uu +begin 644 test_read_filter_lrzip.tar.lrz M3%):20`&`"@``````````%T````!`0```@$`*`,`````#@`#`````&4`!E`` MAP``````*(%=%O"2=0L1MCAA@GB4H1+_)V=!8=DS/0JC4Z+Q&5I0A'\SJ-#. M$U<4K-:^%:G^C3$B/80>END]NJE=5AP+]64N7$3):G02EKP>+AD`!IH`HQ(` diff --git a/libarchive/test/test_read_filter_program.c b/libarchive/test/test_read_filter_program.c index a27589a146c9..18b42121cc22 100644 --- a/libarchive/test/test_read_filter_program.c +++ b/libarchive/test/test_read_filter_program.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_compress_program.c 201247 2009-12-30 05:59:21Z kientzle $"); static unsigned char archive[] = { 31,139,8,0,222,'C','p','C',0,3,211,'c',160,'=','0','0','0','0','7','5','U', diff --git a/libarchive/test/test_read_filter_program_signature.c b/libarchive/test/test_read_filter_program_signature.c index 110addb87fe9..46909f97ab9e 100644 --- a/libarchive/test/test_read_filter_program_signature.c +++ b/libarchive/test/test_read_filter_program_signature.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static unsigned char archive[] = { 31,139,8,0,222,'C','p','C',0,3,211,'c',160,'=','0','0','0','0','7','5','U', diff --git a/libarchive/test/test_read_filter_uudecode.c b/libarchive/test/test_read_filter_uudecode.c index ac2eff59f794..1bc9385c3f6a 100644 --- a/libarchive/test/test_read_filter_uudecode.c +++ b/libarchive/test/test_read_filter_uudecode.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_uu.c 201248 2009-12-30 06:12:03Z kientzle $"); static const char archive[] = { "begin 644 test_read_uu.Z\n" diff --git a/libarchive/test/test_read_filter_uudecode_base64_raw.uu b/libarchive/test/test_read_filter_uudecode_base64_raw.uu new file mode 100644 index 000000000000..b4ddfb0a22e8 --- /dev/null +++ b/libarchive/test/test_read_filter_uudecode_base64_raw.uu @@ -0,0 +1,11 @@ +begin-base64 600 LICENSE2.txt +VEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIOKAnEFTIElT4oCdLCBXSVRIT1VUIFdBUlJBTlRZIE9G +IEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQg +VE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJ +Q1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg +QVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFN +QUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNU +LCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElP +TiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBT +T0ZUV0FSRS4K +==== diff --git a/libarchive/test/test_read_filter_uudecode_raw.c b/libarchive/test/test_read_filter_uudecode_raw.c new file mode 100644 index 000000000000..6f02dc5de147 --- /dev/null +++ b/libarchive/test/test_read_filter_uudecode_raw.c @@ -0,0 +1,67 @@ +/*- + * Copyright (c) 2023 Martin Matuska + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +DEFINE_TEST(test_read_filter_uudecode_raw) +{ + struct archive_entry *ae; + struct archive *a; + + const char *name = "test_read_filter_uudecode_raw.uu"; + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_raw(a)); + copy_reference_file(name); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 670)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("LICENSE.txt", archive_entry_pathname(ae)); + assertEqualInt((AE_IFREG | 0755), archive_entry_mode(ae)); + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + +DEFINE_TEST(test_read_filter_uudecode_base64_raw) +{ + struct archive_entry *ae; + struct archive *a; + + const char *name = "test_read_filter_uudecode_base64_raw.uu"; + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_raw(a)); + copy_reference_file(name); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 670)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("LICENSE2.txt", archive_entry_pathname(ae)); + assertEqualInt((AE_IFREG | 0600), archive_entry_mode(ae)); + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} diff --git a/libarchive/test/test_read_filter_uudecode_raw.uu b/libarchive/test/test_read_filter_uudecode_raw.uu new file mode 100644 index 000000000000..8a5f8b5a607d --- /dev/null +++ b/libarchive/test/test_read_filter_uudecode_raw.uu @@ -0,0 +1,14 @@ +begin 755 LICENSE.txt +M5$A%(%-/1E1705)%($E3(%!23U9)1$5$(.*`G$%3($E3XH"=+"!7251(3U54 +M(%=!4E)!3E19($]&($%.62!+24Y$+"!%6%!215-3($]2($E-4$Q)140L($E. +M0TQ51$E.1R!"550@3D]4($Q)34E4140@5$\@5$A%(%=!4E)!3E1)15,@3T8@ +M34520TA!3E1!0DE,2519+"!&251.15-3($9/4B!!(%!!4E1)0U5,05(@4%52 +M4$]312!!3D0@3D].24Y&4DE.1T5-14Y4+B!)3B!.3R!%5D5.5"!32$%,3"!4 +M2$4@05542$]24R!/4B!#3U!94DE'2%0@2$],1$524R!"12!,24%"3$4@1D]2 +M($%.62!#3$%)32P@1$%-04=%4R!/4B!/5$A%4B!,24%"24Q)5%DL(%=(151( +M15(@24X@04X@04-424].($]&($-/3E1204-4+"!43U)4($]2($]42$525TE3 +M12P@05))4TE.1R!&4D]-+"!/550@3T8@3U(@24X@0T].3D5#5$E/3B!7251( +M(%1(12!33T945T%212!/4B!42$4@55-%($]2($]42$52($1%04Q)3D=3($E. +/(%1(12!33T945T%212X* +` +end diff --git a/libarchive/test/test_read_format_7zip.c b/libarchive/test/test_read_format_7zip.c index 1eca3936e5b4..9f76705deaf2 100644 --- a/libarchive/test/test_read_format_7zip.c +++ b/libarchive/test/test_read_format_7zip.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); #if defined(_WIN32) && !defined(__CYGWIN__) #define close _close @@ -61,7 +60,7 @@ test_copy(int use_open_fd) /* Verify regular file1. */ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); - assertEqualInt((AE_IFREG | 0666), archive_entry_mode(ae)); + assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); assertEqualString("file1", archive_entry_pathname(ae)); assertEqualInt(86401, archive_entry_mtime(ae)); assertEqualInt(60, archive_entry_size(ae)); @@ -765,7 +764,7 @@ test_ppmd(void) /* Verify regular file1. */ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); - assertEqualInt((AE_IFREG | 0666), archive_entry_mode(ae)); + assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); assertEqualString("ppmd_test.txt", archive_entry_pathname(ae)); assertEqualInt(1322464589, archive_entry_mtime(ae)); assertEqualInt(102400, archive_entry_size(ae)); @@ -1180,5 +1179,81 @@ DEFINE_TEST(test_read_format_7zip_deflate_arm64) test_arm64_filter("test_read_format_7zip_deflate_arm64.7z"); } + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + +DEFINE_TEST(test_read_format_7zip_win_attrib) +{ + struct archive *a; + + assert((a = archive_read_new()) != NULL); + + if (ARCHIVE_OK != archive_read_support_filter_lzma(a)) { + skipping( + "7zip:lzma decoding is not supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + return; + } + + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + + // This archive has four files and four directories: + // * hidden directory + // * readonly directory + // * regular directory + // * system directory + // * regular "archive" file + // * hidden file + // * readonly file + // * system file + const char *refname = "test_read_format_7zip_win_attrib.7z"; + extract_reference_file(refname); + + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, refname, 10240)); + + struct archive_entry *ae; + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("hidden_dir/", archive_entry_pathname(ae)); + assertEqualInt((AE_IFDIR | 0755), archive_entry_mode(ae)); + assertEqualString("hidden", archive_entry_fflags_text(ae)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("readonly_dir/", archive_entry_pathname(ae)); + assertEqualInt((AE_IFDIR | 0555), archive_entry_mode(ae)); + assertEqualString("rdonly", archive_entry_fflags_text(ae)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("regular_dir/", archive_entry_pathname(ae)); + assertEqualInt((AE_IFDIR | 0755), archive_entry_mode(ae)); + assertEqualString(NULL, archive_entry_fflags_text(ae)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("system_dir/", archive_entry_pathname(ae)); + assertEqualInt((AE_IFDIR | 0755), archive_entry_mode(ae)); + assertEqualString("system", archive_entry_fflags_text(ae)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("archive_file.txt", archive_entry_pathname(ae)); + assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); + assertEqualString(NULL, archive_entry_fflags_text(ae)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("hidden_file.txt", archive_entry_pathname(ae)); + assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); + assertEqualString("hidden", archive_entry_fflags_text(ae)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("readonly_file.txt", archive_entry_pathname(ae)); + assertEqualInt((AE_IFREG | 0444), archive_entry_mode(ae)); + assertEqualString("rdonly", archive_entry_fflags_text(ae)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("system_file.txt", archive_entry_pathname(ae)); + assertEqualInt((AE_IFREG | 0644), archive_entry_mode(ae)); + assertEqualString("system", archive_entry_fflags_text(ae)); + + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); } diff --git a/libarchive/test/test_read_format_7zip_copy.7z.uu b/libarchive/test/test_read_format_7zip_copy.7z.uu index 2429834c26dc..92e7c5867ab2 100644 --- a/libarchive/test/test_read_format_7zip_copy.7z.uu +++ b/libarchive/test/test_read_format_7zip_copy.7z.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_7zip_none.7z +begin 644 test_read_format_7zip_copy.7z M-WJ\KR<<``-!QGV(/`````````!"`````````(/;BV,@("`@("`@("`@("`@ M("`@("`@("`@("`@(&9I;&4@,2!C;VYT96YT2.2T-J0XF&*!R-C_.Z=<^_B^),$C`%""HM.8#>=`$!`!IA7-T96T```"!,P>N#\_\\&P/Z^J%U\S6&7C"[<$<2GL2\B,** +MW`0[F2;R)EO2:N)4RB6G.3+R6%97BQ]K"X),-'`E&./R#`2A\R&D1#U8FUC& +MANR65$7S:?$CR7DS8<)L'MR%.5Y)T-;62DU\S8W?$4=U2972R-0]5J81R3E/ +M\K&`%O\H:/`E4``7!A\!"8#:``<+`0`!(P,!`05=`!````R!C@H!`M-R5@`` +` +end diff --git a/libarchive/test/test_read_format_ar.ar.uu b/libarchive/test/test_read_format_ar.ar.uu index ae61e59fc7af..1e644cc8ab07 100644 --- a/libarchive/test/test_read_format_ar.ar.uu +++ b/libarchive/test/test_read_format_ar.ar.uu @@ -1,5 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_ar.ar.uu 201247 2009-12-30 05:59:21Z kientzle $ - begin 755 test_read_format_ar.ar M(3QA7ET='1S diff --git a/libarchive/test/test_read_format_cab_filename_cp932.cab.uu b/libarchive/test/test_read_format_cab_filename_cp932.cab.uu index 0d51f10c418a..9d59000c73ed 100644 --- a/libarchive/test/test_read_format_cab_filename_cp932.cab.uu +++ b/libarchive/test/test_read_format_cab_filename_cp932.cab.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_cab_cp932.cab +begin 644 test_read_format_cab_filename_cp932.cab M35-#1@````"4`````````"P``````````P$!``(````(_@``;@````$``Q(% M````````````=#ZO5"``E5R"OH+F7(J_CIHN='AT``4````%``````!T/KM4 M(`"57(*^@N9 @@ -137,6 +136,11 @@ DEFINE_TEST(test_read_format_cpio_filename_UTF8_eucJP) DEFINE_TEST(test_read_format_cpio_filename_UTF8_UTF8_jp) { +#if defined(_WIN32) && !defined(__CYGWIN__) + /* Since we explicitly DON'T set hdrcharset=UTF-8 below */ + skipping("Windows defaults to OEMCP, not UTF-8"); + return; +#else const char *refname = "test_read_format_cpio_filename_utf8_jp.cpio"; struct archive *a; struct archive_entry *ae; @@ -180,6 +184,7 @@ DEFINE_TEST(test_read_format_cpio_filename_UTF8_UTF8_jp) /* Close the archive. */ assertEqualInt(ARCHIVE_OK, archive_read_close(a)); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +#endif } DEFINE_TEST(test_read_format_cpio_filename_CP866_KOI8R) @@ -500,6 +505,11 @@ DEFINE_TEST(test_read_format_cpio_filename_UTF8_CP866) DEFINE_TEST(test_read_format_cpio_filename_UTF8_UTF8_ru) { +#if defined(_WIN32) && !defined(__CYGWIN__) + /* Since we explicitly DON'T set hdrcharset=UTF-8 below */ + skipping("Windows defaults to OEMCP, not UTF-8"); + return; +#else const char *refname = "test_read_format_cpio_filename_utf8_ru.cpio"; struct archive *a; struct archive_entry *ae; @@ -542,6 +552,7 @@ DEFINE_TEST(test_read_format_cpio_filename_UTF8_UTF8_ru) /* Close the archive. */ assertEqualInt(ARCHIVE_OK, archive_read_close(a)); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +#endif } DEFINE_TEST(test_read_format_cpio_filename_eucJP_CP932) diff --git a/libarchive/test/test_read_format_cpio_filename_cp866.cpio.uu b/libarchive/test/test_read_format_cpio_filename_cp866.cpio.uu index 5f0658504039..b1ac82f545b3 100644 --- a/libarchive/test/test_read_format_cpio_filename_cp866.cpio.uu +++ b/libarchive/test/test_read_format_cpio_filename_cp866.cpio.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_cpio_cp866.cpio +begin 644 test_read_format_cpio_filename_cp866.cpio M,# diff --git a/libarchive/test/test_read_format_gtar_filename_cp866.tar.Z.uu b/libarchive/test/test_read_format_gtar_filename_cp866.tar.Z.uu index a6fd80c24695..b06fb11d5528 100644 --- a/libarchive/test/test_read_format_gtar_filename_cp866.tar.Z.uu +++ b/libarchive/test/test_read_format_gtar_filename_cp866.tar.Z.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_gtar_cp866.tar.Z +begin 644 test_read_format_gtar_filename_cp866.tar.Z M'YV0CR`A$E1($H"#"!,J7,BPH<.'$"-*1`BC(HP;-6H`L!@#8XR-%3O6^&BQ MI$4;`&+$J$'CQ@P9*V&0C`'#Q@T9`$#`F,BSI\^?0`'4F4,GC!P0(`",J5,F MJ,.E39U*G4JUJM6K6'G"DY?N7CEZ6<.*'4NVK-FS:-.J7"#AXZ`!(J7,BPH<.'$"-*G$@1`(R+,&S0H&'Q8HP;-6)TA/$Q MY$B,&&/``!`C1HV0-63(B+F29`P:)D&LK,BSI\^?0.O,H1-&#@@0`,;4*0,T MHE*F3:-*G4JUJM6K4Q7]@A*&RAHP;`$#`F,BSI\^?0`'4F4,GC!P0(`",J5,F MJ,.E39U*G4JUJM6K6'G"DY?N7CEZ6<.*'4NVK-FS:-.J7/($.*'$FR MI,F3*%.J7,FRI/($.*'$FR MI,F3*%.J7,FRI/($.*'$FR MI,F3*%.J7,FRI/($.*'$FR MI,F3*%.J7,FRI/($.*'$FR MI,F3*%.J7,FRI/($.*'$FR MI,F3*%.J7,FRI/($.*'$FR MI,F3*%.J7,FRI/($.*'$FR MI,F3*%.J7,FRI/($.*'$FR MI,F3*%.J7,FRI/($.*'$FR MI,F3*%.J7,FRI diff --git a/libarchive/test/test_read_format_isorr_bz2.c b/libarchive/test/test_read_format_isorr_bz2.c index fb4f4a853ab5..c1accea78792 100644 --- a/libarchive/test/test_read_format_isorr_bz2.c +++ b/libarchive/test/test_read_format_isorr_bz2.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_isorr_bz2.c 201247 2009-12-30 05:59:21Z kientzle $"); /* PLEASE use old cdrtools; mkisofs version is 2.01. diff --git a/libarchive/test/test_read_format_isorr_ce.c b/libarchive/test/test_read_format_isorr_ce.c index 1e57acb7668b..6b983e8ff4ab 100644 --- a/libarchive/test/test_read_format_isorr_ce.c +++ b/libarchive/test/test_read_format_isorr_ce.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_isorr_ce.c 201247 2009-12-30 05:59:21Z kientzle $"); /* Execute the following command to rebuild the data for this program: diff --git a/libarchive/test/test_read_format_isorr_new_bz2.c b/libarchive/test/test_read_format_isorr_new_bz2.c index 4c1b5692e9ef..787c1e6301be 100644 --- a/libarchive/test/test_read_format_isorr_new_bz2.c +++ b/libarchive/test/test_read_format_isorr_new_bz2.c @@ -23,8 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_isorr_new_bz2.c 201247 2009-12-30 05:59:21Z kientzle $"); - /* PLEASE use latest cdrtools at least mkisofs version is 2.01.01a63 or later. diff --git a/libarchive/test/test_read_format_isorr_rr_moved.c b/libarchive/test/test_read_format_isorr_rr_moved.c index 693caef621f2..a27230033672 100644 --- a/libarchive/test/test_read_format_isorr_rr_moved.c +++ b/libarchive/test/test_read_format_isorr_rr_moved.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_isorr_rr_moved.c 201247 2009-12-30 05:59:21Z kientzle $"); /* Execute the following command to rebuild the data for this program: diff --git a/libarchive/test/test_read_format_isozisofs_bz2.c b/libarchive/test/test_read_format_isozisofs_bz2.c index adf9624274e0..3f059fde08b5 100644 --- a/libarchive/test/test_read_format_isozisofs_bz2.c +++ b/libarchive/test/test_read_format_isozisofs_bz2.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_isozisofs_bz2.c 201247 2009-12-30 05:59:21Z kientzle $"); /* Execute the following command to rebuild the data for this program: diff --git a/libarchive/test/test_read_format_lha.c b/libarchive/test/test_read_format_lha.c index 6a53976c2a75..93e79183e5c3 100644 --- a/libarchive/test/test_read_format_lha.c +++ b/libarchive/test/test_read_format_lha.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); /* Execute the following command to rebuild the data for this program: diff --git a/libarchive/test/test_read_format_lha_bugfix_0.c b/libarchive/test/test_read_format_lha_bugfix_0.c index 2b4160b3220e..bbdcb81569b6 100644 --- a/libarchive/test/test_read_format_lha_bugfix_0.c +++ b/libarchive/test/test_read_format_lha_bugfix_0.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); DEFINE_TEST(test_read_format_lha_bugfix_0) { diff --git a/libarchive/test/test_read_format_lha_filename.c b/libarchive/test/test_read_format_lha_filename.c index 126a8704ce4a..d726f6245d7d 100644 --- a/libarchive/test/test_read_format_lha_filename.c +++ b/libarchive/test/test_read_format_lha_filename.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); #include diff --git a/libarchive/test/test_read_format_lha_filename_cp932.lzh.uu b/libarchive/test/test_read_format_lha_filename_cp932.lzh.uu index 15170146083e..a579fb1aaa61 100644 --- a/libarchive/test/test_read_format_lha_filename_cp932.lzh.uu +++ b/libarchive/test/test_read_format_lha_filename_cp932.lzh.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_lha_cp932.lzh +begin 644 test_read_format_lha_filename_cp932.lzh M30`M;&@P+0@````(````*:2#32`"&4A-!P!&I`,```L``8J_CIHN='AT&P!! M-'"`))KERP%TJNDQFN7+`72JZ3&:Y'0;`$&:91,VFN7+ diff --git a/libarchive/test/test_read_format_lha_filename_utf16.c b/libarchive/test/test_read_format_lha_filename_utf16.c index 7ab13e43bdd3..d0710799bba4 100644 --- a/libarchive/test/test_read_format_lha_filename_utf16.c +++ b/libarchive/test/test_read_format_lha_filename_utf16.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); #include diff --git a/libarchive/test/test_read_format_lha_filename_utf16.lzh.uu b/libarchive/test/test_read_format_lha_filename_utf16.lzh.uu index ca5da7a64e59..0eeea817b462 100644 --- a/libarchive/test/test_read_format_lha_filename_utf16.lzh.uu +++ b/libarchive/test/test_read_format_lha_filename_utf16.lzh.uu @@ -1,19 +1,19 @@ -begin 644 test_read_format_lha_filename_utf16.lzh -M@0`M;&@P+0P````,````L/5872`"IW%-!P!&I`,```T``5]?7U]?7RYT>'0* -M``)?7U]?7U__%P!$Y`#V`/P`Q`#6`-P`+@!T`'@`=``1`$7<`-8`Q`#\`/8` -MY`#__QL`078S9B"U0$H^DQ_F(+5 -M`2CZ3'^8@M4!!@``GW<'``!J`"UL:#`M&0```!D```!V)L1=(`*CNTT'`$:D -M`P``#0`!@V6#6(-G+G1X=`H``E]?7U]?7_\1`$7<`-8`Q`#\`/8`Y`#__QL` -M00IF#4J@E-4!L"5C?'65U0&P)6-\=975`08``$%^!P``5&5S="!I;B!*87!A -M;F5S92!+871A:V%N87L`+6QH,"T,````#````+#U6%T@`J=Q30<`1J0#```- -M``%?7U]?7U\N='AT"@`"@V6#6(-G_Q<`1.0`]@#\`,0`U@#<`"X`=`!X`'0` -M"P!%QC"Y,,@P__\;`$'D5O!-H)35`?4-F(*15=4!Y%;P3:"4U0$&``"A+0<` -M`,.DP[;#O,.$PY;#G%0`+6QH9"T``````````-3`PET@`@``30<`1J0#```# -M``$*``*#98-8@V?_!0!`$``;`$%%!\Y.H)35`3/_]%&@E-4!,__T4:"4U0$& -M``!>;@<``&8`+6QH,"T,````#````+#U6%T@`J=Q30<`1J0#```-``%?7U]? -M7U\N='AT%P!$Y`#V`/P`Q`#6`-P`+@!T`'@`=``;`$'D5O!-H)35`?4-F(*1 -@5=4!Y%;P3:"4U0$&``"M>`<``,.DP[;#O,.$PY;#G`#D -` -end +begin 644 test_read_format_lha_filename_utf16.lzh +M@0`M;&@P+0P````,````L/5872`"IW%-!P!&I`,```T``5]?7U]?7RYT>'0* +M``)?7U]?7U__%P!$Y`#V`/P`Q`#6`-P`+@!T`'@`=``1`$7<`-8`Q`#\`/8` +MY`#__QL`078S9B"U0$H^DQ_F(+5 +M`2CZ3'^8@M4!!@``GW<'``!J`"UL:#`M&0```!D```!V)L1=(`*CNTT'`$:D +M`P``#0`!@V6#6(-G+G1X=`H``E]?7U]?7_\1`$7<`-8`Q`#\`/8`Y`#__QL` +M00IF#4J@E-4!L"5C?'65U0&P)6-\=975`08``$%^!P``5&5S="!I;B!*87!A +M;F5S92!+871A:V%N87L`+6QH,"T,````#````+#U6%T@`J=Q30<`1J0#```- +M``%?7U]?7U\N='AT"@`"@V6#6(-G_Q<`1.0`]@#\`,0`U@#<`"X`=`!X`'0` +M"P!%QC"Y,,@P__\;`$'D5O!-H)35`?4-F(*15=4!Y%;P3:"4U0$&``"A+0<` +M`,.DP[;#O,.$PY;#G%0`+6QH9"T``````````-3`PET@`@``30<`1J0#```# +M``$*``*#98-8@V?_!0!`$``;`$%%!\Y.H)35`3/_]%&@E-4!,__T4:"4U0$& +M``!>;@<``&8`+6QH,"T,````#````+#U6%T@`J=Q30<`1J0#```-``%?7U]? +M7U\N='AT%P!$Y`#V`/P`Q`#6`-P`+@!T`'@`=``;`$'D5O!-H)35`?4-F(*1 +@5=4!Y%;P3:"4U0$&``"M>`<``,.DP[;#O,.$PY;#G`#D +` +end diff --git a/libarchive/test/test_read_format_mtree.c b/libarchive/test/test_read_format_mtree.c index 40c65868d88a..70730839386d 100644 --- a/libarchive/test/test_read_format_mtree.c +++ b/libarchive/test/test_read_format_mtree.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_mtree.c 201247 2009-12-30 05:59:21Z kientzle $"); static void test_read_format_mtree1(void) diff --git a/libarchive/test/test_read_format_pax_bz2.c b/libarchive/test/test_read_format_pax_bz2.c index 8c5d28ec05d6..4f11137b9c6f 100644 --- a/libarchive/test/test_read_format_pax_bz2.c +++ b/libarchive/test/test_read_format_pax_bz2.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_pax_bz2.c 201247 2009-12-30 05:59:21Z kientzle $"); static unsigned char archive[] = { 'B','Z','h','9','1','A','Y','&','S','Y',152,180,30,185,0,0,140,127,176,212, diff --git a/libarchive/test/test_read_format_rar.c b/libarchive/test/test_read_format_rar.c index 1425eb9a4570..dce567af48a9 100644 --- a/libarchive/test/test_read_format_rar.c +++ b/libarchive/test/test_read_format_rar.c @@ -214,6 +214,14 @@ DEFINE_TEST(test_read_format_rar_unicode_UTF8) assert((a = archive_read_new()) != NULL); assertA(0 == archive_read_support_filter_all(a)); assertA(0 == archive_read_support_format_all(a)); +#if defined(_WIN32) && !defined(__CYGWIN__) + /* Windows will use OEMCP as default, but the file is UTF-8. */ + if (ARCHIVE_OK != archive_read_set_options(a, "rar:hdrcharset=UTF-8")) { + skipping("This system cannot read input as UTF-8."); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + return; + } +#endif assertA(0 == archive_read_open_filename(a, reffile, 10240)); /* First header. */ @@ -879,16 +887,9 @@ DEFINE_TEST(test_read_format_rar_windows) assertEqualInt(ARCHIVE_OK, archive_read_free(a)); } -DEFINE_TEST(test_read_format_rar_multivolume) +static void +test_read_format_rar_multivolume_test_body_helper(struct archive *a) { - const char *reffiles[] = - { - "test_read_format_rar_multivolume.part0001.rar", - "test_read_format_rar_multivolume.part0002.rar", - "test_read_format_rar_multivolume.part0003.rar", - "test_read_format_rar_multivolume.part0004.rar", - NULL - }; int file1_size = 241647978, offset = 0; char buff[64]; const char file1_test_txt[] = "gin-bottom: 0in\">
    \n

    \n\n" @@ -903,13 +904,6 @@ DEFINE_TEST(test_read_format_rar_multivolume) int file3_size = sizeof(file3_buff); const char file3_test_txt[] = "test text document\r\n"; struct archive_entry *ae; - struct archive *a; - - extract_reference_files(reffiles); - assert((a = archive_read_new()) != NULL); - assertA(0 == archive_read_support_filter_all(a)); - assertA(0 == archive_read_support_format_all(a)); - assertA(0 == archive_read_open_filenames(a, reffiles, 10240)); /* First header. */ assertA(0 == archive_read_next_header(a, &ae)); @@ -1016,6 +1010,65 @@ DEFINE_TEST(test_read_format_rar_multivolume) assertEqualInt(ARCHIVE_OK, archive_read_free(a)); } +DEFINE_TEST(test_read_format_rar_multivolume) +{ + const char *reffiles[] = + { + "test_read_format_rar_multivolume.part0001.rar", + "test_read_format_rar_multivolume.part0002.rar", + "test_read_format_rar_multivolume.part0003.rar", + "test_read_format_rar_multivolume.part0004.rar", + NULL + }; + + struct archive *a; + + extract_reference_files(reffiles); + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_filter_all(a)); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_open_filenames(a, reffiles, 10240)); + + test_read_format_rar_multivolume_test_body_helper(a); +} + +/* As above, but using read_open_filenames_w */ +DEFINE_TEST(test_read_format_rar_multivolume_w) +{ +#if defined(_WIN32) && !defined(__CYGWIN__) + const char *reffiles[] = + { + "test_read_format_rar_multivolume.part0001.rar", + "test_read_format_rar_multivolume.part0002.rar", + "test_read_format_rar_multivolume.part0003.rar", + "test_read_format_rar_multivolume.part0004.rar", + NULL + }; + + const wchar_t *wreffiles[] = + { + L"test_read_format_rar_multivolume.part0001.rar", + L"test_read_format_rar_multivolume.part0002.rar", + L"test_read_format_rar_multivolume.part0003.rar", + L"test_read_format_rar_multivolume.part0004.rar", + NULL + }; + + struct archive *a; + + extract_reference_files(reffiles); + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_filter_all(a)); + assertA(0 == archive_read_support_format_all(a)); + assertA(0 == archive_read_open_filenames_w(a, wreffiles, 10240)); + + test_read_format_rar_multivolume_test_body_helper(a); +#else + skipping("archive_read_open_filenames_w is not available on this platform"); + return; +#endif +} + DEFINE_TEST(test_read_format_rar_multivolume_skip) { const char *reffiles[] = diff --git a/libarchive/test/test_read_format_rar.rar.uu b/libarchive/test/test_read_format_rar.rar.uu index 75f93b4c281a..f197a2983302 100644 --- a/libarchive/test/test_read_format_rar.rar.uu +++ b/libarchive/test/test_read_format_rar.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar.rar M4F%R(1H'`,^0\"T@`"_[6U,1"U MM;6UM[BU45)A[Y2I7`A,+@O8`!.#I".V#`FI) M!96`%0$W:&]M92]A;G1E:R]T96UP+V)U:6QD+W5NKN2Y+ diff --git a/libarchive/test/test_read_format_rar5_multiarchive.part02.rar.uu b/libarchive/test/test_read_format_rar5_multiarchive.part02.rar.uu index fce29824622d..d766ccee9d87 100644 --- a/libarchive/test/test_read_format_rar5_multiarchive.part02.rar.uu +++ b/libarchive/test/test_read_format_rar5_multiarchive.part02.rar.uu @@ -1,4 +1,4 @@ -begin 644 rar5_multiarchive.part02.rar +begin 644 test_read_format_rar5_multiarchive.part02.rar M4F%R(1H'`0"ZHBK1#0$%"`,!!P$![_:`@`!@&RUZ5P(;"X'V``3@Z0CM@P)= M-\$R@!4!-VAO;64O86YT96LO=&5M<"]B=6EL9"]U;G)AG(I3D diff --git a/libarchive/test/test_read_format_rar5_multiarchive.part05.rar.uu b/libarchive/test/test_read_format_rar5_multiarchive.part05.rar.uu index 4dc97d65ea1e..a9f1981e4845 100644 --- a/libarchive/test/test_read_format_rar5_multiarchive.part05.rar.uu +++ b/libarchive/test/test_read_format_rar5_multiarchive.part05.rar.uu @@ -1,4 +1,4 @@ -begin 644 rar5_multiarchive.part05.rar +begin 644 test_read_format_rar5_multiarchive.part05.rar M4F%R(1H'`0#UY[V;#0$%"`,$!P$![_:`@`"(]4(L5P(;"X'V``3HJ!;M@P+] MF?Z`@!4!-VAO;64O86YT96LO=&5M<"]B=6EL9"]U;G)A@98+@$> diff --git a/libarchive/test/test_read_format_rar5_multiarchive.part06.rar.uu b/libarchive/test/test_read_format_rar5_multiarchive.part06.rar.uu index 1e2ad0cf9833..1ba155dbf4c8 100644 --- a/libarchive/test/test_read_format_rar5_multiarchive.part06.rar.uu +++ b/libarchive/test/test_read_format_rar5_multiarchive.part06.rar.uu @@ -1,4 +1,4 @@ -begin 644 rar5_multiarchive.part06.rar +begin 644 test_read_format_rar5_multiarchive.part06.rar M4F%R(1H'`0"V\\:,#0$%"`,%!P$![_:`@``2\>%K5P(;"X'V``3HJ!;M@P(] M(D2J@!4!-VAO;64O86YT96LO=&5M<"]B=6EL9"]U;G)AR diff --git a/libarchive/test/test_read_format_rar5_multiarchive.part07.rar.uu b/libarchive/test/test_read_format_rar5_multiarchive.part07.rar.uu index de1044e30589..23ba290ad4ed 100644 --- a/libarchive/test/test_read_format_rar5_multiarchive.part07.rar.uu +++ b/libarchive/test/test_read_format_rar5_multiarchive.part07.rar.uu @@ -1,4 +1,4 @@ -begin 644 rar5_multiarchive.part07.rar +begin 644 test_read_format_rar5_multiarchive.part07.rar M4F%R(1H'`0!SSTNU#0$%"`,&!P$![_:`@`#=K"Q/5P(;"X'V``3HJ!;M@P*V M0J=E@!4!-VAO;64O86YT96LO=&5M<"]B=6EL9"]U;G)APB<"`POD`@2`(*2#`L:R$WZ` M!0$)=&5S=#$N8FEN"@,39U^L6QI:GA#*\6`!$&149R]7!6]2222222222222 M2222222222222222222222222222222222222222222222223]_>QS,[=]KH diff --git a/libarchive/test/test_read_format_rar5_multiple_files_solid.rar.uu b/libarchive/test/test_read_format_rar5_multiple_files_solid.rar.uu index 4a8acb08c45a..8ba78774dc48 100644 --- a/libarchive/test/test_read_format_rar5_multiple_files_solid.rar.uu +++ b/libarchive/test/test_read_format_rar5_multiple_files_solid.rar.uu @@ -1,4 +1,4 @@ -begin 644 rar5_multiple_files_solid.rar +begin 644 test_read_format_rar5_multiple_files_solid.rar M4F%R(1H'`0`)[\AO"P$%!P0&`0&`@(``&8R4_R<"`POY`@2`(*2#`L:R$WZ` M'0$)=&5S=#$N8FEN"@,39U^L6QI:GA#)YW4!&&5492;T@%?U\^?/DDDDDDDD MDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDO\\YG#6M diff --git a/libarchive/test/test_read_format_rar5_sfx.exe.uu b/libarchive/test/test_read_format_rar5_sfx.exe.uu index fdf83af1a238..7df65a110384 100644 --- a/libarchive/test/test_read_format_rar5_sfx.exe.uu +++ b/libarchive/test/test_read_format_rar5_sfx.exe.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar5_sfx.exe M35J0``,````$````__\``+@`````````0``````````````````````````` M````````````````````$`$```X?N@X`M`G-(;@!3,TA5&AI%;RZ]D!2&5L;&\L('=O*3F.*3G>*3FBYT>'0*`P)& +MB7A6\NO9`1`%!``,\)^1B_"?C(XN='ATD-'.1V$"`QP`!`"@"`````"````U +M\)V2KO"=DX[PG9."\)V2M_"=D9SPG9.!\)V2OO"=DK@@\)V0O_"=DK[PG9.# +L\)V3@"YT>'0*`P(>7'J>!.S9`1`%`@`,\)^1B_"?C(XN='AT'7=640,%!``` +` +end diff --git a/libarchive/test/test_read_format_rar_binary_data.rar.uu b/libarchive/test/test_read_format_rar_binary_data.rar.uu index 4d1cbd36d633..712dd0e67879 100644 --- a/libarchive/test/test_read_format_rar_binary_data.rar.uu +++ b/libarchive/test/test_read_format_rar_binary_data.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar_binary_data.rar M4F%R(1H'`,^0FQ_"3YH!RD,Z._X"C diff --git a/libarchive/test/test_read_format_rar_compress_best.rar.uu b/libarchive/test/test_read_format_rar_compress_best.rar.uu index 22fde0f8b673..d31adcc92b00 100644 --- a/libarchive/test/test_read_format_rar_compress_best.rar.uu +++ b/libarchive/test/test_read_format_rar_compress_best.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar_compress_best.rar M4F%R(1H'`,^0MJ;G<[Z6"DBFSK*16$E diff --git a/libarchive/test/test_read_format_rar_encryption_data.c b/libarchive/test/test_read_format_rar_encryption_data.c index d0c06fb21499..540546a8dd8a 100644 --- a/libarchive/test/test_read_format_rar_encryption_data.c +++ b/libarchive/test/test_read_format_rar_encryption_data.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_rar_encryption_data) { diff --git a/libarchive/test/test_read_format_rar_encryption_header.c b/libarchive/test/test_read_format_rar_encryption_header.c index 81965eb6787f..e54db5152383 100644 --- a/libarchive/test/test_read_format_rar_encryption_header.c +++ b/libarchive/test/test_read_format_rar_encryption_header.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_rar_encryption_header) { diff --git a/libarchive/test/test_read_format_rar_encryption_partially.c b/libarchive/test/test_read_format_rar_encryption_partially.c index 81256a96a019..e68e78831b37 100644 --- a/libarchive/test/test_read_format_rar_encryption_partially.c +++ b/libarchive/test/test_read_format_rar_encryption_partially.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_rar_encryption_partially) { diff --git a/libarchive/test/test_read_format_rar_filter.c b/libarchive/test/test_read_format_rar_filter.c index 46c574743646..43619253e4ac 100644 --- a/libarchive/test/test_read_format_rar_filter.c +++ b/libarchive/test/test_read_format_rar_filter.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_rar_filter) { diff --git a/libarchive/test/test_read_format_rar_invalid1.c b/libarchive/test/test_read_format_rar_invalid1.c index 61dea1648f48..cac58688ce21 100644 --- a/libarchive/test/test_read_format_rar_invalid1.c +++ b/libarchive/test/test_read_format_rar_invalid1.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_rar_invalid1) { diff --git a/libarchive/test/test_read_format_rar_multi_lzss_blocks.rar.uu b/libarchive/test/test_read_format_rar_multi_lzss_blocks.rar.uu index dd6ab50f97cd..e717b00fd8ec 100644 --- a/libarchive/test/test_read_format_rar_multi_lzss_blocks.rar.uu +++ b/libarchive/test/test_read_format_rar_multi_lzss_blocks.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar_multi_lzss_blocks.rar M4F%R(1H'`,^0^E"B3)2K$2:-U diff --git a/libarchive/test/test_read_format_rar_multivolume.part0001.rar.uu b/libarchive/test/test_read_format_rar_multivolume.part0001.rar.uu index 7378a9b558e8..bbe4be4c9070 100644 --- a/libarchive/test/test_read_format_rar_multivolume.part0001.rar.uu +++ b/libarchive/test/test_read_format_rar_multivolume.part0001.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar_multivolume.part0001.rar M4F%R(1H'`%IND``&I!9PX#@*>#,/AM$C\= M-1T`I($``'!P;61?;'IS[/K1`L^BJ7QHH!,TI;W];?!D``&I!9PX#%Y:4IOAM$C\= M-1T`I($``'!P;61?;'IS5J2C]?9NI\:;KW2+#TR@_Y5=4S)O&)O_B>J0/A0T-,@"ER';1YX:$ diff --git a/libarchive/test/test_read_format_rar_noeof.rar.uu b/libarchive/test/test_read_format_rar_noeof.rar.uu index 7cf88e7c6248..fd2d0d3a12bb 100644 --- a/libarchive/test/test_read_format_rar_noeof.rar.uu +++ b/libarchive/test/test_read_format_rar_noeof.rar.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_read_format_rar_noeof.rar M4F%R(1H'`,^0H5JAD)Q_9XLAN3)VO("$ M4G0@D#(`%````!0````#0J+(OK=VVCX4,`@`I($``'1E'3POU/A"W5A$C_#FG]U81(_PYI_=&5S M="!T97AT(&9I;&4-"D."=""0.P`0````$`````+Q$M:7;&$2/Q0P"``@```` diff --git a/libarchive/test/test_read_format_raw.bufr.uu b/libarchive/test/test_read_format_raw.bufr.uu index 2f4cef74619f..896e09c8fd6b 100644 --- a/libarchive/test/test_read_format_raw.bufr.uu +++ b/libarchive/test/test_read_format_raw.bufr.uu @@ -1,4 +1,4 @@ -begin 660 test_read_format_raw.bufr.uu +begin 660 test_read_format_raw.bufr M,#`P-S0T.3@P,`$-#0HP,#`-#0I)15%8,#$@155-4"`P-S`U,#`-#0I"5492 M`2+?!```%@``_@`````#_]T0``?@"P<$.P````D``'C`Z`@!(K0``,``_@!N M@#T!^`"P!P"!`````"JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ@#=]]]]] diff --git a/libarchive/test/test_read_format_raw.c b/libarchive/test/test_read_format_raw.c index 457db009727b..a0f68e5b880f 100644 --- a/libarchive/test/test_read_format_raw.c +++ b/libarchive/test/test_read_format_raw.c @@ -26,7 +26,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_raw.c 191594 2009-04-27 20:09:05Z kientzle $"); DEFINE_TEST(test_read_format_raw) { diff --git a/libarchive/test/test_read_format_raw.data.Z.uu b/libarchive/test/test_read_format_raw.data.Z.uu index eff01d3799e9..3fe4deaba09d 100644 --- a/libarchive/test/test_read_format_raw.data.Z.uu +++ b/libarchive/test/test_read_format_raw.data.Z.uu @@ -1,4 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_raw.data.Z.uu 191594 2009-04-27 20:09:05Z kientzle $ begin 644 test_read_format_raw.data.Z ('YV09MZ\40`` ` diff --git a/libarchive/test/test_read_format_raw.data.uu b/libarchive/test/test_read_format_raw.data.uu index e88da003fb42..7c68a2caa117 100644 --- a/libarchive/test/test_read_format_raw.data.uu +++ b/libarchive/test/test_read_format_raw.data.uu @@ -1,4 +1,3 @@ -$FreeBSD: head/lib/libarchive/test/test_read_format_raw.data.uu 191594 2009-04-27 20:09:05Z kientzle $ begin 644 test_read_format_raw.data $9F]O"@`` ` diff --git a/libarchive/test/test_read_format_tar.c b/libarchive/test/test_read_format_tar.c index 7c7cadd0a38b..2b7cd8dedcca 100644 --- a/libarchive/test/test_read_format_tar.c +++ b/libarchive/test/test_read_format_tar.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_tar.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * Each of these archives is a short archive with a single entry. The diff --git a/libarchive/test/test_read_format_tar_concatenated.c b/libarchive/test/test_read_format_tar_concatenated.c index d1f67e20f7df..f6ed03a4404b 100644 --- a/libarchive/test/test_read_format_tar_concatenated.c +++ b/libarchive/test/test_read_format_tar_concatenated.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); /* * The sample tar file is the result of concatenating two tar files, diff --git a/libarchive/test/test_read_format_tar_empty_filename.c b/libarchive/test/test_read_format_tar_empty_filename.c index b1a1a4e1c821..310d260bb4d6 100644 --- a/libarchive/test/test_read_format_tar_empty_filename.c +++ b/libarchive/test/test_read_format_tar_empty_filename.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_tar_empty_filename.c,v 1.2 2008/09/01 05:38:33 kientzle Exp $"); /* * Tar entries with empty filenames are unusual, but shouldn't crash us. diff --git a/libarchive/test/test_read_format_tar_empty_filename.tar.uu b/libarchive/test/test_read_format_tar_empty_filename.tar.uu index f8a4f4f2f1b0..6cd9629278ae 100644 --- a/libarchive/test/test_read_format_tar_empty_filename.tar.uu +++ b/libarchive/test/test_read_format_tar_empty_filename.tar.uu @@ -1,5 +1,4 @@ -$FreeBSD: src/lib/libarchive/test/test_read_format_tar_empty_filename.tar.uu,v 1.2 2008/07/03 03:26:30 peter Exp $ -begin 644 test_compat_tar_1.tar +begin 644 test_read_format_tar_empty_filename.tar M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M`````````````#`P,#O8,'6D`%BS)LV; diff --git a/libarchive/test/test_read_format_tar_invalid_pax_size.c b/libarchive/test/test_read_format_tar_invalid_pax_size.c index 0a03cb677593..64b5a7cc4b8d 100644 --- a/libarchive/test/test_read_format_tar_invalid_pax_size.c +++ b/libarchive/test/test_read_format_tar_invalid_pax_size.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * The pax size attribute can be used to override the size. diff --git a/libarchive/test/test_read_format_tar_invalid_pax_size.tar.uu b/libarchive/test/test_read_format_tar_invalid_pax_size.tar.uu index 71309eab2cb3..3fa9a2e0ef62 100644 --- a/libarchive/test/test_read_format_tar_invalid_pax_size.tar.uu +++ b/libarchive/test/test_read_format_tar_invalid_pax_size.tar.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_tar_invalid_pax_size.tar.uu +begin 644 test_read_format_tar_invalid_pax_size.tar M+B]087A(96%D97)S+C$T-#8S+V%A80`````````````````````````````` M```````````````````````````````````````````````````````````` M`````````````#`P,#`V-#0`,#`P,#`P,``P,#`P,#`P`#`P,#`P,#`P,S$R diff --git a/libarchive/test/test_read_format_tbz.c b/libarchive/test/test_read_format_tbz.c index 331955fd9c39..7323e13c98d0 100644 --- a/libarchive/test/test_read_format_tbz.c +++ b/libarchive/test/test_read_format_tbz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_tbz.c 201247 2009-12-30 05:59:21Z kientzle $"); static unsigned char archive[] = { 'B','Z','h','9','1','A','Y','&','S','Y',237,7,140,'W',0,0,27,251,144,208, diff --git a/libarchive/test/test_read_format_tgz.c b/libarchive/test/test_read_format_tgz.c index 9fba89657e92..5bb5e02be4f4 100644 --- a/libarchive/test/test_read_format_tgz.c +++ b/libarchive/test/test_read_format_tgz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_tgz.c 191183 2009-04-17 01:06:31Z kientzle $"); static unsigned char archive[] = { 31,139,8,0,222,'C','p','C',0,3,211,'c',160,'=','0','0','0','0','7','5','U', diff --git a/libarchive/test/test_read_format_tlz.c b/libarchive/test/test_read_format_tlz.c index 7c7a1431903c..5633baa4c6e8 100644 --- a/libarchive/test/test_read_format_tlz.c +++ b/libarchive/test/test_read_format_tlz.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_tlz.c 201247 2009-12-30 05:59:21Z kientzle $"); static unsigned char archive[] = { 93, 0, 0,128, 0,255,255,255,255,255,255,255,255, 0, 23, 0, diff --git a/libarchive/test/test_read_format_txz.c b/libarchive/test/test_read_format_txz.c index c082d7e5e7be..e17b054a6213 100644 --- a/libarchive/test/test_read_format_txz.c +++ b/libarchive/test/test_read_format_txz.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_txz.c 191183 2009-04-17 01:06:31Z kientzle $"); static unsigned char archive[] = { 253, 55,122, 88, 90, 0, 0, 4,230,214,180, 70, 2, 0, 33, 1, diff --git a/libarchive/test/test_read_format_tz.c b/libarchive/test/test_read_format_tz.c index 4ba7bcb3f9c6..4dfc916a3608 100644 --- a/libarchive/test/test_read_format_tz.c +++ b/libarchive/test/test_read_format_tz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_tz.c 189381 2009-03-05 00:31:48Z kientzle $"); static unsigned char archive[] = { 31,157,144,'.',0,8,28,'H',176,160,193,131,8,19,'*','\\',200,176,'!','B',24, diff --git a/libarchive/test/test_read_format_ustar_filename.c b/libarchive/test/test_read_format_ustar_filename.c index 5c2717cdf2c0..0c7e8a3c8070 100644 --- a/libarchive/test/test_read_format_ustar_filename.c +++ b/libarchive/test/test_read_format_ustar_filename.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); #include diff --git a/libarchive/test/test_read_format_warc.c b/libarchive/test/test_read_format_warc.c index 658ab8a6e72b..91e6dc67e133 100644 --- a/libarchive/test/test_read_format_warc.c +++ b/libarchive/test/test_read_format_warc.c @@ -25,8 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); - DEFINE_TEST(test_read_format_warc) { diff --git a/libarchive/test/test_read_format_xar.c b/libarchive/test/test_read_format_xar.c index 1c8524520b39..daff2921690a 100644 --- a/libarchive/test/test_read_format_xar.c +++ b/libarchive/test/test_read_format_xar.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #define UID 1001 #define UNAME "cue" diff --git a/libarchive/test/test_read_format_zip.c b/libarchive/test/test_read_format_zip.c index 6809641432ce..9e820f509c19 100644 --- a/libarchive/test/test_read_format_zip.c +++ b/libarchive/test/test_read_format_zip.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_zip.c 189482 2009-03-07 03:30:35Z kientzle $"); #define __LIBARCHIVE_BUILD #include @@ -157,7 +156,7 @@ verify_basic(struct archive *a, int seek_checks) if (archive_zlib_version() != NULL) { failure("file2 has a bad CRC, so read should fail and not change buff"); memset(buff, 'a', 19); - assertEqualInt(ARCHIVE_WARN, archive_read_data(a, buff, 19)); + assertEqualInt(ARCHIVE_FAILED, archive_read_data(a, buff, 19)); assertEqualMem(buff, "aaaaaaaaaaaaaaaaaaa", 19); } else { assertEqualInt(ARCHIVE_FAILED, archive_read_data(a, buff, 19)); diff --git a/libarchive/test/test_read_format_zip_7075_utf8_paths.c b/libarchive/test/test_read_format_zip_7075_utf8_paths.c index a0a510c8f29b..fefcc82881f8 100644 --- a/libarchive/test/test_read_format_zip_7075_utf8_paths.c +++ b/libarchive/test/test_read_format_zip_7075_utf8_paths.c @@ -25,7 +25,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #include diff --git a/libarchive/test/test_read_format_zip_bzip2.zipx.uu b/libarchive/test/test_read_format_zip_bzip2.zipx.uu index 6d9884aeddf5..4c9aeb77a941 100644 --- a/libarchive/test/test_read_format_zip_bzip2.zipx.uu +++ b/libarchive/test/test_read_format_zip_bzip2.zipx.uu @@ -1,4 +1,4 @@ -begin 644 bzip2.zipx +begin 644 test_read_format_zip_bzip2.zipx M4$L#!"X#```,`#TQD4VJ.XZZ-`(``)`#```%````=FEME,ID:&U-'E`T&C1IIIZ M@8&J>$9":`IZ@``'J:/2&#```````!@`2FB$T:31D9"F@8FC0`\H^:+Y;81F diff --git a/libarchive/test/test_read_format_zip_comment_stored.c b/libarchive/test/test_read_format_zip_comment_stored.c index 95df0107fecb..39f83a821006 100644 --- a/libarchive/test/test_read_format_zip_comment_stored.c +++ b/libarchive/test/test_read_format_zip_comment_stored.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Read a zip file that has a zip comment in the end of the central diff --git a/libarchive/test/test_read_format_zip_encryption_data.c b/libarchive/test/test_read_format_zip_encryption_data.c index b56d78e9074f..4a6502b9bf2d 100644 --- a/libarchive/test/test_read_format_zip_encryption_data.c +++ b/libarchive/test/test_read_format_zip_encryption_data.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_zip_encryption_data) { diff --git a/libarchive/test/test_read_format_zip_encryption_header.c b/libarchive/test/test_read_format_zip_encryption_header.c index f40e1f5cb8da..fb19c1421946 100644 --- a/libarchive/test/test_read_format_zip_encryption_header.c +++ b/libarchive/test/test_read_format_zip_encryption_header.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_zip_encryption_header) { diff --git a/libarchive/test/test_read_format_zip_encryption_partially.c b/libarchive/test/test_read_format_zip_encryption_partially.c index 77af235d58b7..cd5d2103ea6a 100644 --- a/libarchive/test/test_read_format_zip_encryption_partially.c +++ b/libarchive/test/test_read_format_zip_encryption_partially.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_zip_encryption_partially) { diff --git a/libarchive/test/test_read_format_zip_filename.c b/libarchive/test/test_read_format_zip_filename.c index 4dd2e8ad6e8f..b673344738be 100644 --- a/libarchive/test/test_read_format_zip_filename.c +++ b/libarchive/test/test_read_format_zip_filename.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); #include @@ -1178,6 +1177,11 @@ DEFINE_TEST(test_read_format_zip_filename_KOI8R_UTF8_2) next_test: assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + /* + * By default, Windows will create an sconv_default object, which will + * interpret filenames as OEMCP + */ +#if !defined(_WIN32) || defined(__CYGWIN__) /* * Read filename in en_US.UTF-8 without "hdrcharset=KOI8-R" option. * The filename we can properly read is only second file. @@ -1221,4 +1225,5 @@ DEFINE_TEST(test_read_format_zip_filename_KOI8R_UTF8_2) /* Close the archive. */ assertEqualInt(ARCHIVE_OK, archive_read_close(a)); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +#endif } diff --git a/libarchive/test/test_read_format_zip_filename_cp866.zip.uu b/libarchive/test/test_read_format_zip_filename_cp866.zip.uu index 52c6770609e1..7ef721490c4a 100644 --- a/libarchive/test/test_read_format_zip_filename_cp866.zip.uu +++ b/libarchive/test/test_read_format_zip_filename_cp866.zip.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_zip_cp866.zip +begin 644 test_read_format_zip_filename_cp866.zip M4$L#!`H``````%VEAS[,X8$4!@````8````&`!P`CY"(@H62550)``-!HYU- M0:.=375X"P`!!.D#```$Z0,``/#RZ??E]%!+`P0*``````!=I8<^S.&!%`8` M```&````!@`<`*_@J**EXE54"0`#0:.=34&CG4UU>`L``03I`P``!.D#``#P diff --git a/libarchive/test/test_read_format_zip_filename_cp932.zip.uu b/libarchive/test/test_read_format_zip_filename_cp932.zip.uu index 90c22f2d5c45..ec0f9c091b06 100644 --- a/libarchive/test/test_read_format_zip_filename_cp932.zip.uu +++ b/libarchive/test/test_read_format_zip_filename_cp932.zip.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_zip_cp932.zip +begin 644 test_read_format_zip_filename_cp932.zip M4$L#!`H``````/94=#Z"B='W!0````4````1````E5R"OH+F+XCJEY>57"YT M>'1(96QL;U!+`P0*``````"W5'0^W)UO0@4````%````#P```)5<@KZ"YB^* MOXZ:+G1X=&MA;FII4$L!`A0+"@``````]E1T/H*)T?<%````!0```!$````` diff --git a/libarchive/test/test_read_format_zip_filename_koi8r.zip.uu b/libarchive/test/test_read_format_zip_filename_koi8r.zip.uu index 05c669560270..242c902f0b64 100644 --- a/libarchive/test/test_read_format_zip_filename_koi8r.zip.uu +++ b/libarchive/test/test_read_format_zip_filename_koi8r.zip.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_zip_koi8r.zip +begin 644 test_read_format_zip_filename_koi8r.zip M4$L#!`H``````+&CAS[,X8$4!@````8````&`!P`T-+)U\74550)``,>H)U- M'J"=375X"P`!!.D#```$Z0,``/#RZ??E]%!+`P0*``````"QHX<^S.&!%`8` M```&````!@`<`/#RZ??E]%54"0`#'J"=31Z@G4UU>`L``03I`P``!.D#``#P diff --git a/libarchive/test/test_read_format_zip_filename_utf8_jp.zip.uu b/libarchive/test/test_read_format_zip_filename_utf8_jp.zip.uu index 00c2af33723a..3c9f4b9ea934 100644 --- a/libarchive/test/test_read_format_zip_filename_utf8_jp.zip.uu +++ b/libarchive/test/test_read_format_zip_filename_utf8_jp.zip.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_zip_utf8.zip +begin 644 test_read_format_zip_filename_utf8_jp.zip M4$L#!`H```@``,E4=#X````````````````*`!P`Z*&HXX&@XX*(+U54"0`# MBEJ%3;[UBDUU>`L``03M`P``!`$"``!02P,$"@``"```]51T/H*)T?<%```` M!0```!<`'`#HH:CC@:#C@H@OY+B`Z*:GZ*&H+G1X=%54"0`#WEJ%31KLBDUU diff --git a/libarchive/test/test_read_format_zip_filename_utf8_ru.zip.uu b/libarchive/test/test_read_format_zip_filename_utf8_ru.zip.uu index 9241776d7fdf..bd71cc2a497b 100644 --- a/libarchive/test/test_read_format_zip_filename_utf8_ru.zip.uu +++ b/libarchive/test/test_read_format_zip_filename_utf8_ru.zip.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_zip_utf8_ru.zip +begin 644 test_read_format_zip_filename_utf8_ru.zip M4$L#!`H```@``,NC/S[,X8$4!@````8````,`!P`T)_0H-"8T)+0E="B550) M``-.G49-'J"=375X"P`!!.D#```$Z0,``/#RZ??E]%!+`P0*```(``!KI3\^ MS.&!%`8````&````#``<`-"_T8#0N-"RT+71@E54"0`#6J!&31Z@G4UU>`L` diff --git a/libarchive/test/test_read_format_zip_filename_utf8_ru2.zip.uu b/libarchive/test/test_read_format_zip_filename_utf8_ru2.zip.uu index 651f8b1f8b10..65a34ed59147 100644 --- a/libarchive/test/test_read_format_zip_filename_utf8_ru2.zip.uu +++ b/libarchive/test/test_read_format_zip_filename_utf8_ru2.zip.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_zip_utf8_ru2.zip +begin 644 test_read_format_zip_filename_utf8_ru2.zip M4$L#!`H``````.:PCC[,X8$4!@````8````&`!P`\/+I]^7T550)``.`\:9- MI6>G375X"P`!!.D#```$Z0,``/#RZ??E]%!+`P0*```(``!KI3\^S.&!%`8` M```&````#``<`-"_T8#0N-"RT+71@E54"0`#6J!&357SIDUU>`L``03I`P`` diff --git a/libarchive/test/test_read_format_zip_high_compression.c b/libarchive/test/test_read_format_zip_high_compression.c index 16cfbb182893..d28897027747 100644 --- a/libarchive/test/test_read_format_zip_high_compression.c +++ b/libarchive/test/test_read_format_zip_high_compression.c @@ -23,11 +23,9 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD"); #include - /* * Github Issue 748 reported problems with end-of-entry handling * with highly-compressible data. This resulted in the end of the diff --git a/libarchive/test/test_read_format_zip_jar.c b/libarchive/test/test_read_format_zip_jar.c index 912e67137704..75ea3eb9b868 100644 --- a/libarchive/test/test_read_format_zip_jar.c +++ b/libarchive/test/test_read_format_zip_jar.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Issue 822: jar files have an empty External File Attributes field which diff --git a/libarchive/test/test_read_format_zip_lzma.zipx.uu b/libarchive/test/test_read_format_zip_lzma.zipx.uu index 24fdc8e7c288..d0aad44a17d1 100644 --- a/libarchive/test/test_read_format_zip_lzma.zipx.uu +++ b/libarchive/test/test_read_format_zip_lzma.zipx.uu @@ -1,4 +1,4 @@ -begin 644 lzma.zipx +begin 644 test_read_format_zip_lzma.zipx M4$L#!#\#```.`#TQD4VJ.XZZ.0(``)`#```%````=FEM)82Q1PWAL M+U`,N0L_$]^&650C/X$D6#4QFD$\A/"_![4!O/5O/!KH`WCQ*4?T2*]4P#/D diff --git a/libarchive/test/test_read_format_zip_mac_metadata.c b/libarchive/test/test_read_format_zip_mac_metadata.c index 3f2813cc9894..9f7c35e1df85 100644 --- a/libarchive/test/test_read_format_zip_mac_metadata.c +++ b/libarchive/test/test_read_format_zip_mac_metadata.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Read a zip file that has a zip comment in the end of the central diff --git a/libarchive/test/test_read_format_zip_malformed.c b/libarchive/test/test_read_format_zip_malformed.c index f1160648e759..7e46abd8a4c1 100644 --- a/libarchive/test/test_read_format_zip_malformed.c +++ b/libarchive/test/test_read_format_zip_malformed.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static void test_malformed1(void) diff --git a/libarchive/test/test_read_format_zip_nested.c b/libarchive/test/test_read_format_zip_nested.c index 4418fc4f2502..95945638b074 100644 --- a/libarchive/test/test_read_format_zip_nested.c +++ b/libarchive/test/test_read_format_zip_nested.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_zip_nested) { @@ -50,7 +49,7 @@ DEFINE_TEST(test_read_format_zip_nested) /* Save contents of inner Zip. */ innerLength = (size_t)archive_entry_size(ae); - inner = calloc(innerLength, 1); + inner = calloc(innerLength, sizeof(char)); assertEqualInt(innerLength, archive_read_data(a, inner, innerLength)); assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); diff --git a/libarchive/test/test_read_format_zip_nofiletype.c b/libarchive/test/test_read_format_zip_nofiletype.c index b3260fa7563b..d2798b283185 100644 --- a/libarchive/test/test_read_format_zip_nofiletype.c +++ b/libarchive/test/test_read_format_zip_nofiletype.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Issue 332: Some epub files (which are really Zip archives) have diff --git a/libarchive/test/test_read_format_zip_padded.c b/libarchive/test/test_read_format_zip_padded.c index d8c694bae5e2..dcbf3406e867 100644 --- a/libarchive/test/test_read_format_zip_padded.c +++ b/libarchive/test/test_read_format_zip_padded.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static void verify_padded_archive(const char *refname) diff --git a/libarchive/test/test_read_format_zip_ppmd8.zipx.uu b/libarchive/test/test_read_format_zip_ppmd8.zipx.uu index 4440e95b3158..cdbf0f44899d 100644 --- a/libarchive/test/test_read_format_zip_ppmd8.zipx.uu +++ b/libarchive/test/test_read_format_zip_ppmd8.zipx.uu @@ -1,4 +1,4 @@ -begin 644 ppmd8.zipx +begin 644 test_read_format_zip_ppmd8.zipx M4$L#!#\#``!B`#TQD4VJ.XZZV`$``)`#```%````=FEMEJ>3<8@F_*<(\B>K]4_(WC8#)`_QSG+`7`B&_11VIJ)@#(K)_I8R^=`VUO2_S,1C=1CAU>-*`]CC+&6Q;EE'#CG-W=^[,F,+UR-TE(9,G diff --git a/libarchive/test/test_read_format_zip_sfx.c b/libarchive/test/test_read_format_zip_sfx.c index a33c1b808c56..dad0a270d7bc 100644 --- a/libarchive/test/test_read_format_zip_sfx.c +++ b/libarchive/test/test_read_format_zip_sfx.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Read a zip file that is a SFX. diff --git a/libarchive/test/test_read_format_zip_traditional_encryption_data.c b/libarchive/test/test_read_format_zip_traditional_encryption_data.c index 20e55bbc6948..8f0cfe6dc896 100644 --- a/libarchive/test/test_read_format_zip_traditional_encryption_data.c +++ b/libarchive/test/test_read_format_zip_traditional_encryption_data.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_read_format_zip_traditional_encryption_data) { diff --git a/libarchive/test/test_read_format_zip_winzip_aes.c b/libarchive/test/test_read_format_zip_winzip_aes.c index 3f543927a41e..7c5d5ea61f77 100644 --- a/libarchive/test/test_read_format_zip_winzip_aes.c +++ b/libarchive/test/test_read_format_zip_winzip_aes.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static void test_winzip_aes(const char *refname, int need_libz) diff --git a/libarchive/test/test_read_format_zip_winzip_aes128.zip.uu b/libarchive/test/test_read_format_zip_winzip_aes128.zip.uu index d0f03a3112e1..d3a69d8d41d4 100644 --- a/libarchive/test/test_read_format_zip_winzip_aes128.zip.uu +++ b/libarchive/test/test_read_format_zip_winzip_aes128.zip.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_zip_winzip_aes128_encryption_data.zip +begin 644 test_read_format_zip_winzip_aes128.zip M4$L#!#,#`0!C`(RP#D4`````@0H``*(:```&``L`4D5!1$U%`9D'``(`044! M"``>H87EHY!N6J#=V\<,#M>^H2IQID3@A--GSL+F%'R^%OKB.K(74CJ!,(%" ML\O.^D'TO'!T<+"]"28FXP@QKAY]R+02!E!XE_6A-W&<$&SJ5W]K'SJ4>'C< diff --git a/libarchive/test/test_read_format_zip_winzip_aes256.zip.uu b/libarchive/test/test_read_format_zip_winzip_aes256.zip.uu index a45c8fbe664f..ae51e66538d1 100644 --- a/libarchive/test/test_read_format_zip_winzip_aes256.zip.uu +++ b/libarchive/test/test_read_format_zip_winzip_aes256.zip.uu @@ -1,4 +1,4 @@ -begin 644 test_read_format_zip_winzip_aes256_encryption_data.zip +begin 644 test_read_format_zip_winzip_aes256.zip M4$L#!#,#`0!C`(RP#D4`````B0H``*(:```&``L`4D5!1$U%`9D'``(`044# M"`#8+Z><':+DENQS9*!7Y*&!7BQK,UN]RF*'<':@;]N)O5>]A5>0!R(9&J6OW+%/X2D%.HLH/4@[H=,;4@&P$:E>NK#GQM>2SUV&GDS9/G@ M#J5^X(O61I @@ -121,7 +120,7 @@ create_sparse_file(const char *path, const struct sparse *s) memset(buff, ' ', sizeof(buff)); handle = CreateFileA(path, GENERIC_WRITE, 0, - NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, + NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); assert(handle != INVALID_HANDLE_VALUE); assert(DeviceIoControl(handle, FSCTL_SET_SPARSE, NULL, 0, diff --git a/libarchive/test/test_splitted_rar_seek_support_aa.uu b/libarchive/test/test_splitted_rar_seek_support_aa.uu index 0344d2ce30ef..af2fcae348e8 100644 --- a/libarchive/test/test_splitted_rar_seek_support_aa.uu +++ b/libarchive/test/test_splitted_rar_seek_support_aa.uu @@ -1,4 +1,4 @@ -begin 644 - +begin 644 test_splitted_rar_seek_support_aa M4F%R(1H'`,^0 #include diff --git a/libarchive/test/test_ustar_filename_encoding.c b/libarchive/test/test_ustar_filename_encoding.c index 5e4fba716c13..cc62453f1c1b 100644 --- a/libarchive/test/test_ustar_filename_encoding.c +++ b/libarchive/test/test_ustar_filename_encoding.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #include diff --git a/libarchive/test/test_ustar_filenames.c b/libarchive/test/test_ustar_filenames.c index 1a4b4e1452c2..896b5cc9f1a1 100644 --- a/libarchive/test/test_ustar_filenames.c +++ b/libarchive/test/test_ustar_filenames.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_ustar_filenames.c 189308 2009-03-03 17:02:51Z kientzle $"); /* * Exercise various lengths of filenames in ustar archives. diff --git a/libarchive/test/test_write_disk.c b/libarchive/test/test_write_disk.c index e38dbc78ff4e..fa0743f949f6 100644 --- a/libarchive/test/test_write_disk.c +++ b/libarchive/test/test_write_disk.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_disk.c 201247 2009-12-30 05:59:21Z kientzle $"); #define UMASK 022 /* diff --git a/libarchive/test/test_write_disk_appledouble.c b/libarchive/test/test_write_disk_appledouble.c index d82d698ebda7..3265a94d2fed 100644 --- a/libarchive/test/test_write_disk_appledouble.c +++ b/libarchive/test/test_write_disk_appledouble.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_ACL_H #include diff --git a/libarchive/test/test_write_disk_failures.c b/libarchive/test/test_write_disk_failures.c index c563ce1d3212..ff688b993d5f 100644 --- a/libarchive/test/test_write_disk_failures.c +++ b/libarchive/test/test_write_disk_failures.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_disk_failures.c 201247 2009-12-30 05:59:21Z kientzle $"); DEFINE_TEST(test_write_disk_failures) { diff --git a/libarchive/test/test_write_disk_hardlink.c b/libarchive/test/test_write_disk_hardlink.c index 184f77a00f0d..215633ab40bf 100644 --- a/libarchive/test/test_write_disk_hardlink.c +++ b/libarchive/test/test_write_disk_hardlink.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_disk_hardlink.c 201247 2009-12-30 05:59:21Z kientzle $"); #if defined(_WIN32) && !defined(__CYGWIN__) /* Execution bits, Group members bits and others bits do not work. */ diff --git a/libarchive/test/test_write_disk_hfs_compression.c b/libarchive/test/test_write_disk_hfs_compression.c index 8a2e7df3b9b2..026e41533628 100644 --- a/libarchive/test/test_write_disk_hfs_compression.c +++ b/libarchive/test/test_write_disk_hfs_compression.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_XATTR_H #include diff --git a/libarchive/test/test_write_disk_lookup.c b/libarchive/test/test_write_disk_lookup.c index cabdae8ddc43..52b9a7457017 100644 --- a/libarchive/test/test_write_disk_lookup.c +++ b/libarchive/test/test_write_disk_lookup.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static void group_cleanup(void *d) diff --git a/libarchive/test/test_write_disk_mac_metadata.c b/libarchive/test/test_write_disk_mac_metadata.c index be13d96afddf..f9cfd9b3fd7c 100644 --- a/libarchive/test/test_write_disk_mac_metadata.c +++ b/libarchive/test/test_write_disk_mac_metadata.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_ACL_H #include diff --git a/libarchive/test/test_write_disk_no_hfs_compression.c b/libarchive/test/test_write_disk_no_hfs_compression.c index 0af44d246a11..58ad187574c1 100644 --- a/libarchive/test/test_write_disk_no_hfs_compression.c +++ b/libarchive/test/test_write_disk_no_hfs_compression.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_XATTR_H #include diff --git a/libarchive/test/test_write_disk_perms.c b/libarchive/test/test_write_disk_perms.c index 81f8b1209ce1..4df9f70bd998 100644 --- a/libarchive/test/test_write_disk_perms.c +++ b/libarchive/test/test_write_disk_perms.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_disk_perms.c 201247 2009-12-30 05:59:21Z kientzle $"); #if !defined(_WIN32) || defined(__CYGWIN__) diff --git a/libarchive/test/test_write_disk_secure.c b/libarchive/test/test_write_disk_secure.c index 44b9ea0d5b21..ddaf95d7497c 100644 --- a/libarchive/test/test_write_disk_secure.c +++ b/libarchive/test/test_write_disk_secure.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_disk_secure.c 201247 2009-12-30 05:59:21Z kientzle $"); #define UMASK 022 diff --git a/libarchive/test/test_write_disk_secure744.c b/libarchive/test/test_write_disk_secure744.c index 9b12d4cf1082..35824658ce65 100644 --- a/libarchive/test/test_write_disk_secure744.c +++ b/libarchive/test/test_write_disk_secure744.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #define UMASK 022 diff --git a/libarchive/test/test_write_disk_secure745.c b/libarchive/test/test_write_disk_secure745.c index 870b06475cef..7b908ccc8905 100644 --- a/libarchive/test/test_write_disk_secure745.c +++ b/libarchive/test/test_write_disk_secure745.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #define UMASK 022 diff --git a/libarchive/test/test_write_disk_secure746.c b/libarchive/test/test_write_disk_secure746.c index 99cb882c059a..3f0588914707 100644 --- a/libarchive/test/test_write_disk_secure746.c +++ b/libarchive/test/test_write_disk_secure746.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #define UMASK 022 diff --git a/libarchive/test/test_write_disk_sparse.c b/libarchive/test/test_write_disk_sparse.c index 36ecf322087d..36fd6944584d 100644 --- a/libarchive/test/test_write_disk_sparse.c +++ b/libarchive/test/test_write_disk_sparse.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_disk_sparse.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * Write a file using archive_write_data call, read the file diff --git a/libarchive/test/test_write_disk_symlink.c b/libarchive/test/test_write_disk_symlink.c index aeadfee8a4e9..65194d94c081 100644 --- a/libarchive/test/test_write_disk_symlink.c +++ b/libarchive/test/test_write_disk_symlink.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_disk_symlink.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * Exercise symlink recreation. diff --git a/libarchive/test/test_write_disk_times.c b/libarchive/test/test_write_disk_times.c index 568d04c0017d..265da4c2b875 100644 --- a/libarchive/test/test_write_disk_times.c +++ b/libarchive/test/test_write_disk_times.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_disk_times.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * Exercise time restores in archive_write_disk(), including diff --git a/libarchive/test/test_write_filter_b64encode.c b/libarchive/test/test_write_filter_b64encode.c index 5b917e92a30a..e33ff8a9817c 100644 --- a/libarchive/test/test_write_filter_b64encode.c +++ b/libarchive/test/test_write_filter_b64encode.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * A basic exercise of b64encode reading and writing. diff --git a/libarchive/test/test_write_filter_bzip2.c b/libarchive/test/test_write_filter_bzip2.c index 9e089c0dfdb5..f48bcc213231 100644 --- a/libarchive/test/test_write_filter_bzip2.c +++ b/libarchive/test/test_write_filter_bzip2.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_compress_bzip2.c 191183 2009-04-17 01:06:31Z kientzle $"); /* * A basic exercise of bzip2 reading and writing. diff --git a/libarchive/test/test_write_filter_compress.c b/libarchive/test/test_write_filter_compress.c index 5cc0fc80bd8c..f7b9565b7db2 100644 --- a/libarchive/test/test_write_filter_compress.c +++ b/libarchive/test/test_write_filter_compress.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_compress.c 189308 2009-03-03 17:02:51Z kientzle $"); /* * A basic exercise of compress reading and writing. diff --git a/libarchive/test/test_write_filter_gzip.c b/libarchive/test/test_write_filter_gzip.c index 2b761627179e..ae81a4fc59d6 100644 --- a/libarchive/test/test_write_filter_gzip.c +++ b/libarchive/test/test_write_filter_gzip.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_compress_gzip.c 191183 2009-04-17 01:06:31Z kientzle $"); /* * A basic exercise of gzip reading and writing. diff --git a/libarchive/test/test_write_filter_gzip_timestamp.c b/libarchive/test/test_write_filter_gzip_timestamp.c index 23b11dba79a6..ee29f034231c 100644 --- a/libarchive/test/test_write_filter_gzip_timestamp.c +++ b/libarchive/test/test_write_filter_gzip_timestamp.c @@ -26,7 +26,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_write_filter_gzip_timestamp) { diff --git a/libarchive/test/test_write_filter_lz4.c b/libarchive/test/test_write_filter_lz4.c index 071fee41dd95..97a80321dede 100644 --- a/libarchive/test/test_write_filter_lz4.c +++ b/libarchive/test/test_write_filter_lz4.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * A basic exercise of lz4 reading and writing. @@ -62,7 +61,7 @@ DEFINE_TEST(test_write_filter_lz4) assert(NULL != (buff = (char *)malloc(buffsize))); datasize = 10000; - assert(NULL != (data = (char *)calloc(1, datasize))); + assert(NULL != (data = (char *)calloc(datasize, 1))); filecount = 10; /* @@ -306,7 +305,7 @@ test_options(const char *options) assert(NULL != (buff = (char *)malloc(buffsize))); datasize = 10000; - assert(NULL != (data = (char *)calloc(1, datasize))); + assert(NULL != (data = (char *)calloc(datasize, 1))); filecount = 10; /* diff --git a/libarchive/test/test_write_filter_lzip.c b/libarchive/test/test_write_filter_lzip.c index ce70a5d629a7..8d6544668980 100644 --- a/libarchive/test/test_write_filter_lzip.c +++ b/libarchive/test/test_write_filter_lzip.c @@ -26,7 +26,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * A basic exercise of lzip reading and writing. diff --git a/libarchive/test/test_write_filter_lzma.c b/libarchive/test/test_write_filter_lzma.c index d055333a44c3..d7c0c5b21b6b 100644 --- a/libarchive/test/test_write_filter_lzma.c +++ b/libarchive/test/test_write_filter_lzma.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_compress_lzma.c 191183 2009-04-17 01:06:31Z kientzle $"); /* * A basic exercise of lzma reading and writing. diff --git a/libarchive/test/test_write_filter_lzop.c b/libarchive/test/test_write_filter_lzop.c index 18fc332b44ff..87843f49bd3b 100644 --- a/libarchive/test/test_write_filter_lzop.c +++ b/libarchive/test/test_write_filter_lzop.c @@ -25,8 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); - /* * A basic exercise of lzop reading and writing. */ @@ -57,7 +55,7 @@ DEFINE_TEST(test_write_filter_lzop) assert(NULL != (buff = (char *)malloc(buffsize))); datasize = 10000; - assert(NULL != (data = (char *)calloc(1, datasize))); + assert(NULL != (data = (char *)calloc(datasize, 1))); filecount = 10; /* diff --git a/libarchive/test/test_write_filter_program.c b/libarchive/test/test_write_filter_program.c index 9fe264c018dc..a1f93ab79f5a 100644 --- a/libarchive/test/test_write_filter_program.c +++ b/libarchive/test/test_write_filter_program.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_compress_program.c 201247 2009-12-30 05:59:21Z kientzle $"); static char buff[1000000]; static char buff2[64]; diff --git a/libarchive/test/test_write_filter_uuencode.c b/libarchive/test/test_write_filter_uuencode.c index 2ce5b8931447..7eda278b35cd 100644 --- a/libarchive/test/test_write_filter_uuencode.c +++ b/libarchive/test/test_write_filter_uuencode.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * A basic exercise of uuencode reading and writing. diff --git a/libarchive/test/test_write_filter_xz.c b/libarchive/test/test_write_filter_xz.c index e2f1ec821425..db4e5dafa274 100644 --- a/libarchive/test/test_write_filter_xz.c +++ b/libarchive/test/test_write_filter_xz.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_compress_xz.c 191183 2009-04-17 01:06:31Z kientzle $"); /* * A basic exercise of xz reading and writing. diff --git a/libarchive/test/test_write_filter_zstd.c b/libarchive/test/test_write_filter_zstd.c index aa77b49860c0..da711f9e4bf9 100644 --- a/libarchive/test/test_write_filter_zstd.c +++ b/libarchive/test/test_write_filter_zstd.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_write_filter_zstd) { @@ -133,32 +132,112 @@ DEFINE_TEST(test_write_filter_zstd) archive_write_set_filter_option(a, NULL, "threads", "-1")); /* negative */ assertEqualIntA(a, ARCHIVE_OK, archive_write_set_filter_option(a, NULL, "threads", "4")); -#if HAVE_ZSTD_H && HAVE_LIBZSTD_COMPRESSOR +#if HAVE_ZSTD_H && HAVE_ZSTD_compressStream /* frame-per-file: boolean */ assertEqualIntA(a, ARCHIVE_OK, archive_write_set_filter_option(a, NULL, "frame-per-file", "")); - /* min-frame-size: >= 0 */ + /* min-frame-in: >= 0 */ assertEqualIntA(a, ARCHIVE_FAILED, - archive_write_set_filter_option(a, NULL, "min-frame-size", "")); + archive_write_set_filter_option(a, NULL, "min-frame-out", "")); assertEqualIntA(a, ARCHIVE_FAILED, - archive_write_set_filter_option(a, NULL, "min-frame-size", "-1")); + archive_write_set_filter_option(a, NULL, "min-frame-out", "-1")); assertEqualIntA(a, ARCHIVE_OK, - archive_write_set_filter_option(a, NULL, "min-frame-size", "0")); + archive_write_set_filter_option(a, NULL, "min-frame-out", "0")); assertEqualIntA(a, ARCHIVE_OK, - archive_write_set_filter_option(a, NULL, "min-frame-size", "1048576")); - /* max-frame-size: >= 1024 */ + archive_write_set_filter_option(a, NULL, "min-frame-out", "1048576")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-out", "1k")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-out", "1kB")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-out", "1M")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-out", "1MB")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-out", "1G")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-out", "1GB")); + /* min-frame-out: >= 0 */ + assertEqualIntA(a, ARCHIVE_FAILED, + archive_write_set_filter_option(a, NULL, "min-frame-in", "")); + assertEqualIntA(a, ARCHIVE_FAILED, + archive_write_set_filter_option(a, NULL, "min-frame-in", "-1")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-in", "0")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-in", "1048576")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-in", "1k")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-in", "1kB")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-in", "1M")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-in", "1MB")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-in", "1G")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "min-frame-in", "1GB")); + /* max-frame-in: >= 1024 */ + assertEqualIntA(a, ARCHIVE_FAILED, + archive_write_set_filter_option(a, NULL, "max-frame-in", "")); + assertEqualIntA(a, ARCHIVE_FAILED, + archive_write_set_filter_option(a, NULL, "max-frame-in", "-1")); + assertEqualIntA(a, ARCHIVE_FAILED, + archive_write_set_filter_option(a, NULL, "max-frame-in", "0")); assertEqualIntA(a, ARCHIVE_FAILED, - archive_write_set_filter_option(a, NULL, "max-frame-size", "")); + archive_write_set_filter_option(a, NULL, "max-frame-in", "1023")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-in", "1024")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-in", "1048576")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-in", "1k")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-in", "1kB")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-in", "1M")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-in", "1MB")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-in", "1G")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-in", "1GB")); + /* max-frame-out: >= 1024 */ assertEqualIntA(a, ARCHIVE_FAILED, - archive_write_set_filter_option(a, NULL, "max-frame-size", "-1")); + archive_write_set_filter_option(a, NULL, "max-frame-out", "")); assertEqualIntA(a, ARCHIVE_FAILED, - archive_write_set_filter_option(a, NULL, "max-frame-size", "0")); + archive_write_set_filter_option(a, NULL, "max-frame-out", "-1")); assertEqualIntA(a, ARCHIVE_FAILED, - archive_write_set_filter_option(a, NULL, "max-frame-size", "1023")); + archive_write_set_filter_option(a, NULL, "max-frame-out", "0")); + assertEqualIntA(a, ARCHIVE_FAILED, + archive_write_set_filter_option(a, NULL, "max-frame-out", "1023")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-out", "1024")); assertEqualIntA(a, ARCHIVE_OK, - archive_write_set_filter_option(a, NULL, "max-frame-size", "1024")); + archive_write_set_filter_option(a, NULL, "max-frame-out", "1048576")); assertEqualIntA(a, ARCHIVE_OK, - archive_write_set_filter_option(a, NULL, "max-frame-size", "1048576")); + archive_write_set_filter_option(a, NULL, "max-frame-out", "1k")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-out", "1kB")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-out", "1M")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-out", "1MB")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-out", "1G")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "max-frame-out", "1GB")); +#endif +#if ZSTD_VERSION_NUMBER >= MINVER_LONG + if ((int)(sizeof(size_t) == 4)) + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "long", "26")); + else + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_filter_option(a, NULL, "long", "27")); + assertEqualIntA(a, ARCHIVE_FAILED, + archive_write_set_filter_option(a, NULL, "long", "-1")); /* negative */ #endif assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, buffsize, &used2)); for (i = 0; i < 100; i++) { diff --git a/libarchive/test/test_write_format_7zip.c b/libarchive/test/test_write_format_7zip.c index c8fdcd02cc84..d91e88d8f40f 100644 --- a/libarchive/test/test_write_format_7zip.c +++ b/libarchive/test/test_write_format_7zip.c @@ -25,7 +25,6 @@ #include "test.h" -__FBSDID("$FreeBSD$"); static void test_basic(const char *compression_type) diff --git a/libarchive/test/test_write_format_7zip_empty.c b/libarchive/test/test_write_format_7zip_empty.c index 9a503e9d6bac..817009f4355b 100644 --- a/libarchive/test/test_write_format_7zip_empty.c +++ b/libarchive/test/test_write_format_7zip_empty.c @@ -25,7 +25,6 @@ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Test writing an empty archive. diff --git a/libarchive/test/test_write_format_7zip_large.c b/libarchive/test/test_write_format_7zip_large.c index b7a90d187bae..ac2fa08b4125 100644 --- a/libarchive/test/test_write_format_7zip_large.c +++ b/libarchive/test/test_write_format_7zip_large.c @@ -25,7 +25,6 @@ #include "test.h" -__FBSDID("$FreeBSD$"); #define LARGE_SIZE (1*1024*1024) static void diff --git a/libarchive/test/test_write_format_ar.c b/libarchive/test/test_write_format_ar.c index 058d3b17875c..9c6cd5ecdb05 100644 --- a/libarchive/test/test_write_format_ar.c +++ b/libarchive/test/test_write_format_ar.c @@ -26,7 +26,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_ar.c 189308 2009-03-03 17:02:51Z kientzle $"); static char buff[4096]; static char buff2[64]; diff --git a/libarchive/test/test_write_format_cpio.c b/libarchive/test/test_write_format_cpio.c index d5df8a8ce108..827cad3590c4 100644 --- a/libarchive/test/test_write_format_cpio.c +++ b/libarchive/test/test_write_format_cpio.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_cpio.c 185672 2008-12-06 06:02:26Z kientzle $"); static void test_format(int (*set_format)(struct archive *)) diff --git a/libarchive/test/test_write_format_cpio_empty.c b/libarchive/test/test_write_format_cpio_empty.c index 3ca5c395e33c..22682235fca3 100644 --- a/libarchive/test/test_write_format_cpio_empty.c +++ b/libarchive/test/test_write_format_cpio_empty.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_cpio_empty.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * Check that an "empty" cpio archive is correctly created. diff --git a/libarchive/test/test_write_format_cpio_newc.c b/libarchive/test/test_write_format_cpio_newc.c index 48b0b2646472..786b5d739b4d 100644 --- a/libarchive/test/test_write_format_cpio_newc.c +++ b/libarchive/test/test_write_format_cpio_newc.c @@ -23,8 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_cpio_newc.c 201247 2009-12-30 05:59:21Z kientzle $"); - static int is_hex(const char *p, size_t l) diff --git a/libarchive/test/test_write_format_cpio_odc.c b/libarchive/test/test_write_format_cpio_odc.c index aefb42ea872f..c763fcd2520c 100644 --- a/libarchive/test/test_write_format_cpio_odc.c +++ b/libarchive/test/test_write_format_cpio_odc.c @@ -23,8 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_cpio_odc.c 201247 2009-12-30 05:59:21Z kientzle $"); - static int is_octal(const char *p, size_t l) diff --git a/libarchive/test/test_write_format_gnutar.c b/libarchive/test/test_write_format_gnutar.c index 2a4c383e7aff..d72d076d115c 100644 --- a/libarchive/test/test_write_format_gnutar.c +++ b/libarchive/test/test_write_format_gnutar.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static char buff2[64]; diff --git a/libarchive/test/test_write_format_gnutar_filenames.c b/libarchive/test/test_write_format_gnutar_filenames.c index 655e998ed827..aae5a2a6f787 100644 --- a/libarchive/test/test_write_format_gnutar_filenames.c +++ b/libarchive/test/test_write_format_gnutar_filenames.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Inspired by Github issue #682, which reported that gnutar filenames diff --git a/libarchive/test/test_write_format_iso9660.c b/libarchive/test/test_write_format_iso9660.c index e4e98bb95c29..7b455794c5de 100644 --- a/libarchive/test/test_write_format_iso9660.c +++ b/libarchive/test/test_write_format_iso9660.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static char buff2[64]; DEFINE_TEST(test_write_format_iso9660) @@ -385,14 +384,14 @@ DEFINE_TEST(test_write_format_iso9660) assertEqualInt(2048, archive_entry_size(ae)); /* - * Read "hardlnk" + * Read "file" */ assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); assertEqualInt(2, archive_entry_atime(ae)); assertEqualInt(3, archive_entry_birthtime(ae)); assertEqualInt(4, archive_entry_ctime(ae)); assertEqualInt(5, archive_entry_mtime(ae)); - assertEqualString("hardlnk", archive_entry_pathname(ae)); + assertEqualString("file", archive_entry_pathname(ae)); assert((AE_IFREG | 0555) == archive_entry_mode(ae)); assertEqualInt(2, archive_entry_nlink(ae)); assertEqualInt(8, archive_entry_size(ae)); @@ -400,15 +399,15 @@ DEFINE_TEST(test_write_format_iso9660) assertEqualMem(buff2, "12345678", 8); /* - * Read "file" + * Read "hardlnk" */ assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); assertEqualInt(2, archive_entry_atime(ae)); assertEqualInt(3, archive_entry_birthtime(ae)); assertEqualInt(4, archive_entry_ctime(ae)); assertEqualInt(5, archive_entry_mtime(ae)); - assertEqualString("file", archive_entry_pathname(ae)); - assertEqualString("hardlnk", archive_entry_hardlink(ae)); + assertEqualString("hardlnk", archive_entry_pathname(ae)); + assertEqualString("file", archive_entry_hardlink(ae)); assert((AE_IFREG | 0555) == archive_entry_mode(ae)); assertEqualInt(2, archive_entry_nlink(ae)); assertEqualInt(0, archive_entry_size(ae)); @@ -982,13 +981,13 @@ DEFINE_TEST(test_write_format_iso9660) assertEqualInt(2048, archive_entry_size(ae)); /* - * Read "hardlink" + * Read "file" */ assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); assertEqualInt(5, archive_entry_atime(ae)); assertEqualInt(5, archive_entry_ctime(ae)); assertEqualInt(5, archive_entry_mtime(ae)); - assertEqualString("HARDLNK", archive_entry_pathname(ae)); + assertEqualString("FILE", archive_entry_pathname(ae)); assertEqualString(NULL, archive_entry_hardlink(ae)); assert((AE_IFREG | 0400) == archive_entry_mode(ae)); assertEqualInt(8, archive_entry_size(ae)); @@ -996,15 +995,15 @@ DEFINE_TEST(test_write_format_iso9660) assertEqualMem(buff2, "12345678", 8); /* - * Read "file" + * Read "hardlnk" */ assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); assertEqualInt(5, archive_entry_atime(ae)); assertEqualInt(0, archive_entry_birthtime(ae)); assertEqualInt(5, archive_entry_ctime(ae)); assertEqualInt(5, archive_entry_mtime(ae)); - assertEqualString("FILE", archive_entry_pathname(ae)); - assertEqualString("HARDLNK", archive_entry_hardlink(ae)); + assertEqualString("HARDLNK", archive_entry_pathname(ae)); + assertEqualString("FILE", archive_entry_hardlink(ae)); assert((AE_IFREG | 0400) == archive_entry_mode(ae)); assertEqualInt(2, archive_entry_nlink(ae)); assertEqualInt(0, archive_entry_size(ae)); diff --git a/libarchive/test/test_write_format_mtree.c b/libarchive/test/test_write_format_mtree.c index 5109e0920b4d..ed065f9c1340 100644 --- a/libarchive/test/test_write_format_mtree.c +++ b/libarchive/test/test_write_format_mtree.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_mtree.c 191183 2009-04-17 01:06:31Z kientzle $"); static char buff[4096]; static struct { diff --git a/libarchive/test/test_write_format_mtree_absolute_path.c b/libarchive/test/test_write_format_mtree_absolute_path.c index e3972f1f1135..0ad73792add1 100644 --- a/libarchive/test/test_write_format_mtree_absolute_path.c +++ b/libarchive/test/test_write_format_mtree_absolute_path.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); static char buff[4096]; diff --git a/libarchive/test/test_write_format_mtree_classic.c b/libarchive/test/test_write_format_mtree_classic.c index 9a75fdd71f52..f155df591895 100644 --- a/libarchive/test/test_write_format_mtree_classic.c +++ b/libarchive/test/test_write_format_mtree_classic.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); static char buff[4096]; static struct { diff --git a/libarchive/test/test_write_format_mtree_classic_indent.c b/libarchive/test/test_write_format_mtree_classic_indent.c index 6d1c54911558..187cc2be0e4b 100644 --- a/libarchive/test/test_write_format_mtree_classic_indent.c +++ b/libarchive/test/test_write_format_mtree_classic_indent.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); static char buff[4096]; static struct { diff --git a/libarchive/test/test_write_format_mtree_fflags.c b/libarchive/test/test_write_format_mtree_fflags.c index 820d86f70b3d..42a1d6522d7f 100644 --- a/libarchive/test/test_write_format_mtree_fflags.c +++ b/libarchive/test/test_write_format_mtree_fflags.c @@ -25,7 +25,7 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); + #ifdef HAVE_SYS_STAT_H #include #endif diff --git a/libarchive/test/test_write_format_mtree_no_separator.c b/libarchive/test/test_write_format_mtree_no_separator.c index faf42dd5245b..c7b64c1ba6a7 100644 --- a/libarchive/test/test_write_format_mtree_no_separator.c +++ b/libarchive/test/test_write_format_mtree_no_separator.c @@ -25,7 +25,7 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); + #ifdef HAVE_SYS_STAT_H #include #endif diff --git a/libarchive/test/test_write_format_mtree_quoted_filename.c b/libarchive/test/test_write_format_mtree_quoted_filename.c index 63e927a81ffe..aca904c83f56 100644 --- a/libarchive/test/test_write_format_mtree_quoted_filename.c +++ b/libarchive/test/test_write_format_mtree_quoted_filename.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); static char buff[4096]; diff --git a/libarchive/test/test_write_format_pax.c b/libarchive/test/test_write_format_pax.c index 4538aac8241d..625a3742c044 100644 --- a/libarchive/test/test_write_format_pax.c +++ b/libarchive/test/test_write_format_pax.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static char buff2[64]; diff --git a/libarchive/test/test_write_format_shar_empty.c b/libarchive/test/test_write_format_shar_empty.c index 13794b02bb06..b4dbce957523 100644 --- a/libarchive/test/test_write_format_shar_empty.c +++ b/libarchive/test/test_write_format_shar_empty.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_write_format_shar_empty.c,v 1.3 2008/09/01 05:38:33 kientzle Exp $"); /* * Check that an "empty" shar archive is correctly created as an empty file. diff --git a/libarchive/test/test_write_format_tar.c b/libarchive/test/test_write_format_tar.c index a5ccdc0115bf..631bfa4ed639 100644 --- a/libarchive/test/test_write_format_tar.c +++ b/libarchive/test/test_write_format_tar.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_tar.c 189308 2009-03-03 17:02:51Z kientzle $"); static char buff[1000000]; static char buff2[64]; diff --git a/libarchive/test/test_write_format_tar_empty.c b/libarchive/test/test_write_format_tar_empty.c index 7ccd435f1233..29912f3b2821 100644 --- a/libarchive/test/test_write_format_tar_empty.c +++ b/libarchive/test/test_write_format_tar_empty.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_tar_empty.c 189308 2009-03-03 17:02:51Z kientzle $"); /* * Check that an "empty" tar archive is correctly created. diff --git a/libarchive/test/test_write_format_tar_sparse.c b/libarchive/test/test_write_format_tar_sparse.c index 54ac00988e3d..1568b0eadc29 100644 --- a/libarchive/test/test_write_format_tar_sparse.c +++ b/libarchive/test/test_write_format_tar_sparse.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static char buff[1000000]; diff --git a/libarchive/test/test_write_format_tar_ustar.c b/libarchive/test/test_write_format_tar_ustar.c index 7bc38f7b57fd..d86749fd41b0 100644 --- a/libarchive/test/test_write_format_tar_ustar.c +++ b/libarchive/test/test_write_format_tar_ustar.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_tar_ustar.c 201247 2009-12-30 05:59:21Z kientzle $"); static int is_null(const char *p, size_t l) diff --git a/libarchive/test/test_write_format_tar_v7tar.c b/libarchive/test/test_write_format_tar_v7tar.c index 16909956878b..5fa5f4e21f29 100644 --- a/libarchive/test/test_write_format_tar_v7tar.c +++ b/libarchive/test/test_write_format_tar_v7tar.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static int is_null(const char *p, size_t l) diff --git a/libarchive/test/test_write_format_warc.c b/libarchive/test/test_write_format_warc.c index 3a4c2da1edf1..bb9f2388095b 100644 --- a/libarchive/test/test_write_format_warc.c +++ b/libarchive/test/test_write_format_warc.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); static void test_read(struct archive *a, char *buff, size_t used, char *filedata) { diff --git a/libarchive/test/test_write_format_warc_empty.c b/libarchive/test/test_write_format_warc_empty.c index 0bd31bd7f8cb..d66e85d33e68 100644 --- a/libarchive/test/test_write_format_warc_empty.c +++ b/libarchive/test/test_write_format_warc_empty.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_write_format_warc_empty) { diff --git a/libarchive/test/test_write_format_xar.c b/libarchive/test/test_write_format_xar.c index 02fd2c0e35a7..f1f3032912a7 100644 --- a/libarchive/test/test_write_format_xar.c +++ b/libarchive/test/test_write_format_xar.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static void test_xar(const char *option) diff --git a/libarchive/test/test_write_format_xar_empty.c b/libarchive/test/test_write_format_xar_empty.c index 97c080887e40..b3ba6994e9c9 100644 --- a/libarchive/test/test_write_format_xar_empty.c +++ b/libarchive/test/test_write_format_xar_empty.c @@ -29,7 +29,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_write_format_xar_empty) { diff --git a/libarchive/test/test_write_format_zip.c b/libarchive/test/test_write_format_zip.c index a7ca434f8ea9..54240eeb7afe 100644 --- a/libarchive/test/test_write_format_zip.c +++ b/libarchive/test/test_write_format_zip.c @@ -30,7 +30,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_zip.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * This test doesn't actually check that the zip writer is @@ -290,9 +289,11 @@ verify_contents(struct archive *a, int seeking, int content) assertEqualString("file", archive_entry_pathname(ae)); if (seeking) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); + assert(archive_entry_size_is_set(ae)); + assertEqualInt(8, archive_entry_size(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); } - assert(archive_entry_size_is_set(ae)); - assertEqualInt(8, archive_entry_size(ae)); if (content) { assertEqualIntA(a, 8, archive_read_data(a, filedata, sizeof(filedata))); @@ -308,9 +309,11 @@ verify_contents(struct archive *a, int seeking, int content) assertEqualString("file2", archive_entry_pathname(ae)); if (seeking) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); + assertEqualInt(4, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); } - assertEqualInt(4, archive_entry_size(ae)); - assert(archive_entry_size_is_set(ae)); if (content) { assertEqualIntA(a, 4, archive_read_data(a, filedata, sizeof(filedata))); @@ -374,10 +377,13 @@ verify_contents(struct archive *a, int seeking, int content) assertEqualInt(0, archive_entry_atime(ae)); assertEqualInt(0, archive_entry_ctime(ae)); assertEqualString("file_deflate", archive_entry_pathname(ae)); - if (seeking) + if (seeking) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); - assertEqualInt(8, archive_entry_size(ae)); - assert(archive_entry_size_is_set(ae)); + assertEqualInt(8, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } if (content) { assertEqualIntA(a, 8, archive_read_data(a, filedata, sizeof(filedata))); @@ -392,10 +398,13 @@ verify_contents(struct archive *a, int seeking, int content) assertEqualInt(0, archive_entry_atime(ae)); assertEqualInt(0, archive_entry_ctime(ae)); assertEqualString("file2_deflate", archive_entry_pathname(ae)); - if (seeking) + if (seeking) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); - assertEqualInt(4, archive_entry_size(ae)); - assert(archive_entry_size_is_set(ae)); + assertEqualInt(4, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } if (content) { assertEqualIntA(a, 4, archive_read_data(a, filedata, sizeof(filedata))); @@ -410,6 +419,7 @@ verify_contents(struct archive *a, int seeking, int content) assertEqualInt(0, archive_entry_ctime(ae)); assertEqualString("file3_deflate", archive_entry_pathname(ae)); if (seeking) { + assert(archive_entry_size_is_set(ae)); assertEqualInt(5, archive_entry_size(ae)); assertEqualInt(AE_IFREG | 0621, archive_entry_mode(ae)); } else { @@ -460,10 +470,13 @@ verify_contents(struct archive *a, int seeking, int content) assertEqualInt(0, archive_entry_atime(ae)); assertEqualInt(0, archive_entry_ctime(ae)); assertEqualString("file_stored", archive_entry_pathname(ae)); - if (seeking) + if (seeking) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); - assert(archive_entry_size_is_set(ae)); - assertEqualInt(8, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); + assertEqualInt(8, archive_entry_size(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } if (content) { assertEqualIntA(a, 8, archive_read_data(a, filedata, sizeof(filedata))); @@ -478,10 +491,13 @@ verify_contents(struct archive *a, int seeking, int content) assertEqualInt(0, archive_entry_atime(ae)); assertEqualInt(0, archive_entry_ctime(ae)); assertEqualString("file2_stored", archive_entry_pathname(ae)); - if (seeking) + if (seeking) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); - assertEqualInt(4, archive_entry_size(ae)); - assert(archive_entry_size_is_set(ae)); + assertEqualInt(4, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } if (content) { assertEqualIntA(a, 4, archive_read_data(a, filedata, sizeof(filedata))); diff --git a/libarchive/test/test_write_format_zip64_stream.c b/libarchive/test/test_write_format_zip64_stream.c new file mode 100644 index 000000000000..bed97894e8da --- /dev/null +++ b/libarchive/test/test_write_format_zip64_stream.c @@ -0,0 +1,276 @@ +/*- + * Copyright (c) 2003-2023 Tim Kientzle + * Copyright (c) 2008 Anselm Strauss + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test.h" + +/* + * Detailed byte-for-byte verification of the format of a zip archive + * written in streaming mode with Zip64 extensions enabled. + */ + +static unsigned long +bitcrc32(unsigned long c, void *_p, size_t s) +{ + /* This is a drop-in replacement for crc32() from zlib. + * Libarchive should be able to correctly generate + * uncompressed zip archives (including correct CRCs) even + * when zlib is unavailable, and this function helps us verify + * that. Yes, this is very, very slow and unsuitable for + * production use, but it's correct, compact, and works well + * enough for this particular usage. Libarchive internally + * uses a much more efficient implementation. */ + const unsigned char *p = _p; + int bitctr; + + if (p == NULL) + return (0); + + for (; s > 0; --s) { + c ^= *p++; + for (bitctr = 8; bitctr > 0; --bitctr) { + if (c & 1) c = (c >> 1); + else c = (c >> 1) ^ 0xedb88320; + c ^= 0x80000000; + } + } + return (c); +} + +/* Quick and dirty: Read 2-byte and 4-byte integers from Zip file. */ +static unsigned i2(const unsigned char *p) { return ((p[0] & 0xff) | ((p[1] & 0xff) << 8)); } +static unsigned i4(const unsigned char *p) { return (i2(p) | (i2(p + 2) << 16)); } +/* We're only working with small values here; ignore the 4 high bytes. */ +static unsigned i8(const unsigned char *p) { return (i4(p)); } + +DEFINE_TEST(test_write_format_zip64_stream) +{ + struct archive *a; + struct archive_entry *ae; + size_t used, buffsize = 1000000; + unsigned long crc; + unsigned long compressed_size = 0; + int file_perm = 00644; + int zip_version = 45; + int zip_compression = 8; + short file_uid = 10, file_gid = 20; + unsigned char *buff, *buffend, *p; + unsigned char *central_header, *local_header, *eocd, *eocd_record; + unsigned char *extension_start, *extension_end; + unsigned char *data_start, *data_end; + char file_data[] = {'1', '2', '3', '4', '5', '6', '7', '8'}; + const char *file_name = "file"; + +#ifndef HAVE_ZLIB_H + zip_compression = 0; +#endif + + buff = malloc(buffsize); + + /* Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:zip64")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:experimental")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_open_memory(a, buff, buffsize, &used)); + + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, file_name); + archive_entry_set_mode(ae, AE_IFREG | file_perm); + archive_entry_set_uid(ae, file_uid); + archive_entry_set_gid(ae, file_gid); + archive_entry_set_mtime(ae, 0, 0); + assertEqualInt(0, archive_write_header(a, ae)); + archive_entry_free(ae); + assertEqualInt(8, archive_write_data(a, file_data, sizeof(file_data))); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_free(a)); + buffend = buff + used; + dumpfile("constructed.zip", buff, used); + + /* Verify "End of Central Directory" record. */ + /* Get address of end-of-central-directory record. */ + eocd_record = p = buffend - 22; /* Assumes there is no zip comment field. */ + failure("End-of-central-directory begins with PK\\005\\006 signature"); + assertEqualMem(p, "PK\005\006", 4); + failure("This must be disk 0"); + assertEqualInt(i2(p + 4), 0); + failure("Central dir must start on disk 0"); + assertEqualInt(i2(p + 6), 0); + failure("All central dir entries are on this disk"); + assertEqualInt(i2(p + 8), i2(p + 10)); + eocd = buff + i4(p + 12) + i4(p + 16); + failure("no zip comment"); + assertEqualInt(i2(p + 20), 0); + + /* Get address of first entry in central directory. */ + central_header = p = buff + i4(buffend - 6); + failure("Central file record at offset %d should begin with" + " PK\\001\\002 signature", + i4(buffend - 10)); + + /* Verify file entry in central directory. */ + assertEqualMem(p, "PK\001\002", 4); /* Signature */ + assertEqualInt(i2(p + 4), 3 * 256 + zip_version); /* Version made by */ + assertEqualInt(i2(p + 6), zip_version); /* Version needed to extract */ + assertEqualInt(i2(p + 8), 8); /* Flags */ + assertEqualInt(i2(p + 10), zip_compression); /* Compression method */ + assertEqualInt(i2(p + 12), 0); /* File time */ + assertEqualInt(i2(p + 14), 33); /* File date */ + crc = bitcrc32(0, file_data, sizeof(file_data)); + assertEqualInt(i4(p + 16), crc); /* CRC-32 */ + compressed_size = i4(p + 20); /* Compressed size */ + assertEqualInt(i4(p + 24), sizeof(file_data)); /* Uncompressed size */ + assertEqualInt(i2(p + 28), strlen(file_name)); /* Pathname length */ + /* assertEqualInt(i2(p + 30), 28); */ /* Extra field length: See below */ + assertEqualInt(i2(p + 32), 0); /* File comment length */ + assertEqualInt(i2(p + 34), 0); /* Disk number start */ + assertEqualInt(i2(p + 36), 0); /* Internal file attrs */ + assertEqualInt(i4(p + 38) >> 16 & 01777, file_perm); /* External file attrs */ + assertEqualInt(i4(p + 42), 0); /* Offset of local header */ + assertEqualMem(p + 46, file_name, strlen(file_name)); /* Pathname */ + p = extension_start = central_header + 46 + strlen(file_name); + extension_end = extension_start + i2(central_header + 30); + + assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2(p + 2), 11); /* 'ux' size */ + /* TODO: verify 'ux' contents */ + p += 4 + i2(p + 2); + + assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4(p + 5), 0); /* 'UT' mtime */ + p += 4 + i2(p + 2); + + /* Note: We don't expect to see zip64 extension in the central + * directory, since the writer knows the actual full size by + * the time it is ready to write the central directory and has + * no reason to insert it then. Info-Zip seems to do the same + * thing. */ + + /* Just in case: Report any extra extensions. */ + while (p < extension_end) { + failure("Unexpected extension 0x%04X", i2(p)); + assert(0); + p += 4 + i2(p + 2); + } + + /* Should have run exactly to end of extra data. */ + assertEqualAddress(p, extension_end); + + assertEqualAddress(p, eocd); + + /* After Central dir, we find Zip64 eocd and Zip64 eocd locator. */ + assertEqualMem(p, "PK\006\006", 4); /* Zip64 eocd */ + assertEqualInt(i8(p + 4), 44); /* We're using v1 Zip64 eocd */ + assertEqualInt(i2(p + 12), 45); /* Written by Version 4.5 */ + assertEqualInt(i2(p + 14), 45); /* Needs version 4.5 to extract */ + assertEqualInt(i4(p + 16), 0); /* This is disk #0 */ + assertEqualInt(i4(p + 20), 0); /* Dir starts on disk #0 */ + assertEqualInt(i8(p + 24), 1); /* 1 entry on this disk */ + assertEqualInt(i8(p + 32), 1); /* 1 entry total */ + assertEqualInt(i8(p + 40), eocd - central_header); /* size of cd */ + assertEqualInt(i8(p + 48), central_header - buff); /* start of cd */ + p += 12 + i8(p + 4); + + assertEqualMem(p, "PK\006\007", 4); /* Zip64 eocd locator */ + assertEqualInt(i4(p + 4), 0); /* Zip64 eocd is on disk #0 */ + assertEqualInt(i8(p + 8), eocd - buff); /* Offset of Zip64 eocd */ + assertEqualInt(i4(p + 16), 1); /* 1 disk */ + p += 20; + + /* Regular EOCD immediately follows Zip64 records. */ + assertEqualAddress(p, eocd_record); + + /* Verify local header of file entry. */ + p = local_header = buff; + assertEqualMem(p, "PK\003\004", 4); /* Signature */ + assertEqualInt(i2(p + 4), zip_version); /* Version needed to extract */ + assertEqualInt(i2(p + 6), 8); /* Flags: bit 3 = length-at-end */ + assertEqualInt(i2(p + 8), zip_compression); /* Compression method */ + assertEqualInt(i2(p + 10), 0); /* File time */ + assertEqualInt(i2(p + 12), 33); /* File date */ + assertEqualInt(i4(p + 14), 0); /* CRC-32 */ + assertEqualInt(i4(p + 18), 0); /* Compressed size must be zero for length-at-end */ + assertEqualInt(i4(p + 22), 0); /* Uncompressed size must be zero for length-at-end */ + assertEqualInt(i2(p + 26), strlen(file_name)); /* Pathname length */ + assertEqualInt(i2(p + 28), 37); /* Extra field length */ + assertEqualMem(p + 30, file_name, strlen(file_name)); /* Pathname */ + p = extension_start = local_header + 30 + strlen(file_name); + extension_end = extension_start + i2(local_header + 28); + + assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2(p + 2), 11); /* 'ux' size */ + assertEqualInt(p[4], 1); /* 'ux' version */ + assertEqualInt(p[5], 4); /* 'ux' uid size */ + assertEqualInt(i4(p + 6), file_uid); /* 'Ux' UID */ + assertEqualInt(p[10], 4); /* 'ux' gid size */ + assertEqualInt(i4(p + 11), file_gid); /* 'Ux' GID */ + p += 4 + i2(p + 2); + + assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4(p + 5), 0); /* 'UT' mtime */ + p += 4 + i2(p + 2); + + assertEqualInt(i2(p), 0x6c78); /* 'xl' experimental extension header */ + assertEqualInt(i2(p + 2), 9); /* size */ + assertEqualInt(p[4], 7); /* bitmap of included fields */ + assertEqualInt(i2(p + 5) >> 8, 3); /* system & version made by */ + assertEqualInt(i2(p + 7), 0); /* internal file attributes */ + assertEqualInt(i4(p + 9) >> 16 & 01777, file_perm); /* external file attributes */ + p += 4 + i2(p + 2); + + /* Just in case: Report any extra extensions. */ + while (p < extension_end) { + failure("Unexpected extension 0x%04X", i2(p)); + assert(0); + p += 4 + i2(p + 2); + } + + /* Should have run exactly to end of extra data. */ + assertEqualAddress(p, extension_end); + data_start = p; + + /* Data descriptor should follow compressed data. */ + while (p < central_header && memcmp(p, "PK\007\010", 4) != 0) + ++p; + data_end = p; + assertEqualInt(data_end - data_start, compressed_size); + assertEqualMem(p, "PK\007\010", 4); + assertEqualInt(i4(p + 4), crc); /* CRC-32 */ + assertEqualInt(i8(p + 8), compressed_size); /* compressed size */ + assertEqualInt(i8(p + 16), sizeof(file_data)); /* uncompressed size */ + + /* Central directory should immediately follow the only entry. */ + assertEqualAddress(p + 24, central_header); + + free(buff); +} diff --git a/libarchive/test/test_write_format_zip_compression_store.c b/libarchive/test/test_write_format_zip_compression_store.c index b52d170ccea0..fc764ac7af83 100644 --- a/libarchive/test/test_write_format_zip_compression_store.c +++ b/libarchive/test/test_write_format_zip_compression_store.c @@ -28,7 +28,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_zip_no_compression.c 201247 2009-12-30 05:59:21Z kientzle $"); /* File data */ static const char file_name[] = "file"; @@ -184,7 +183,7 @@ static void verify_uncompressed_contents(const char *buff, size_t used) assertEqualInt(i4(p + 20), sizeof(file_data1) + sizeof(file_data2)); /* Compressed size */ assertEqualInt(i4(p + 24), sizeof(file_data1) + sizeof(file_data2)); /* Uncompressed size */ assertEqualInt(i2(p + 28), strlen(file_name)); /* Pathname length */ - assertEqualInt(i2(p + 30), 28); /* Extra field length */ + assertEqualInt(i2(p + 30), 24); /* Extra field length */ assertEqualInt(i2(p + 32), 0); /* File comment length */ assertEqualInt(i2(p + 34), 0); /* Disk number start */ assertEqualInt(i2(p + 36), 0); /* Internal file attrs */ @@ -192,38 +191,33 @@ static void verify_uncompressed_contents(const char *buff, size_t used) assertEqualInt(i4(p + 42), 0); /* Offset of local header */ assertEqualMem(p + 46, file_name, strlen(file_name)); /* Pathname */ p = p + 46 + strlen(file_name); - assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(p + 2), 9); /* 'UT' size */ - assertEqualInt(p[4], 3); /* 'UT' flags */ - assertEqualInt(i4(p + 5), now); /* 'UT' mtime */ - assertEqualInt(i4(p + 9), now + 3); /* 'UT' atime */ - p = p + 4 + i2(p + 2); + assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ assertEqualInt(i2(p + 2), 11); /* 'ux' size */ /* TODO */ p = p + 4 + i2(p + 2); + assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4(p + 5), now); /* 'UT' mtime */ + p = p + 4 + i2(p + 2); + /* Verify local header of file entry. */ local_header = q = buff; assertEqualMem(q, "PK\003\004", 4); /* Signature */ assertEqualInt(i2(q + 4), 10); /* Version needed to extract */ - assertEqualInt(i2(q + 6), 8); /* Flags */ + assertEqualInt(i2(q + 6), 8); /* Flags: bit 3 = length-at-end. Required because CRC32 is unknown */ assertEqualInt(i2(q + 8), 0); /* Compression method */ assertEqualInt(i2(q + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ assertEqualInt(i2(q + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ assertEqualInt(i4(q + 14), 0); /* CRC-32 */ - assertEqualInt(i4(q + 18), sizeof(file_data1) + sizeof(file_data2)); /* Compressed size */ - assertEqualInt(i4(q + 22), sizeof(file_data1) + sizeof(file_data2)); /* Uncompressed size */ + assertEqualInt(i4(q + 18), 0); /* Compressed size, must be zero because of length-at-end */ + assertEqualInt(i4(q + 22), 0); /* Uncompressed size, must be zero because of length-at-end */ assertEqualInt(i2(q + 26), strlen(file_name)); /* Pathname length */ assertEqualInt(i2(q + 28), 41); /* Extra field length */ assertEqualMem(q + 30, file_name, strlen(file_name)); /* Pathname */ extra_start = q = q + 30 + strlen(file_name); - assertEqualInt(i2(q), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(q + 2), 9); /* 'UT' size */ - assertEqualInt(q[4], 3); /* 'UT' flags */ - assertEqualInt(i4(q + 5), now); /* 'UT' mtime */ - assertEqualInt(i4(q + 9), now + 3); /* 'UT' atime */ - q = q + 4 + i2(q + 2); assertEqualInt(i2(q), 0x7875); /* 'ux' extension header */ assertEqualInt(i2(q + 2), 11); /* 'ux' size */ @@ -234,6 +228,13 @@ static void verify_uncompressed_contents(const char *buff, size_t used) assertEqualInt(i4(q + 11), file_gid); /* 'Ux' GID */ q = q + 4 + i2(q + 2); + assertEqualInt(i2(q), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(q + 2), 9); /* 'UT' size */ + assertEqualInt(q[4], 3); /* 'UT' flags */ + assertEqualInt(i4(q + 5), now); /* 'UT' mtime */ + assertEqualInt(i4(q + 9), now + 3); /* 'UT' atime */ + q = q + 4 + i2(q + 2); + assertEqualInt(i2(q), 0x6c78); /* 'xl' experimental extension header */ assertEqualInt(i2(q + 2), 9); /* size */ assertEqualInt(q[4], 7); /* Bitmap of fields included. */ @@ -270,7 +271,7 @@ static void verify_uncompressed_contents(const char *buff, size_t used) assertEqualInt(i4(p + 20), 0); /* Compressed size */ assertEqualInt(i4(p + 24), 0); /* Uncompressed size */ assertEqualInt(i2(p + 28), strlen(folder_name)); /* Pathname length */ - assertEqualInt(i2(p + 30), 28); /* Extra field length */ + assertEqualInt(i2(p + 30), 24); /* Extra field length */ assertEqualInt(i2(p + 32), 0); /* File comment length */ assertEqualInt(i2(p + 34), 0); /* Disk number start */ assertEqualInt(i2(p + 36), 0); /* Internal file attrs */ @@ -278,12 +279,7 @@ static void verify_uncompressed_contents(const char *buff, size_t used) assertEqualInt(i4(p + 42), q - buff); /* Offset of local header */ assertEqualMem(p + 46, folder_name, strlen(folder_name)); /* Pathname */ p = p + 46 + strlen(folder_name); - assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(p + 2), 9); /* 'UT' size */ - assertEqualInt(p[4], 5); /* 'UT' flags */ - assertEqualInt(i4(p + 5), now); /* 'UT' mtime */ - assertEqualInt(i4(p + 9), now + 5); /* 'UT' atime */ - p = p + 4 + i2(p + 2); + assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ assertEqualInt(i2(p + 2), 11); /* 'ux' size */ assertEqualInt(p[4], 1); /* 'ux' version */ @@ -291,7 +287,13 @@ static void verify_uncompressed_contents(const char *buff, size_t used) assertEqualInt(i4(p + 6), folder_uid); /* 'ux' UID */ assertEqualInt(p[10], 4); /* 'ux' gid size */ assertEqualInt(i4(p + 11), folder_gid); /* 'ux' GID */ - /*p = p + 4 + i2(p + 2);*/ + p = p + 4 + i2(p + 2); + + assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4(p + 5), now); /* 'UT' mtime */ + p = p + 4 + i2(p + 2); /* Verify local header of folder entry. */ local_header = q; @@ -308,12 +310,7 @@ static void verify_uncompressed_contents(const char *buff, size_t used) assertEqualInt(i2(q + 28), 41); /* Extra field length */ assertEqualMem(q + 30, folder_name, strlen(folder_name)); /* Pathname */ extra_start = q = q + 30 + strlen(folder_name); - assertEqualInt(i2(q), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(q + 2), 9); /* 'UT' size */ - assertEqualInt(q[4], 5); /* 'UT' flags */ - assertEqualInt(i4(q + 5), now); /* 'UT' mtime */ - assertEqualInt(i4(q + 9), now + 5); /* 'UT' atime */ - q = q + 4 + i2(q + 2); + assertEqualInt(i2(q), 0x7875); /* 'ux' extension header */ assertEqualInt(i2(q + 2), 11); /* 'ux' size */ assertEqualInt(q[4], 1); /* 'ux' version */ @@ -323,6 +320,13 @@ static void verify_uncompressed_contents(const char *buff, size_t used) assertEqualInt(i4(q + 11), folder_gid); /* 'ux' GID */ q = q + 4 + i2(q + 2); + assertEqualInt(i2(q), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(q + 2), 9); /* 'UT' size */ + assertEqualInt(q[4], 5); /* 'UT' flags */ + assertEqualInt(i4(q + 5), now); /* 'UT' mtime */ + assertEqualInt(i4(q + 9), now + 5); /* 'UT' atime */ + q = q + 4 + i2(q + 2); + assertEqualInt(i2(q), 0x6c78); /* 'xl' experimental extension header */ assertEqualInt(i2(q + 2), 9); /* size */ assertEqualInt(q[4], 7); /* bitmap of fields */ diff --git a/libarchive/test/test_write_format_zip_empty.c b/libarchive/test/test_write_format_zip_empty.c index 73a55731261e..410304d44120 100644 --- a/libarchive/test/test_write_format_zip_empty.c +++ b/libarchive/test/test_write_format_zip_empty.c @@ -28,7 +28,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_zip_empty.c 201247 2009-12-30 05:59:21Z kientzle $"); DEFINE_TEST(test_write_format_zip_empty) { diff --git a/libarchive/test/test_write_format_zip_empty_zip64.c b/libarchive/test/test_write_format_zip_empty_zip64.c index 8f9975b2102c..f56bf578e4cc 100644 --- a/libarchive/test/test_write_format_zip_empty_zip64.c +++ b/libarchive/test/test_write_format_zip_empty_zip64.c @@ -28,7 +28,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_zip_empty.c 201247 2009-12-30 05:59:21Z kientzle $"); DEFINE_TEST(test_write_format_zip_empty_zip64) { diff --git a/libarchive/test/test_write_format_zip_entry_size_unset.c b/libarchive/test/test_write_format_zip_entry_size_unset.c index 13b5f1b2db1a..10c191f7ce7d 100644 --- a/libarchive/test/test_write_format_zip_entry_size_unset.c +++ b/libarchive/test/test_write_format_zip_entry_size_unset.c @@ -25,7 +25,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); /* File data */ static const char file_name[] = "file"; @@ -152,7 +151,7 @@ static void verify_contents(const char *zip_buff, size_t size) /* Check file name length */ assertEqualInt(i2(central_directory + 28), strlen(file_name)); /* Check extra field length */ - assertEqualInt(i2(central_directory + 30), 20); + assertEqualInt(i2(central_directory + 30), 15); /* Check file comment length */ assertEqualInt(i2(central_directory + 32), 0); /* Check disk number where file starts */ @@ -188,7 +187,7 @@ static void verify_contents(const char *zip_buff, size_t size) /* Check pathname length */ assertEqualInt(i2(local_file_header + 26), strlen(file_name)); /* Check extra field length */ - assertEqualInt(i2(local_file_header + 28), 20); + assertEqualInt(i2(local_file_header + 28), 15); /* Check path name match */ assertEqualMem(local_file_header + 30, file_name, strlen(file_name)); @@ -210,7 +209,7 @@ static void verify_contents(const char *zip_buff, size_t size) assertEqualInt(i4(data_descriptor + 12), sizeof(file_data1) + sizeof(file_data2)); /* Get folder entry in central directory */ - const char *central_directory_folder_entry = central_directory + 46 + 20 + strlen(file_name); + const char *central_directory_folder_entry = central_directory + 46 + i2(local_file_header + 28) + strlen(file_name); /* Get start of folder entry */ const char *local_folder_header = data_descriptor + 16; @@ -234,7 +233,7 @@ static void verify_contents(const char *zip_buff, size_t size) /* Check path name length */ assertEqualInt(i2(central_directory_folder_entry + 28), strlen(folder_name)); /* Check extra field length */ - assertEqualInt(i2(central_directory_folder_entry + 30), 20); + assertEqualInt(i2(central_directory_folder_entry + 30), 15); /* Check file comment length */ assertEqualInt(i2(central_directory_folder_entry + 32), 0); /* Check disk number start */ @@ -265,11 +264,11 @@ static void verify_contents(const char *zip_buff, size_t size) /* Check path name length */ assertEqualInt(i2(local_folder_header + 26), strlen(folder_name)); /* Check extra field length */ - assertEqualInt(i2(local_folder_header + 28), 20); + assertEqualInt(i2(local_folder_header + 28), 15); /* Check path name */ assertEqualMem(local_folder_header + 30, folder_name, strlen(folder_name)); - const char *post_local_folder = local_folder_header + 30 + strlen(folder_name) + 20; + const char *post_local_folder = local_folder_header + 30 + i2(local_folder_header + 28) + strlen(folder_name); assertEqualMem(post_local_folder, central_directory, 4); } diff --git a/libarchive/test/test_write_format_zip_file.c b/libarchive/test/test_write_format_zip_file.c index 4ccc30360691..d4f1b9b22054 100644 --- a/libarchive/test/test_write_format_zip_file.c +++ b/libarchive/test/test_write_format_zip_file.c @@ -29,7 +29,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_zip.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * Detailed byte-for-byte verification of the format of a zip archive @@ -170,17 +169,17 @@ DEFINE_TEST(test_write_format_zip_file) p = extension_start = central_header + 46 + strlen(file_name); extension_end = extension_start + i2(central_header + 30); + assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2(p + 2), 11); /* 'ux' size */ + /* TODO: verify 'ux' contents */ + p += 4 + i2(p + 2); + assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ assertEqualInt(i2(p + 2), 5); /* 'UT' size */ assertEqualInt(p[4], 1); /* 'UT' flags */ assertEqualInt(i4(p + 5), t); /* 'UT' mtime */ p += 4 + i2(p + 2); - assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ - assertEqualInt(i2(p + 2), 11); /* 'ux' size */ - /* TODO: verify 'ux' contents */ - p += 4 + i2(p + 2); - /* Just in case: Report any extra extensions. */ while (p < extension_end) { failure("Unexpected extension 0x%04X", i2(p)); @@ -189,36 +188,30 @@ DEFINE_TEST(test_write_format_zip_file) } /* Should have run exactly to end of extra data. */ - assert(p == extension_end); + assertEqualAddress(p, extension_end); - assert(p == eocd); + assertEqualAddress(p, eocd); /* Regular EOCD immediately follows central directory. */ - assert(p == eocd_record); + assertEqualAddress(p, eocd_record); /* Verify local header of file entry. */ p = local_header = buff; assertEqualMem(p, "PK\003\004", 4); /* Signature */ assertEqualInt(i2(p + 4), zip_version); /* Version needed to extract */ - assertEqualInt(i2(p + 6), 8); /* Flags */ + assertEqualInt(i2(p + 6), 8); /* Flags: bit 3 = length-at-end */ assertEqualInt(i2(p + 8), zip_compression); /* Compression method */ assertEqualInt(i2(p + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ assertEqualInt(i2(p + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ - assertEqualInt(i4(p + 14), 0); /* CRC-32 */ - /* assertEqualInt(i4(p + 18), sizeof(file_data)); */ /* Compressed size */ - /* assertEqualInt(i4(p + 22), sizeof(file_data)); */ /* Uncompressed size not stored because we're using length-at-end. */ + assertEqualInt(i4(p + 14), 0); /* CRC-32 stored as zero because we're using length-at-end */ + assertEqualInt(i4(p + 18), 0); /* Compressed size stored as zero because we're using length-at-end. */ + assertEqualInt(i4(p + 22), 0); /* Uncompressed size stored as zero because we're using length-at-end. */ assertEqualInt(i2(p + 26), strlen(file_name)); /* Pathname length */ assertEqualInt(i2(p + 28), 37); /* Extra field length */ assertEqualMem(p + 30, file_name, strlen(file_name)); /* Pathname */ p = extension_start = local_header + 30 + strlen(file_name); extension_end = extension_start + i2(local_header + 28); - assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(p + 2), 5); /* size */ - assertEqualInt(p[4], 1); /* 'UT' flags */ - assertEqualInt(i4(p + 5), t); /* 'UT' mtime */ - p += 4 + i2(p + 2); - assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ assertEqualInt(i2(p + 2), 11); /* size */ assertEqualInt(p[4], 1); /* 'ux' version */ @@ -228,6 +221,12 @@ DEFINE_TEST(test_write_format_zip_file) assertEqualInt(i4(p + 11), file_gid); /* 'Ux' GID */ p += 4 + i2(p + 2); + assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(p + 2), 5); /* size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4(p + 5), t); /* 'UT' mtime */ + p += 4 + i2(p + 2); + assertEqualInt(i2(p), 0x6c78); /* 'xl' experimental extension block */ assertEqualInt(i2(p + 2), 9); /* size */ assertEqualInt(p[4], 7); /* bitmap of fields in this block */ @@ -244,18 +243,18 @@ DEFINE_TEST(test_write_format_zip_file) } /* Should have run exactly to end of extra data. */ - assert(p == extension_end); + assertEqualAddress(p, extension_end); /* Data descriptor should follow compressed data. */ while (p < central_header && memcmp(p, "PK\007\010", 4) != 0) ++p; assertEqualMem(p, "PK\007\010", 4); assertEqualInt(i4(p + 4), crc); /* CRC-32 */ - /* assertEqualInt(i4(p + 8), ???); */ /* compressed size */ + assertEqualInt(i4(p + 8), p - extension_end); /* compressed size */ assertEqualInt(i4(p + 12), sizeof(file_data)); /* uncompressed size */ /* Central directory should immediately follow the only entry. */ - assert(p + 16 == central_header); + assertEqualAddress(p + 16, central_header); free(buff); } diff --git a/libarchive/test/test_write_format_zip_file_zip64.c b/libarchive/test/test_write_format_zip_file_zip64.c index 6a00fe14c389..f06f2aad3c95 100644 --- a/libarchive/test/test_write_format_zip_file_zip64.c +++ b/libarchive/test/test_write_format_zip_file_zip64.c @@ -29,7 +29,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_zip.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * Detailed byte-for-byte verification of the format of a zip archive @@ -173,17 +172,17 @@ DEFINE_TEST(test_write_format_zip_file_zip64) p = extension_start = central_header + 46 + strlen(file_name); extension_end = extension_start + i2(central_header + 30); + assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2(p + 2), 11); /* 'ux' size */ + /* TODO: verify 'ux' contents */ + p += 4 + i2(p + 2); + assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ assertEqualInt(i2(p + 2), 5); /* 'UT' size */ assertEqualInt(p[4], 1); /* 'UT' flags */ assertEqualInt(i4(p + 5), t); /* 'UT' mtime */ p += 4 + i2(p + 2); - assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ - assertEqualInt(i2(p + 2), 11); /* 'ux' size */ - /* TODO: verify 'ux' contents */ - p += 4 + i2(p + 2); - /* Note: We don't expect to see zip64 extension in the central * directory, since the writer knows the actual full size by * the time it is ready to write the central directory and has @@ -198,9 +197,9 @@ DEFINE_TEST(test_write_format_zip_file_zip64) } /* Should have run exactly to end of extra data. */ - assert(p == extension_end); + assertEqualAddress(p, extension_end); - assert(p == eocd); + assertEqualAddress(p, eocd); /* After Central dir, we find Zip64 eocd and Zip64 eocd locator. */ assertEqualMem(p, "PK\006\006", 4); /* Zip64 eocd */ @@ -222,31 +221,25 @@ DEFINE_TEST(test_write_format_zip_file_zip64) p += 20; /* Regular EOCD immediately follows Zip64 records. */ - assert(p == eocd_record); + assertEqualAddress(p, eocd_record); /* Verify local header of file entry. */ p = local_header = buff; assertEqualMem(p, "PK\003\004", 4); /* Signature */ assertEqualInt(i2(p + 4), zip_version); /* Version needed to extract */ - assertEqualInt(i2(p + 6), 8); /* Flags */ + assertEqualInt(i2(p + 6), 8); /* Flags: bit 3 = length-at-end */ assertEqualInt(i2(p + 8), zip_compression); /* Compression method */ assertEqualInt(i2(p + 10), (tm->tm_hour * 2048) + (tm->tm_min * 32) + (tm->tm_sec / 2)); /* File time */ assertEqualInt(i2(p + 12), ((tm->tm_year - 80) * 512) + ((tm->tm_mon + 1) * 32) + tm->tm_mday); /* File date */ - assertEqualInt(i4(p + 14), 0); /* CRC-32 */ - /* assertEqualInt(i4(p + 18), sizeof(file_data)); */ /* Compressed size */ - /* assertEqualInt(i4(p + 22), sizeof(file_data)); */ /* Uncompressed size not stored because we're using length-at-end. */ + assertEqualInt(i4(p + 14), 0); /* CRC-32 must be 0 because of length-at-end */ + assertEqualInt(i4(p + 18), 0); /* Compressed size must be 0 because of length-at-end */ + assertEqualInt(i4(p + 22), 0); /* Uncompressed size must be 0 because of length-at-end. */ assertEqualInt(i2(p + 26), strlen(file_name)); /* Pathname length */ - assertEqualInt(i2(p + 28), 57); /* Extra field length */ + assertEqualInt(i2(p + 28), 37); /* Extra field length */ assertEqualMem(p + 30, file_name, strlen(file_name)); /* Pathname */ p = extension_start = local_header + 30 + strlen(file_name); extension_end = extension_start + i2(local_header + 28); - assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ - assertEqualInt(i2(p + 2), 5); /* 'UT' size */ - assertEqualInt(p[4], 1); /* 'UT' flags */ - assertEqualInt(i4(p + 5), t); /* 'UT' mtime */ - p += 4 + i2(p + 2); - assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ assertEqualInt(i2(p + 2), 11); /* 'ux' size */ assertEqualInt(p[4], 1); /* 'ux' version */ @@ -256,10 +249,10 @@ DEFINE_TEST(test_write_format_zip_file_zip64) assertEqualInt(i4(p + 11), file_gid); /* 'Ux' GID */ p += 4 + i2(p + 2); - assertEqualInt(i2(p), 0x0001); /* Zip64 extension header */ - assertEqualInt(i2(p + 2), 16); /* size */ - assertEqualInt(i8(p + 4), 8); /* uncompressed file size */ - /* compressed file size we can't verify here */ + assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4(p + 5), t); /* 'UT' mtime */ p += 4 + i2(p + 2); assertEqualInt(i2(p), 0x6c78); /* 'xl' experimental extension header */ @@ -278,18 +271,18 @@ DEFINE_TEST(test_write_format_zip_file_zip64) } /* Should have run exactly to end of extra data. */ - assert(p == extension_end); + assertEqualAddress(p, extension_end); /* Data descriptor should follow compressed data. */ while (p < central_header && memcmp(p, "PK\007\010", 4) != 0) ++p; assertEqualMem(p, "PK\007\010", 4); assertEqualInt(i4(p + 4), crc); /* CRC-32 */ - /* assertEqualInt(i8(p + 8), ???); */ /* compressed size */ + assertEqualInt(i8(p + 8), p - extension_end); /* compressed size */ assertEqualInt(i8(p + 16), sizeof(file_data)); /* uncompressed size */ /* Central directory should immediately follow the only entry. */ - assert(p + 24 == central_header); + assertEqualAddress(p + 24, central_header); free(buff); } diff --git a/libarchive/test/test_write_format_zip_large.c b/libarchive/test/test_write_format_zip_large.c index e3594c97d398..90bd16aaa581 100644 --- a/libarchive/test/test_write_format_zip_large.c +++ b/libarchive/test/test_write_format_zip_large.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #include #include @@ -273,22 +272,21 @@ static int64_t test_sizes[] = { 2 * GB - 1, 2 * GB, 2 * GB + 1, /* Test for 32-bit unsigned overflow. */ 4 * GB - 1, 4 * GB, 4 * GB + 1, - /* And beyond ... because we can. */ - 16 * GB - 1, 16 * GB, 16 * GB + 1, - 64 * GB - 1, 64 * GB, 64 * GB + 1, - 256 * GB - 1, 256 * GB, 256 * GB + 1, - 1 * TB, + /* And one larger sample */ + 5 * GB, 0 }; static void -verify_large_zip(struct archive *a, struct fileblocks *fileblocks) +verify_large_zip(struct archive *a, struct fileblocks *fileblocks, int seeking) { char namebuff[64]; struct archive_entry *ae; int i; + (void)seeking; /* UNUSED */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_set_options(a, "zip:ignorecrc32")); assertEqualIntA(a, ARCHIVE_OK, @@ -311,7 +309,13 @@ verify_large_zip(struct archive *a, struct fileblocks *fileblocks) archive_read_next_header(a, &ae)); snprintf(namebuff, sizeof(namebuff), "file_%d", i); assertEqualString(namebuff, archive_entry_pathname(ae)); - assertEqualInt(test_sizes[i], archive_entry_size(ae)); + if (seeking) { + assert(archive_entry_size_is_set(ae)); + assertEqualInt(test_sizes[i], archive_entry_size(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } + /* TODO: Read to end of data, verify length */ } assertEqualIntA(a, 0, archive_read_next_header(a, &ae)); assertEqualString("lastfile", archive_entry_pathname(ae)); @@ -345,6 +349,7 @@ DEFINE_TEST(test_write_format_zip_large) */ a = archive_write_new(); archive_write_set_format_zip(a); + /* TODO: Repeat this entire test suite with default compression */ assertEqualIntA(a, ARCHIVE_OK, archive_write_set_options(a, "zip:compression=store")); assertEqualIntA(a, ARCHIVE_OK, @@ -398,7 +403,7 @@ DEFINE_TEST(test_write_format_zip_large) a = archive_read_new(); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip_seekable(a)); - verify_large_zip(a, fileblocks); + verify_large_zip(a, fileblocks, 1); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); /* @@ -407,7 +412,7 @@ DEFINE_TEST(test_write_format_zip_large) a = archive_read_new(); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip_streamable(a)); - verify_large_zip(a, fileblocks); + verify_large_zip(a, fileblocks, 0); assertEqualInt(ARCHIVE_OK, archive_read_free(a)); /* @@ -430,7 +435,7 @@ DEFINE_TEST(test_write_format_zip_large) /* Verify regular end-of-central-directory record */ eocd = p - 22; assertEqualMem(eocd, "PK\005\006\0\0\0\0", 8); - assertEqualMem(eocd + 8, "\021\0\021\0", 4); /* 17 entries total */ + assertEqualMem(eocd + 8, "\010\0\010\0", 4); /* 8 entries total */ cd_size = le32(eocd + 12); /* Start of CD offset should be 0xffffffff */ assertEqualMem(eocd + 16, "\xff\xff\xff\xff", 4); @@ -450,8 +455,8 @@ DEFINE_TEST(test_write_format_zip_large) assertEqualMem(zip64_eocd + 14, "\055\0", 2); // Requires version: 45 assertEqualMem(zip64_eocd + 16, "\0\0\0\0", 4); // This disk assertEqualMem(zip64_eocd + 20, "\0\0\0\0", 4); // Total disks - assertEqualInt(17, le64(zip64_eocd + 24)); // Entries on this disk - assertEqualInt(17, le64(zip64_eocd + 32)); // Total entries + assertEqualInt(8, le64(zip64_eocd + 24)); // Entries on this disk + assertEqualInt(8, le64(zip64_eocd + 32)); // Total entries cd_size = le64(zip64_eocd + 40); cd_start = p - (fileblocks->filesize - le64(zip64_eocd + 48)); diff --git a/libarchive/test/test_write_format_zip_stream.c b/libarchive/test/test_write_format_zip_stream.c new file mode 100644 index 000000000000..aff6a31ae171 --- /dev/null +++ b/libarchive/test/test_write_format_zip_stream.c @@ -0,0 +1,247 @@ +/*- + * Copyright (c) 2003-2023 Tim Kientzle + * Copyright (c) 2008 Anselm Strauss + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test.h" + +/* + * Detailed byte-for-byte verification of the format of a zip archive + * written in streaming mode WITHOUT Zip64 extensions enabled. + */ + +static unsigned long +bitcrc32(unsigned long c, void *_p, size_t s) +{ + /* This is a drop-in replacement for crc32() from zlib. + * Libarchive should be able to correctly generate + * uncompressed zip archives (including correct CRCs) even + * when zlib is unavailable, and this function helps us verify + * that. Yes, this is very, very slow and unsuitable for + * production use, but it's correct, compact, and works well + * enough for this particular usage. Libarchive internally + * uses a much more efficient implementation. */ + const unsigned char *p = _p; + int bitctr; + + if (p == NULL) + return (0); + + for (; s > 0; --s) { + c ^= *p++; + for (bitctr = 8; bitctr > 0; --bitctr) { + if (c & 1) c = (c >> 1); + else c = (c >> 1) ^ 0xedb88320; + c ^= 0x80000000; + } + } + return (c); +} + +/* Quick and dirty: Read 2-byte and 4-byte integers from Zip file. */ +static unsigned i2(const unsigned char *p) { return ((p[0] & 0xff) | ((p[1] & 0xff) << 8)); } +static unsigned i4(const unsigned char *p) { return (i2(p) | (i2(p + 2) << 16)); } + +DEFINE_TEST(test_write_format_zip_stream) +{ + struct archive *a; + struct archive_entry *ae; + size_t used, buffsize = 1000000; + unsigned long crc; + unsigned long compressed_size = 0; + int file_perm = 00644; + int zip_version = 20; + int zip_compression = 8; + short file_uid = 10, file_gid = 20; + unsigned char *buff, *buffend, *p; + unsigned char *central_header, *local_header, *eocd, *eocd_record; + unsigned char *extension_start, *extension_end; + unsigned char *data_start, *data_end; + char file_data[] = {'1', '2', '3', '4', '5', '6', '7', '8'}; + const char *file_name = "file"; + +#ifndef HAVE_ZLIB_H + zip_compression = 0; +#endif + + buff = malloc(buffsize); + + /* Create a new archive in memory. */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_zip(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_set_options(a, "zip:!zip64")); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_open_memory(a, buff, buffsize, &used)); + + assert((ae = archive_entry_new()) != NULL); + archive_entry_copy_pathname(ae, file_name); + archive_entry_set_mode(ae, AE_IFREG | file_perm); + archive_entry_set_uid(ae, file_uid); + archive_entry_set_gid(ae, file_gid); + archive_entry_set_mtime(ae, 0, 0); + assertEqualInt(0, archive_write_header(a, ae)); + archive_entry_free(ae); + assertEqualInt(8, archive_write_data(a, file_data, sizeof(file_data))); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_free(a)); + buffend = buff + used; + dumpfile("constructed.zip", buff, used); + + /* Verify "End of Central Directory" record. */ + /* Get address of end-of-central-directory record. */ + eocd_record = p = buffend - 22; /* Assumes there is no zip comment field. */ + failure("End-of-central-directory begins with PK\\005\\006 signature"); + assertEqualMem(p, "PK\005\006", 4); + failure("This must be disk 0"); + assertEqualInt(i2(p + 4), 0); + failure("Central dir must start on disk 0"); + assertEqualInt(i2(p + 6), 0); + failure("All central dir entries are on this disk"); + assertEqualInt(i2(p + 8), i2(p + 10)); + eocd = buff + i4(p + 12) + i4(p + 16); + failure("no zip comment"); + assertEqualInt(i2(p + 20), 0); + + /* Get address of first entry in central directory. */ + central_header = p = buff + i4(buffend - 6); + failure("Central file record at offset %d should begin with" + " PK\\001\\002 signature", + i4(buffend - 10)); + + /* Verify file entry in central directory. */ + assertEqualMem(p, "PK\001\002", 4); /* Signature */ + assertEqualInt(i2(p + 4), 3 * 256 + zip_version); /* Version made by */ + assertEqualInt(i2(p + 6), zip_version); /* Version needed to extract */ + assertEqualInt(i2(p + 8), 8); /* Flags */ + assertEqualInt(i2(p + 10), zip_compression); /* Compression method */ + assertEqualInt(i2(p + 12), 0); /* File time */ + assertEqualInt(i2(p + 14), 33); /* File date */ + crc = bitcrc32(0, file_data, sizeof(file_data)); + assertEqualInt(i4(p + 16), crc); /* CRC-32 */ + compressed_size = i4(p + 20); /* Compressed size */ + assertEqualInt(i4(p + 24), sizeof(file_data)); /* Uncompressed size */ + assertEqualInt(i2(p + 28), strlen(file_name)); /* Pathname length */ + /* assertEqualInt(i2(p + 30), 28); */ /* Extra field length: See below */ + assertEqualInt(i2(p + 32), 0); /* File comment length */ + assertEqualInt(i2(p + 34), 0); /* Disk number start */ + assertEqualInt(i2(p + 36), 0); /* Internal file attrs */ + assertEqualInt(i4(p + 38) >> 16 & 01777, file_perm); /* External file attrs */ + assertEqualInt(i4(p + 42), 0); /* Offset of local header */ + assertEqualMem(p + 46, file_name, strlen(file_name)); /* Pathname */ + p = extension_start = central_header + 46 + strlen(file_name); + extension_end = extension_start + i2(central_header + 30); + + assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2(p + 2), 11); /* 'ux' size */ + assertEqualInt(p[4], 1); /* 'ux' version */ + assertEqualInt(p[5], 4); /* 'ux' uid size */ + assertEqualInt(i4(p + 6), file_uid); /* 'Ux' UID */ + assertEqualInt(p[10], 4); /* 'ux' gid size */ + assertEqualInt(i4(p + 11), file_gid); /* 'Ux' GID */ + p += 4 + i2(p + 2); + + assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4(p + 5), 0); /* 'UT' mtime */ + p += 4 + i2(p + 2); + + /* Note: We don't expect to see zip64 extension in the central + * directory, since the writer knows the actual full size by + * the time it is ready to write the central directory and has + * no reason to insert it then. Info-Zip seems to do the same + * thing. */ + + /* Just in case: Report any extra extensions. */ + while (p < extension_end) { + failure("Unexpected extension 0x%04X", i2(p)); + assert(0); + p += 4 + i2(p + 2); + } + + /* Should have run exactly to end of extra data. */ + assert(p == extension_end); + + assert(p == eocd); + assert(p == eocd_record); + + /* Verify local header of file entry. */ + p = local_header = buff; + assertEqualMem(p, "PK\003\004", 4); /* Signature */ + assertEqualInt(i2(p + 4), zip_version); /* Version needed to extract */ + assertEqualInt(i2(p + 6), 8); /* Flags */ + assertEqualInt(i2(p + 8), zip_compression); /* Compression method */ + assertEqualInt(i2(p + 10), 0); /* File time */ + assertEqualInt(i2(p + 12), 33); /* File date */ + assertEqualInt(i4(p + 14), 0); /* CRC-32 */ + assertEqualInt(i4(p + 18), 0); /* Compressed size */ + assertEqualInt(i4(p + 22), 0); /* Uncompressed size */ + assertEqualInt(i2(p + 26), strlen(file_name)); /* Pathname length */ + assertEqualInt(i2(p + 28), 24); /* Extra field length */ + assertEqualMem(p + 30, file_name, strlen(file_name)); /* Pathname */ + p = extension_start = local_header + 30 + strlen(file_name); + extension_end = extension_start + i2(local_header + 28); + + assertEqualInt(i2(p), 0x7875); /* 'ux' extension header */ + assertEqualInt(i2(p + 2), 11); /* 'ux' size */ + assertEqualInt(p[4], 1); /* 'ux' version */ + assertEqualInt(p[5], 4); /* 'ux' uid size */ + assertEqualInt(i4(p + 6), file_uid); /* 'Ux' UID */ + assertEqualInt(p[10], 4); /* 'ux' gid size */ + assertEqualInt(i4(p + 11), file_gid); /* 'Ux' GID */ + p += 4 + i2(p + 2); + + assertEqualInt(i2(p), 0x5455); /* 'UT' extension header */ + assertEqualInt(i2(p + 2), 5); /* 'UT' size */ + assertEqualInt(p[4], 1); /* 'UT' flags */ + assertEqualInt(i4(p + 5), 0); /* 'UT' mtime */ + p += 4 + i2(p + 2); + + /* Just in case: Report any extra extensions. */ + while (p < extension_end) { + failure("Unexpected extension 0x%04X", i2(p)); + assert(0); + p += 4 + i2(p + 2); + } + + /* Should have run exactly to end of extra data. */ + assert(p == extension_end); + data_start = p; + + /* Data descriptor should follow compressed data. */ + while (p < central_header && memcmp(p, "PK\007\010", 4) != 0) + ++p; + data_end = p; + assertEqualInt(data_end - data_start, compressed_size); + assertEqualMem(p, "PK\007\010", 4); + assertEqualInt(i4(p + 4), crc); /* CRC-32 */ + assertEqualInt(i4(p + 8), compressed_size); /* compressed size */ + assertEqualInt(i4(p + 12), sizeof(file_data)); /* uncompressed size */ + + /* Central directory should immediately follow the data descriptor. */ + assert(p + 16 == central_header); + + free(buff); +} diff --git a/libarchive/test/test_write_format_zip_zip64.c b/libarchive/test/test_write_format_zip_zip64.c index c5f00a2e5d8d..259cdc47d3ae 100644 --- a/libarchive/test/test_write_format_zip_zip64.c +++ b/libarchive/test/test_write_format_zip_zip64.c @@ -24,7 +24,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD$"); static void verify_zip_filesize(uint64_t size, int expected) diff --git a/libarchive/test/test_write_open_memory.c b/libarchive/test/test_write_open_memory.c index 3dbed113e799..2ebe01e413e6 100644 --- a/libarchive/test/test_write_open_memory.c +++ b/libarchive/test/test_write_open_memory.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_open_memory.c 189308 2009-03-03 17:02:51Z kientzle $"); /* Try to force archive_write_open_memory.c to write past the end of an array. */ static unsigned char buff[16384]; diff --git a/libarchive/test/test_write_read_format_zip.c b/libarchive/test/test_write_read_format_zip.c index 4f39489b5b53..828b092c7b3f 100644 --- a/libarchive/test/test_write_read_format_zip.c +++ b/libarchive/test/test_write_read_format_zip.c @@ -29,7 +29,6 @@ */ #include "test.h" -__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_format_zip.c 201247 2009-12-30 05:59:21Z kientzle $"); /* * These tests verify that our reader can read files @@ -288,8 +287,12 @@ verify_contents(struct archive *a, int seeking, int improved_streaming) if (seeking || improved_streaming) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); } - assertEqualInt(8, archive_entry_size(ae)); - assert(archive_entry_size_is_set(ae)); + if (seeking) { + assertEqualInt(8, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } assertEqualIntA(a, 8, archive_read_data(a, filedata, sizeof(filedata))); assertEqualMem(filedata, "12345678", 8); @@ -305,8 +308,12 @@ verify_contents(struct archive *a, int seeking, int improved_streaming) if (seeking || improved_streaming) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); } - assertEqualInt(4, archive_entry_size(ae)); - assert(archive_entry_size_is_set(ae)); + if (seeking) { + assertEqualInt(4, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } assertEqualIntA(a, 4, archive_read_data(a, filedata, sizeof(filedata))); assertEqualMem(filedata, "1234", 4); @@ -323,6 +330,7 @@ verify_contents(struct archive *a, int seeking, int improved_streaming) } if (seeking) { assertEqualInt(5, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); } else { assertEqualInt(0, archive_entry_size_is_set(ae)); } @@ -356,8 +364,9 @@ verify_contents(struct archive *a, int seeking, int improved_streaming) assertEqualInt(0, archive_entry_atime(ae)); assertEqualInt(0, archive_entry_ctime(ae)); assertEqualString("dir/", archive_entry_pathname(ae)); - if (seeking || improved_streaming) + if (seeking || improved_streaming) { assertEqualInt(AE_IFDIR | 0755, archive_entry_mode(ae)); + } assertEqualInt(0, archive_entry_size(ae)); assert(archive_entry_size_is_set(ae)); assertEqualIntA(a, 0, archive_read_data(a, filedata, 10)); @@ -378,8 +387,12 @@ verify_contents(struct archive *a, int seeking, int improved_streaming) if (seeking || improved_streaming) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); } - assertEqualInt(8, archive_entry_size(ae)); - assert(archive_entry_size_is_set(ae)); + if (seeking) { + assertEqualInt(8, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } assertEqualIntA(a, 8, archive_read_data(a, filedata, sizeof(filedata))); assertEqualMem(filedata, "12345678", 8); @@ -395,8 +408,12 @@ verify_contents(struct archive *a, int seeking, int improved_streaming) if (seeking || improved_streaming) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); } - assertEqualInt(4, archive_entry_size(ae)); - assert(archive_entry_size_is_set(ae)); + if (seeking) { + assertEqualInt(4, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } assertEqualIntA(a, 4, archive_read_data(a, filedata, sizeof(filedata))); assertEqualMem(filedata, "1234", 4); @@ -413,6 +430,7 @@ verify_contents(struct archive *a, int seeking, int improved_streaming) } if (seeking) { assertEqualInt(5, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); } else { assertEqualInt(0, archive_entry_size_is_set(ae)); } @@ -468,9 +486,12 @@ verify_contents(struct archive *a, int seeking, int improved_streaming) if (seeking || improved_streaming) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); } - assert(archive_entry_size_is_set(ae)); - assert(archive_entry_size_is_set(ae)); - assertEqualInt(8, archive_entry_size(ae)); + if (seeking) { + assert(archive_entry_size_is_set(ae)); + assertEqualInt(8, archive_entry_size(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } assertEqualIntA(a, 8, archive_read_data(a, filedata, sizeof(filedata))); assertEqualMem(filedata, "12345678", 8); @@ -486,8 +507,12 @@ verify_contents(struct archive *a, int seeking, int improved_streaming) if (seeking || improved_streaming) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); } - assertEqualInt(4, archive_entry_size(ae)); - assert(archive_entry_size_is_set(ae)); + if (seeking) { + assertEqualInt(4, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); + } else { + assertEqualInt(0, archive_entry_size_is_set(ae)); + } assertEqualIntA(a, 4, archive_read_data(a, filedata, sizeof(filedata))); assertEqualMem(filedata, "ACEG", 4); @@ -503,6 +528,7 @@ verify_contents(struct archive *a, int seeking, int improved_streaming) assertEqualInt(AE_IFREG | 0621, archive_entry_mode(ae)); if (seeking) { assertEqualInt(5, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); } else { assertEqualInt(0, archive_entry_size_is_set(ae)); } diff --git a/libarchive/test/test_xattr_platform.c b/libarchive/test/test_xattr_platform.c index df3f81a5b3fd..3f16cac34154 100644 --- a/libarchive/test/test_xattr_platform.c +++ b/libarchive/test/test_xattr_platform.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_xattr_platform) { diff --git a/libarchive/test/test_zip_filename_encoding.c b/libarchive/test/test_zip_filename_encoding.c index 54cd00630b8e..448fb9b1d4ef 100644 --- a/libarchive/test/test_zip_filename_encoding.c +++ b/libarchive/test/test_zip_filename_encoding.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #include @@ -71,7 +70,9 @@ DEFINE_TEST(test_zip_filename_encoding_UTF8) /* * Verify that UTF-8 filenames are correctly stored without * hdrcharset=UTF-8 option. + * Skip on Windows where we default to OEMCP */ +#if !defined(_WIN32) || defined(__CYGWIN__) a = archive_write_new(); assertEqualInt(ARCHIVE_OK, archive_write_set_format_zip(a)); assertEqualInt(ARCHIVE_OK, @@ -90,6 +91,7 @@ DEFINE_TEST(test_zip_filename_encoding_UTF8) * which indicates the filename charset is UTF-8. */ assertEqualInt(0x08, buff[7]); assertEqualMem(buff + 30, "\xD0\xBF\xD1\x80\xD0\xB8", 6); +#endif /* * Verify that A bit 11 of general purpose flag is not set diff --git a/libarchive_fe/err.c b/libarchive_fe/err.c index 8c860350bc3e..f6dcf44af347 100644 --- a/libarchive_fe/err.c +++ b/libarchive_fe/err.c @@ -25,8 +25,6 @@ */ #include "lafe_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_STDARG_H #include #endif diff --git a/libarchive_fe/err.h b/libarchive_fe/err.h index c663103b0b44..bd9281539693 100644 --- a/libarchive_fe/err.h +++ b/libarchive_fe/err.h @@ -27,10 +27,12 @@ #define LAFE_ERR_H #if defined(__GNUC__) && (__GNUC__ > 2 || \ - (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) -#define __LA_DEAD __attribute__((__noreturn__)) + (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) +#define __LA_NORETURN __attribute__((__noreturn__)) +#elif defined(_MSC_VER) +#define __LA_NORETURN __declspec(noreturn) #else -#define __LA_DEAD +#define __LA_NORETURN #endif #if defined(__GNUC__) && (__GNUC__ > 2 || \ @@ -46,8 +48,7 @@ #endif void lafe_warnc(int code, const char *fmt, ...) __LA_PRINTFLIKE(2, 3); -void lafe_errc(int eval, int code, const char *fmt, ...) __LA_DEAD - __LA_PRINTFLIKE(3, 4); +__LA_NORETURN void lafe_errc(int eval, int code, const char *fmt, ...) __LA_PRINTFLIKE(3, 4); const char * lafe_getprogname(void); void lafe_setprogname(const char *name, const char *defaultname); diff --git a/libarchive_fe/lafe_platform.h b/libarchive_fe/lafe_platform.h index 557124b9f841..6de8f898a22f 100644 --- a/libarchive_fe/lafe_platform.h +++ b/libarchive_fe/lafe_platform.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/usr.bin/cpio/cpio_platform.h,v 1.2 2008/12/06 07:15:42 kientzle Exp $ */ /* @@ -42,14 +40,4 @@ #include "config.h" #endif -/* Get a real definition for __FBSDID if we can */ -#if HAVE_SYS_CDEFS_H -#include -#endif - -/* If not, define it so as to avoid dangling semicolons. */ -#ifndef __FBSDID -#define __FBSDID(a) struct _undefined_hack -#endif - #endif diff --git a/libarchive_fe/line_reader.c b/libarchive_fe/line_reader.c index c7c4694eeb82..7f0429ece3cf 100644 --- a/libarchive_fe/line_reader.c +++ b/libarchive_fe/line_reader.c @@ -26,8 +26,6 @@ */ #include "lafe_platform.h" -__FBSDID("$FreeBSD$"); - #include #include #include diff --git a/libarchive_fe/passphrase.c b/libarchive_fe/passphrase.c index 1cae6a7bc80a..9d95d527067b 100644 --- a/libarchive_fe/passphrase.c +++ b/libarchive_fe/passphrase.c @@ -50,8 +50,6 @@ #include "lafe_platform.h" -__FBSDID("$FreeBSD$"); - #include #ifdef HAVE_STDLIB_H #include @@ -331,7 +329,7 @@ lafe_readpassphrase(const char *prompt, char *buf, size_t bufsiz) break; default: lafe_errc(1, errno, "Couldn't read passphrase"); - break; + /* NOTREACHED */ } } return (p); diff --git a/tar/bsdtar.1 b/tar/bsdtar.1 index 1b78fbc04943..e570d2a48a01 100644 --- a/tar/bsdtar.1 +++ b/tar/bsdtar.1 @@ -23,9 +23,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" -.Dd December 1, 2022 +.Dd March 1, 2024 .Dt TAR 1 .Os .Sh NAME @@ -274,6 +272,15 @@ will be used instead. On create, this sets the group name that will be stored in the archive; the name will not be verified against the system group database. +.It Fl Fl group Ar name Ns Op : Ns Ar gid +Use the provided group, if +.Ar gid +is not provided, +.Ar name +can be either a group name or numeric id. +See the +.Fl Fl gname +option for details. .It Fl H (c and r modes only) Symbolic links named on the command line will be followed; the @@ -403,6 +410,8 @@ This is the reverse of and the default behavior in c, r, and u modes or if .Nm is run in x mode as root. +Currently supported only for pax formats +(including "pax restricted", the default tar format for bsdtar.) .It Fl n , Fl Fl norecurse , Fl Fl no-recursion Do not operate recursively on the content of directories. .It Fl Fl newer Ar date @@ -646,16 +655,56 @@ use as many threads as there are CPU cores on the system. .It Cm zstd:frame-per-file Start a new compression frame at the beginning of each file in the archive. -.It Cm zstd:min-frame-size Ns = Ns Ar N +.It Cm zstd:min-frame-in Ns = Ns Ar N In combination with .Cm zstd:frame-per-file , -do not start a new compression frame unless the current frame is at least +do not start a new compression frame unless the uncompressed size of +the current frame is at least .Ar N bytes. -.It Cm zstd:max-frame-size Ns = Ns Ar N -Start a new compression frame as soon as the current frame exceeds +The number may be followed by +.Li k / Li kB , +.Li M / Li MB , +or +.Li G / Li GB +to indicate kilobytes, megabytes or gigabytes respectively. +.It Cm zstd:min-frame-out Ns = Ns Ar N , Cm zstd:min-frame-size Ns = Ns Ar N +In combination with +.Cm zstd:frame-per-file , +do not start a new compression frame unless the compressed size of the +current frame is at least .Ar N bytes. +The number may be followed by +.Li k / Li kB , +.Li M / Li MB , +or +.Li G / Li GB +to indicate kilobytes, megabytes or gigabytes respectively. +.It Cm zstd:max-frame-in Ns = Ns Ar N , Cm zstd:max-frame-size Ns = Ns Ar N +Start a new compression frame as soon as possible after the +uncompressed size of the current frame exceeds +.Ar N +bytes. +The number may be followed by +.Li k / Li kB , +.Li M / Li MB , +or +.Li G / Li GB +to indicate kilobytes, megabytes or gigabytes respectively. +Values less than 1,024 will be rejected. +.It Cm zstd:max-frame-out Ns = Ns Ar N +Start a new compression frame as soon as possible after the compressed +size of the current frame exceeds +.Ar N +bytes. +The number may be followed by +.Li k / Li kB , +.Li M / Li MB , +or +.Li G / Li GB +to indicate kilobytes, megabytes or gigabytes respectively. +Values less than 1,024 will be rejected. .It Cm lzop:compression-level A decimal integer from 1 to 9 specifying the lzop compression level. .It Cm xz:compression-level @@ -774,7 +823,7 @@ This works similar to the conv=sparse option of dd. Modify file or archive member names according to .Pa pattern . The pattern has the format -.Ar /old/new/ Ns Op ghHprRsS +.Ar /old/new/ Ns Op bghHprRsS where .Ar old is a basic regular expression, @@ -796,6 +845,9 @@ of symbolic links. The optional trailing p specifies that after a successful substitution the original path name and the new path name should be printed to standard error. +The optional trailing b specifies that the substitution should be +matched from the beginning of the string rather than from right after the +position at which the previous matching substitution ended. Optional trailing H, R, or S characters suppress substitutions for hardlink targets, regular filenames, or symlink targets, respectively. @@ -901,6 +953,15 @@ the name is not verified against the system user database. Pipe the input (in x or t mode) or the output (in c mode) through .Pa program instead of using the builtin compression support. +.It Fl Fl owner Ar name Ns Op : Ns Ar uid +Use the provided user, if +.Ar uid +is not provided, +.Ar name +can be either an username or numeric id. +See the +.Fl Fl uname +option for details. .It Fl v , Fl Fl verbose Produce verbose output. In create and extract modes, diff --git a/tar/bsdtar.c b/tar/bsdtar.c index 75249d1052c3..b070e0faeb66 100644 --- a/tar/bsdtar.c +++ b/tar/bsdtar.c @@ -24,7 +24,6 @@ */ #include "bsdtar_platform.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/bsdtar.c,v 1.93 2008/11/08 04:43:24 kientzle Exp $"); #ifdef HAVE_SYS_PARAM_H #include @@ -114,11 +113,11 @@ need_report(void) } #endif -static void long_help(void) __LA_DEAD; +static __LA_NORETURN void long_help(void); static void only_mode(struct bsdtar *, const char *opt, const char *valid); static void set_mode(struct bsdtar *, char opt); -static void version(void) __LA_DEAD; +static __LA_NORETURN void version(void); /* A basic set of security flags to request from libarchive. */ #define SECURITY \ @@ -155,7 +154,7 @@ main(int argc, char **argv) char compression, compression2; const char *compression_name, *compression2_name; const char *compress_program; - char *tptr; + char *tptr, *uptr; char possible_help_request; char buff[16]; @@ -382,6 +381,36 @@ main(int argc, char **argv) case OPTION_GNAME: /* cpio */ bsdtar->gname = bsdtar->argument; break; + case OPTION_GROUP: /* GNU tar */ + errno = 0; + tptr = NULL; + + uptr = strchr(bsdtar->argument, ':'); + if(uptr != NULL) { + if(uptr[1] == 0) { + lafe_errc(1, 0, "Invalid argument to --group (missing id after :)"); + } + uptr[0] = 0; + uptr++; + t = (int)strtol(uptr, &tptr, 10); + if (errno || t < 0 || *uptr == '\0' || + tptr == NULL || *tptr != '\0') { + lafe_errc(1, 0, "Invalid argument to --group (%s is not a number)", uptr); + } else { + bsdtar->gid = t; + } + bsdtar->gname = bsdtar->argument; + } else { + t = (int)strtol(bsdtar->argument, &tptr, 10); + if (errno || t < 0 || *(bsdtar->argument) == '\0' || + tptr == NULL || *tptr != '\0') { + bsdtar->gname = bsdtar->argument; + } else { + bsdtar->gid = t; + bsdtar->gname = ""; + } + } + break; case OPTION_GRZIP: if (compression != '\0') lafe_errc(1, 0, @@ -400,8 +429,7 @@ main(int argc, char **argv) break; case OPTION_HELP: /* GNU tar, others */ long_help(); - exit(0); - break; + /* NOTREACHED*/ case OPTION_HFS_COMPRESSION: /* Mac OS X v10.6 or later */ bsdtar->extract_flags |= ARCHIVE_EXTRACT_HFS_COMPRESSION_FORCED; @@ -626,8 +654,43 @@ main(int argc, char **argv) ARCHIVE_READDISK_NO_TRAVERSE_MOUNTS; break; case OPTION_OPTIONS: + if (bsdtar->option_options != NULL) { + lafe_warnc(0, + "Ignoring previous option '%s', separate multiple options with commas", + bsdtar->option_options); + } bsdtar->option_options = bsdtar->argument; break; + case OPTION_OWNER: /* GNU tar */ + errno = 0; + tptr = NULL; + + uptr = strchr(bsdtar->argument, ':'); + if(uptr != NULL) { + if(uptr[1] == 0) { + lafe_errc(1, 0, "Invalid argument to --owner (missing id after :)"); + } + uptr[0] = 0; + uptr++; + t = (int)strtol(uptr, &tptr, 10); + if (errno || t < 0 || *uptr == '\0' || + tptr == NULL || *tptr != '\0') { + lafe_errc(1, 0, "Invalid argument to --owner (%s is not a number)", uptr); + } else { + bsdtar->uid = t; + } + bsdtar->uname = bsdtar->argument; + } else { + t = (int)strtol(bsdtar->argument, &tptr, 10); + if (errno || t < 0 || *(bsdtar->argument) == '\0' || + tptr == NULL || *tptr != '\0') { + bsdtar->uname = bsdtar->argument; + } else { + bsdtar->uid = t; + bsdtar->uname = ""; + } + } + break; #if 0 /* * The common BSD -P option is not necessary, since @@ -670,7 +733,7 @@ main(int argc, char **argv) bsdtar->extract_flags |= ARCHIVE_EXTRACT_SPARSE; break; case 's': /* NetBSD pax-as-tar */ -#if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) +#if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) || defined(HAVE_PCRE2POSIX_H) add_substitution(bsdtar, bsdtar->argument); #else lafe_warnc(0, @@ -738,7 +801,7 @@ main(int argc, char **argv) break; case OPTION_VERSION: /* GNU convention */ version(); - break; + /* NOTREACHED */ #if 0 /* * The -W longopt feature is handled inside of @@ -804,7 +867,6 @@ main(int argc, char **argv) /* If no "real" mode was specified, treat -h as --help. */ if ((bsdtar->mode == '\0') && possible_help_request) { long_help(); - exit(0); } /* Otherwise, a mode is required. */ @@ -950,7 +1012,7 @@ main(int argc, char **argv) } archive_match_free(bsdtar->matching); -#if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) +#if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) || defined(HAVE_PCRE2POSIX_H) cleanup_substitution(bsdtar); #endif cset_free(bsdtar->cset); diff --git a/tar/bsdtar.h b/tar/bsdtar.h index 8f9f79ab176e..22056c7920c4 100644 --- a/tar/bsdtar.h +++ b/tar/bsdtar.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/usr.bin/tar/bsdtar.h,v 1.37 2008/12/06 07:37:14 kientzle Exp $ */ #ifndef BSDTAR_H_INCLUDED @@ -145,6 +143,7 @@ enum { OPTION_FORMAT, OPTION_GID, OPTION_GNAME, + OPTION_GROUP, OPTION_GRZIP, OPTION_HELP, OPTION_HFS_COMPRESSION, @@ -179,6 +178,7 @@ enum { OPTION_OLDER_MTIME_THAN, OPTION_ONE_FILE_SYSTEM, OPTION_OPTIONS, + OPTION_OWNER, OPTION_PASSPHRASE, OPTION_POSIX, OPTION_READ_SPARSE, @@ -208,10 +208,10 @@ void tar_mode_r(struct bsdtar *bsdtar); void tar_mode_t(struct bsdtar *bsdtar); void tar_mode_u(struct bsdtar *bsdtar); void tar_mode_x(struct bsdtar *bsdtar); -void usage(void) __LA_DEAD; +__LA_NORETURN void usage(void); int yes(const char *fmt, ...) __LA_PRINTF(1, 2); -#if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) +#if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) || defined(HAVE_PCRE2POSIX_H) void add_substitution(struct bsdtar *, const char *); int apply_substitution(struct bsdtar *, const char *, char **, int, int); void cleanup_substitution(struct bsdtar *); diff --git a/tar/bsdtar_platform.h b/tar/bsdtar_platform.h index e73f9828b3b0..a4f37d95e9b3 100644 --- a/tar/bsdtar_platform.h +++ b/tar/bsdtar_platform.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/usr.bin/tar/bsdtar_platform.h,v 1.26 2008/12/06 07:37:14 kientzle Exp $ */ /* @@ -46,16 +44,6 @@ #include "bsdtar_windows.h" #endif -/* Get a real definition for __FBSDID if we can */ -#if HAVE_SYS_CDEFS_H -#include -#endif - -/* If not, define it so as to avoid dangling semicolons. */ -#ifndef __FBSDID -#define __FBSDID(a) struct _undefined_hack -#endif - #ifdef HAVE_LIBARCHIVE /* If we're using the platform libarchive, include system headers. */ #include @@ -121,12 +109,14 @@ /* How to mark functions that don't return. */ /* This facilitates use of some newer static code analysis tools. */ -#undef __LA_DEAD +#undef __LA_NORETURN #if defined(__GNUC__) && (__GNUC__ > 2 || \ - (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) -#define __LA_DEAD __attribute__((__noreturn__)) -#else -#define __LA_DEAD + (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) +#define __LA_NORETURN __attribute__((__noreturn__)) +#elif defined(_MSC_VER) +#define __LA_NORETURN __declspec(noreturn) +#else +#define __LA_NORETURN #endif #endif /* !BSDTAR_PLATFORM_H_INCLUDED */ diff --git a/tar/bsdtar_windows.c b/tar/bsdtar_windows.c index 41ce6eb78c8b..b40fea776d2e 100644 --- a/tar/bsdtar_windows.c +++ b/tar/bsdtar_windows.c @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #if defined(_WIN32) && !defined(__CYGWIN__) diff --git a/tar/bsdtar_windows.h b/tar/bsdtar_windows.h index 308ad1107bef..7ca649c2587e 100644 --- a/tar/bsdtar_windows.h +++ b/tar/bsdtar_windows.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #ifndef BSDTAR_WINDOWS_H diff --git a/tar/cmdline.c b/tar/cmdline.c index d49e5b0d16e7..72292e8f27f3 100644 --- a/tar/cmdline.c +++ b/tar/cmdline.c @@ -28,7 +28,6 @@ */ #include "bsdtar_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_ERRNO_H #include @@ -94,6 +93,7 @@ static const struct bsdtar_option { { "format", 1, OPTION_FORMAT }, { "gid", 1, OPTION_GID }, { "gname", 1, OPTION_GNAME }, + { "group", 1, OPTION_GROUP }, { "grzip", 0, OPTION_GRZIP }, { "gunzip", 0, 'z' }, { "gzip", 0, 'z' }, @@ -142,6 +142,7 @@ static const struct bsdtar_option { { "older-than", 1, OPTION_OLDER_CTIME_THAN }, { "one-file-system", 0, OPTION_ONE_FILE_SYSTEM }, { "options", 1, OPTION_OPTIONS }, + { "owner", 1, OPTION_OWNER }, { "passphrase", 1, OPTION_PASSPHRASE }, { "posix", 0, OPTION_POSIX }, { "preserve-permissions", 0, 'p' }, diff --git a/tar/config_freebsd.h b/tar/config_freebsd.h index 37aa9dcae172..761f71cfbeca 100644 --- a/tar/config_freebsd.h +++ b/tar/config_freebsd.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/usr.bin/tar/config_freebsd.h,v 1.8 2008/11/29 20:06:53 kientzle Exp $ */ /* A default configuration for FreeBSD, used if there is no config.h. */ diff --git a/tar/creation_set.c b/tar/creation_set.c index cfc5a642aed3..5cd1232b764c 100644 --- a/tar/creation_set.c +++ b/tar/creation_set.c @@ -24,7 +24,6 @@ */ #include "bsdtar_platform.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_STDLIB_H #include diff --git a/tar/read.c b/tar/read.c index b9599661967c..a7f14a07bb35 100644 --- a/tar/read.c +++ b/tar/read.c @@ -24,7 +24,6 @@ */ #include "bsdtar_platform.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/read.c,v 1.40 2008/08/21 06:41:14 kientzle Exp $"); #ifdef HAVE_SYS_TYPES_H #include @@ -372,8 +371,9 @@ read_archive(struct bsdtar *bsdtar, char mode, struct archive *writer) if (r != ARCHIVE_OK) { if (!bsdtar->verbose) safe_fprintf(stderr, "%s", archive_entry_pathname(entry)); - fprintf(stderr, ": %s: ", archive_error_string(a)); - fprintf(stderr, "%s", strerror(errno)); + safe_fprintf(stderr, ": %s: %s", + archive_error_string(a), + strerror(archive_errno(a))); if (!bsdtar->verbose) fprintf(stderr, "\n"); bsdtar->return_value = 1; diff --git a/tar/subst.c b/tar/subst.c index 55ad63dcecde..9747abb906c4 100644 --- a/tar/subst.c +++ b/tar/subst.c @@ -24,14 +24,15 @@ */ #include "bsdtar_platform.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/subst.c,v 1.4 2008/06/15 10:08:16 kientzle Exp $"); -#if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) +#if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) || defined(HAVE_PCRE2POSIX_H) #include "bsdtar.h" #include -#ifdef HAVE_PCREPOSIX_H +#if defined(HAVE_PCREPOSIX_H) #include +#elif defined(HAVE_PCRE2POSIX_H) +#include #else #include #endif @@ -48,7 +49,7 @@ struct subst_rule { struct subst_rule *next; regex_t re; char *result; - unsigned int global:1, print:1, regular:1, symlink:1, hardlink:1; + unsigned int global:1, print:1, regular:1, symlink:1, hardlink:1, from_begin:1; }; struct substitution { @@ -128,9 +129,14 @@ add_substitution(struct bsdtar *bsdtar, const char *rule_text) rule->regular = 1; /* Rewrite regular filenames. */ rule->symlink = 1; /* Rewrite symlink targets. */ rule->hardlink = 1; /* Rewrite hardlink targets. */ + rule->from_begin = 0; /* Don't match from start. */ while (*++end_pattern) { switch (*end_pattern) { + case 'b': + case 'B': + rule->from_begin = 1; + break; case 'g': case 'G': rule->global = 1; @@ -159,6 +165,7 @@ add_substitution(struct bsdtar *bsdtar, const char *rule_text) break; default: lafe_errc(1, 0, "Invalid replacement flag %c", *end_pattern); + /* NOTREACHED */ } } } @@ -212,6 +219,7 @@ apply_substitution(struct bsdtar *bsdtar, const char *name, char **result, { const char *path = name; regmatch_t matches[10]; + char* buffer = NULL; size_t i, j; struct subst_rule *rule; struct substitution *subst; @@ -237,6 +245,13 @@ apply_substitution(struct bsdtar *bsdtar, const char *name, char **result, continue; } + if (rule->from_begin && *result) { + realloc_strcat(result, name); + realloc_strcat(&buffer, *result); + name = buffer; + (*result)[0] = 0; + } + while (1) { if (regexec(&rule->re, name, 10, matches, 0)) break; @@ -276,6 +291,7 @@ apply_substitution(struct bsdtar *bsdtar, const char *name, char **result, case '9': realloc_strncat(result, rule->result + j, i - j - 1); if ((size_t)(c - '0') > (size_t)(rule->re.re_nsub)) { + free(buffer); free(*result); *result = NULL; return -1; @@ -302,6 +318,8 @@ apply_substitution(struct bsdtar *bsdtar, const char *name, char **result, if (got_match) realloc_strcat(result, name); + free(buffer); + if (print_match) fprintf(stderr, "%s >> %s\n", path, *result); @@ -325,4 +343,4 @@ cleanup_substitution(struct bsdtar *bsdtar) } free(subst); } -#endif /* defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) */ +#endif /* defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) || defined(HAVE_PCRE2POSIX_H) */ diff --git a/tar/test/CMakeLists.txt b/tar/test/CMakeLists.txt index 3b6675393d18..7808a8d1f2ba 100644 --- a/tar/test/CMakeLists.txt +++ b/tar/test/CMakeLists.txt @@ -43,6 +43,7 @@ IF(ENABLE_TAR AND ENABLE_TEST) test_option_exclude_vcs.c test_option_fflags.c test_option_gid_gname.c + test_option_group.c test_option_grzip.c test_option_ignore_zeros.c test_option_j.c @@ -56,6 +57,7 @@ IF(ENABLE_TAR AND ENABLE_TEST) test_option_newer_than.c test_option_nodump.c test_option_older_than.c + test_option_owner.c test_option_passphrase.c test_option_q.c test_option_r.c diff --git a/tar/test/test.h b/tar/test/test.h index 1e1bee80709c..549357b4e0fd 100644 --- a/tar/test/test.h +++ b/tar/test/test.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ /* Every test program should #include "test.h" as the first thing. */ diff --git a/tar/test/test_0.c b/tar/test/test_0.c index b73c7a3f4fab..7a3c2e46858f 100644 --- a/tar/test/test_0.c +++ b/tar/test/test_0.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_0.c,v 1.2 2008/05/26 17:10:10 kientzle Exp $"); /* * This first test does basic sanity checks on the environment. For diff --git a/tar/test/test_basic.c b/tar/test/test_basic.c index b1c49834a45f..a59236c92b55 100644 --- a/tar/test/test_basic.c +++ b/tar/test/test_basic.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_basic.c,v 1.2 2008/05/26 17:10:10 kientzle Exp $"); static const char * make_files(void) diff --git a/tar/test/test_copy.c b/tar/test/test_copy.c index b8175c359907..fd47a6d877e6 100644 --- a/tar/test/test_copy.c +++ b/tar/test/test_copy.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_copy.c,v 1.3 2008/08/15 06:12:02 kientzle Exp $"); #if defined(__CYGWIN__) # include diff --git a/tar/test/test_empty_mtree.c b/tar/test/test_empty_mtree.c index 6f8a5e91aa1a..11cdfb56690a 100644 --- a/tar/test/test_empty_mtree.c +++ b/tar/test/test_empty_mtree.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Regression test: We used to get a bogus error message when we diff --git a/tar/test/test_extract_tar_Z.c b/tar/test/test_extract_tar_Z.c index 7c994b472a79..b03aca6d1da5 100644 --- a/tar/test/test_extract_tar_Z.c +++ b/tar/test/test_extract_tar_Z.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_Z) { diff --git a/tar/test/test_extract_tar_bz2.c b/tar/test/test_extract_tar_bz2.c index b734dd28ba74..02b3ee326d5b 100644 --- a/tar/test/test_extract_tar_bz2.c +++ b/tar/test/test_extract_tar_bz2.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_bz2) { diff --git a/tar/test/test_extract_tar_grz.c b/tar/test/test_extract_tar_grz.c index 9c0615e981f2..f0adf994dec6 100644 --- a/tar/test/test_extract_tar_grz.c +++ b/tar/test/test_extract_tar_grz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_grz) { diff --git a/tar/test/test_extract_tar_gz.c b/tar/test/test_extract_tar_gz.c index 2fdb4ba7cdff..b17d66f01529 100644 --- a/tar/test/test_extract_tar_gz.c +++ b/tar/test/test_extract_tar_gz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_gz) { diff --git a/tar/test/test_extract_tar_lrz.c b/tar/test/test_extract_tar_lrz.c index 56a0fb88231e..d6049809bb22 100644 --- a/tar/test/test_extract_tar_lrz.c +++ b/tar/test/test_extract_tar_lrz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_lrz) { diff --git a/tar/test/test_extract_tar_lz.c b/tar/test/test_extract_tar_lz.c index 5ec7e9a48f2f..3889138928d1 100644 --- a/tar/test/test_extract_tar_lz.c +++ b/tar/test/test_extract_tar_lz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_lz) { diff --git a/tar/test/test_extract_tar_lz4.c b/tar/test/test_extract_tar_lz4.c index 150d57d71551..f0e03ed3206e 100644 --- a/tar/test/test_extract_tar_lz4.c +++ b/tar/test/test_extract_tar_lz4.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_lz4) { diff --git a/tar/test/test_extract_tar_lzma.c b/tar/test/test_extract_tar_lzma.c index 2fa2af049446..fd9f547fb524 100644 --- a/tar/test/test_extract_tar_lzma.c +++ b/tar/test/test_extract_tar_lzma.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_lzma) { diff --git a/tar/test/test_extract_tar_lzo.c b/tar/test/test_extract_tar_lzo.c index 17b4295edf63..9c05e15a6b04 100644 --- a/tar/test/test_extract_tar_lzo.c +++ b/tar/test/test_extract_tar_lzo.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_lzo) { diff --git a/tar/test/test_extract_tar_xz.c b/tar/test/test_extract_tar_xz.c index 860bab75acf7..8684072d76f5 100644 --- a/tar/test/test_extract_tar_xz.c +++ b/tar/test/test_extract_tar_xz.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_xz) { diff --git a/tar/test/test_extract_tar_zstd.c b/tar/test/test_extract_tar_zstd.c index d67170ce3433..1eced8817387 100644 --- a/tar/test/test_extract_tar_zstd.c +++ b/tar/test/test_extract_tar_zstd.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_extract_tar_zstd) { diff --git a/tar/test/test_format_newc.c b/tar/test/test_format_newc.c index 808fa4b49180..5357cc7cdae4 100644 --- a/tar/test/test_format_newc.c +++ b/tar/test/test_format_newc.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_format_newc) { diff --git a/tar/test/test_help.c b/tar/test/test_help.c index 3bb517d00cde..fd97a217b789 100644 --- a/tar/test/test_help.c +++ b/tar/test/test_help.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_help.c,v 1.2 2008/05/26 17:10:10 kientzle Exp $"); /* * Test that "--help", "-h", and "-W help" options all work and diff --git a/tar/test/test_leading_slash.c b/tar/test/test_leading_slash.c index 572c45e3cbb7..ca64ad154055 100644 --- a/tar/test/test_leading_slash.c +++ b/tar/test/test_leading_slash.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_leading_slash) { diff --git a/tar/test/test_missing_file.c b/tar/test/test_missing_file.c index 808e384e10b0..1cc40f3745e8 100644 --- a/tar/test/test_missing_file.c +++ b/tar/test/test_missing_file.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_missing_file) { diff --git a/tar/test/test_option_C_mtree.c b/tar/test/test_option_C_mtree.c index ccadc389974c..25679644af61 100644 --- a/tar/test/test_option_C_mtree.c +++ b/tar/test/test_option_C_mtree.c @@ -26,7 +26,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_C_mtree) { diff --git a/tar/test/test_option_C_upper.c b/tar/test/test_option_C_upper.c index 538890f58178..cadc924e1d47 100644 --- a/tar/test/test_option_C_upper.c +++ b/tar/test/test_option_C_upper.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_C_upper) { diff --git a/tar/test/test_option_H_upper.c b/tar/test/test_option_H_upper.c index 2c2ad33ce75b..097a9729d26f 100644 --- a/tar/test/test_option_H_upper.c +++ b/tar/test/test_option_H_upper.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_H_upper) { diff --git a/tar/test/test_option_L_upper.c b/tar/test/test_option_L_upper.c index 5697b0f293c2..fd1ed0a52c76 100644 --- a/tar/test/test_option_L_upper.c +++ b/tar/test/test_option_L_upper.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_L_upper) { diff --git a/tar/test/test_option_O_upper.c b/tar/test/test_option_O_upper.c index b9c8c0cad109..a5540dbe8417 100644 --- a/tar/test/test_option_O_upper.c +++ b/tar/test/test_option_O_upper.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static const char *test4out[] = {"file1", "file2", NULL}; static const char *test5err[] = {"file1", "file2", NULL}; diff --git a/tar/test/test_option_T_upper.c b/tar/test/test_option_T_upper.c index f2b65d7bdc23..c64767fcfb84 100644 --- a/tar/test/test_option_T_upper.c +++ b/tar/test/test_option_T_upper.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_option_T.c,v 1.3 2008/08/15 06:12:02 kientzle Exp $"); static int tryMakeFile(const char *fn) diff --git a/tar/test/test_option_U_upper.c b/tar/test/test_option_U_upper.c index d864e13c4f6b..4518a5f9fd8e 100644 --- a/tar/test/test_option_U_upper.c +++ b/tar/test/test_option_U_upper.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_U_upper) { diff --git a/tar/test/test_option_X_upper.c b/tar/test/test_option_X_upper.c index 4916af2970e8..b5ea98b9a0d7 100644 --- a/tar/test/test_option_X_upper.c +++ b/tar/test/test_option_X_upper.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_X_upper) { diff --git a/tar/test/test_option_a.c b/tar/test/test_option_a.c index d9eed8777ff2..52797411c751 100644 --- a/tar/test/test_option_a.c +++ b/tar/test/test_option_a.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_a) { diff --git a/tar/test/test_option_acls.c b/tar/test/test_option_acls.c index f7451c8eb36b..333ac2e4fb47 100644 --- a/tar/test/test_option_acls.c +++ b/tar/test/test_option_acls.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #if ARCHIVE_ACL_FREEBSD || ARCHIVE_ACL_DARWIN || ARCHIVE_ACL_LIBACL static const acl_perm_t acl_perms[] = { diff --git a/tar/test/test_option_b.c b/tar/test/test_option_b.c index d1b75e350613..d7e0f399c297 100644 --- a/tar/test/test_option_b.c +++ b/tar/test/test_option_b.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #define USTAR_OPT " --format=ustar" diff --git a/tar/test/test_option_b64encode.c b/tar/test/test_option_b64encode.c index 1d0420430e09..b9a2b809ea4a 100644 --- a/tar/test/test_option_b64encode.c +++ b/tar/test/test_option_b64encode.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_b64encode) { diff --git a/tar/test/test_option_exclude.c b/tar/test/test_option_exclude.c index 1345f70aa160..b21ec624aec2 100644 --- a/tar/test/test_option_exclude.c +++ b/tar/test/test_option_exclude.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_exclude) { diff --git a/tar/test/test_option_exclude_vcs.c b/tar/test/test_option_exclude_vcs.c index 202151139996..ec4dc5594f5c 100644 --- a/tar/test/test_option_exclude_vcs.c +++ b/tar/test/test_option_exclude_vcs.c @@ -23,10 +23,10 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_exclude_vcs) { + assertUmask(0); assertMakeDir("in", 0755); assertChdir("in"); assertMakeFile("file", 0644, ""); diff --git a/tar/test/test_option_fflags.c b/tar/test/test_option_fflags.c index f223feb19069..045c780edefc 100644 --- a/tar/test/test_option_fflags.c +++ b/tar/test/test_option_fflags.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__BORLANDC__) #define chmod _chmod diff --git a/tar/test/test_option_gid_gname.c b/tar/test/test_option_gid_gname.c index 4e5f51c8f486..a4cff1ab2f64 100644 --- a/tar/test/test_option_gid_gname.c +++ b/tar/test/test_option_gid_gname.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_gid_gname) { diff --git a/tar/test/test_option_group.c b/tar/test/test_option_group.c new file mode 100644 index 000000000000..d429ddab9f9f --- /dev/null +++ b/tar/test/test_option_group.c @@ -0,0 +1,84 @@ +/*- + * Copyright (c) 2003-2010 Tim Kientzle + * Copyright (c) 2024 Haelwenn (lanodan) Monnier + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +DEFINE_TEST(test_option_group) +{ + char *reference, *data; + size_t s; + + assertUmask(0); + assertMakeFile("file", 0644, "1234567890"); + + /* Create archive with no special options. */ + failure("Error invoking %s c", testprog); + assertEqualInt(0, + systemf("%s cf archive1 --format=ustar file >stdout1.txt 2>stderr1.txt", + testprog)); + assertEmptyFile("stdout1.txt"); + assertEmptyFile("stderr1.txt"); + reference = slurpfile(&s, "archive1"); + + /* Create archive with --group (numeric) */ + failure("Error invoking %s c", testprog); + assertEqualInt(0, + systemf("%s cf archive2 --group=17 --format=ustar file >stdout2.txt 2>stderr2.txt", + testprog)); + assertEmptyFile("stdout2.txt"); + assertEmptyFile("stderr2.txt"); + data = slurpfile(&s, "archive2"); + assertEqualMem(data + 116, "000021 \0", 8); + /* Gname field in ustar header should be empty. */ + assertEqualMem(data + 297, "\0", 1); + free(data); + + /* Again with --group (name) */ + failure("Error invoking %s c", testprog); + assertEqualInt(0, + systemf("%s cf archive3 --group=foofoofoo --format=ustar file >stdout3.txt 2>stderr3.txt", + testprog)); + assertEmptyFile("stdout3.txt"); + assertEmptyFile("stderr3.txt"); + data = slurpfile(&s, "archive3"); + /* Gid should be unchanged from original reference. */ + assertEqualMem(data + 116, reference + 116, 8); + assertEqualMem(data + 297, "foofoofoo\0", 10); + free(data); + + /* Again with --group (name:id) */ + failure("Error invoking %s c", testprog); + assertEqualInt(0, + systemf("%s cf archive4 --group=foofoofoo:17 --format=ustar file >stdout4.txt 2>stderr4.txt", + testprog)); + assertEmptyFile("stdout4.txt"); + assertEmptyFile("stderr4.txt"); + data = slurpfile(&s, "archive4"); + assertEqualMem(data + 116, "000021 \0", 8); + assertEqualMem(data + 297, "foofoofoo\0", 10); + free(data); + + free(reference); +} diff --git a/tar/test/test_option_grzip.c b/tar/test/test_option_grzip.c index fbff252421d1..d898e4408151 100644 --- a/tar/test/test_option_grzip.c +++ b/tar/test/test_option_grzip.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_grzip) { diff --git a/tar/test/test_option_ignore_zeros.c b/tar/test/test_option_ignore_zeros.c index 26c9320e3008..985ad3082fce 100644 --- a/tar/test/test_option_ignore_zeros.c +++ b/tar/test/test_option_ignore_zeros.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); static int make_files(void) diff --git a/tar/test/test_option_j.c b/tar/test/test_option_j.c index 838234a2aeb5..cf4d91d0afac 100644 --- a/tar/test/test_option_j.c +++ b/tar/test/test_option_j.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_j) { diff --git a/tar/test/test_option_k.c b/tar/test/test_option_k.c index e57cc274cfc4..873a1209b0a9 100644 --- a/tar/test/test_option_k.c +++ b/tar/test/test_option_k.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_k) { diff --git a/tar/test/test_option_keep_newer_files.c b/tar/test/test_option_keep_newer_files.c index 089898cc27e0..2572a98c5812 100644 --- a/tar/test/test_option_keep_newer_files.c +++ b/tar/test/test_option_keep_newer_files.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_keep_newer_files) { diff --git a/tar/test/test_option_lrzip.c b/tar/test/test_option_lrzip.c index 11e9827e0405..8bf4633f643e 100644 --- a/tar/test/test_option_lrzip.c +++ b/tar/test/test_option_lrzip.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_lrzip) { diff --git a/tar/test/test_option_lz4.c b/tar/test/test_option_lz4.c index 70fdaac3600f..1b766d04969f 100644 --- a/tar/test/test_option_lz4.c +++ b/tar/test/test_option_lz4.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_lz4) { diff --git a/tar/test/test_option_lzma.c b/tar/test/test_option_lzma.c index ab6f13f91744..1d8697b53ee8 100644 --- a/tar/test/test_option_lzma.c +++ b/tar/test/test_option_lzma.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_lzma) { diff --git a/tar/test/test_option_lzop.c b/tar/test/test_option_lzop.c index 20ef06c5c8a0..d96a14f08fea 100644 --- a/tar/test/test_option_lzop.c +++ b/tar/test/test_option_lzop.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_lzop) { diff --git a/tar/test/test_option_n.c b/tar/test/test_option_n.c index f36658ef1656..a6bda0599e16 100644 --- a/tar/test/test_option_n.c +++ b/tar/test/test_option_n.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); #ifdef HAVE_SYS_WAIT_H #include diff --git a/tar/test/test_option_newer_than.c b/tar/test/test_option_newer_than.c index 2a5fe04e6968..a250a4c8d8c6 100644 --- a/tar/test/test_option_newer_than.c +++ b/tar/test/test_option_newer_than.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_newer_than) { diff --git a/tar/test/test_option_nodump.c b/tar/test/test_option_nodump.c index 815b08ed9251..6a5b66e3215a 100644 --- a/tar/test/test_option_nodump.c +++ b/tar/test/test_option_nodump.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_nodump) { diff --git a/tar/test/test_option_older_than.c b/tar/test/test_option_older_than.c index 4bdd2edfe0bd..d57c4d414b8f 100644 --- a/tar/test/test_option_older_than.c +++ b/tar/test/test_option_older_than.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_older_than) { diff --git a/tar/test/test_option_owner.c b/tar/test/test_option_owner.c new file mode 100644 index 000000000000..04c86cc0e8d4 --- /dev/null +++ b/tar/test/test_option_owner.c @@ -0,0 +1,84 @@ +/*- + * Copyright (c) 2003-2010 Tim Kientzle + * Copyright (c) 2024 Haelwenn (lanodan) Monnier + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +DEFINE_TEST(test_option_owner) +{ + char *reference, *data; + size_t s; + + assertUmask(0); + assertMakeFile("file", 0644, "1234567890"); + + /* Create archive with no special options. */ + failure("Error invoking %s c", testprog); + assertEqualInt(0, + systemf("%s cf archive1 --format=ustar file >stdout1.txt 2>stderr1.txt", + testprog)); + assertEmptyFile("stdout1.txt"); + assertEmptyFile("stderr1.txt"); + reference = slurpfile(&s, "archive1"); + + /* Create archive with --owner (numeric) */ + failure("Error invoking %s c", testprog); + assertEqualInt(0, + systemf("%s cf archive2 --owner=65123 --format=ustar file >stdout2.txt 2>stderr2.txt", + testprog)); + assertEmptyFile("stdout2.txt"); + assertEmptyFile("stderr2.txt"); + data = slurpfile(&s, "archive2"); + assertEqualMem(data + 108, "177143 \0", 8); + /* Uname field in ustar header should be empty. */ + assertEqualMem(data + 265, "\0", 1); + free(data); + + /* Again with just --owner (name) */ + failure("Error invoking %s c", testprog); + assertEqualInt(0, + systemf("%s cf archive3 --owner=foofoofoo --format=ustar file >stdout3.txt 2>stderr3.txt", + testprog)); + assertEmptyFile("stdout3.txt"); + assertEmptyFile("stderr3.txt"); + data = slurpfile(&s, "archive3"); + /* Uid should be unchanged from original reference. */ + assertEqualMem(data + 108, reference + 108, 8); + assertEqualMem(data + 265, "foofoofoo\0", 10); + free(data); + + /* Again with just --owner (name:id) */ + failure("Error invoking %s c", testprog); + assertEqualInt(0, + systemf("%s cf archive4 --owner=foofoofoo:65123 --format=ustar file >stdout4.txt 2>stderr4.txt", + testprog)); + assertEmptyFile("stdout4.txt"); + assertEmptyFile("stderr4.txt"); + data = slurpfile(&s, "archive4"); + assertEqualMem(data + 108, "177143 \0", 8); + assertEqualMem(data + 265, "foofoofoo\0", 10); + free(data); + + free(reference); +} diff --git a/tar/test/test_option_passphrase.c b/tar/test/test_option_passphrase.c index 337292c95bfc..74f3d3d5d031 100644 --- a/tar/test/test_option_passphrase.c +++ b/tar/test/test_option_passphrase.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_passphrase) { diff --git a/tar/test/test_option_q.c b/tar/test/test_option_q.c index 287e67afa518..fd4b55e545ae 100644 --- a/tar/test/test_option_q.c +++ b/tar/test/test_option_q.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_option_q.c,v 1.3 2008/08/22 01:35:08 kientzle Exp $"); DEFINE_TEST(test_option_q) { diff --git a/tar/test/test_option_r.c b/tar/test/test_option_r.c index 287e80939adf..655b973ad1e2 100644 --- a/tar/test/test_option_r.c +++ b/tar/test/test_option_r.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); /* * Also see test_option_q for additional validation of -r support. diff --git a/tar/test/test_option_s.c b/tar/test/test_option_s.c index fa799a295d01..564793b97d5e 100644 --- a/tar/test/test_option_s.c +++ b/tar/test/test_option_s.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_option_T.c,v 1.3 2008/08/15 06:12:02 kientzle Exp $"); DEFINE_TEST(test_option_s) { @@ -88,6 +87,17 @@ DEFINE_TEST(test_option_s) assertFileContents("foo", 3, "test4/in/d1/bar"); assertFileContents("bar", 3, "test4/in/d1/baz"); + /* + * Test 4b: Multiple substitutions behavior with option b). + */ + assertMakeDir("test4b", 0755); + systemf("%s -cf test4b.tar in/d1/foo in/d1/bar", + testprog); + systemf("%s -xf test4b.tar -s /oo/ar/ -s }ar}az}b -C test4b", + testprog); + assertFileContents("foo", 3, "test4b/in/d1/faz"); + assertFileContents("bar", 3, "test4b/in/d1/baz"); + /* * Test 5: Name-switching substitutions when extracting archive. */ diff --git a/tar/test/test_option_safe_writes.c b/tar/test/test_option_safe_writes.c index 7b42e8f62253..d1e36cfd4736 100644 --- a/tar/test/test_option_safe_writes.c +++ b/tar/test/test_option_safe_writes.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_safe_writes) { diff --git a/tar/test/test_option_uid_uname.c b/tar/test/test_option_uid_uname.c index 80c061961488..261e3b86565b 100644 --- a/tar/test/test_option_uid_uname.c +++ b/tar/test/test_option_uid_uname.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_uid_uname) { diff --git a/tar/test/test_option_uuencode.c b/tar/test/test_option_uuencode.c index a28a8e3407a3..4bb6e0898c2b 100644 --- a/tar/test/test_option_uuencode.c +++ b/tar/test/test_option_uuencode.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_uuencode) { diff --git a/tar/test/test_option_xattrs.c b/tar/test/test_option_xattrs.c index 79dfff528303..eef6c779bb52 100644 --- a/tar/test/test_option_xattrs.c +++ b/tar/test/test_option_xattrs.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_xattrs) { diff --git a/tar/test/test_option_xz.c b/tar/test/test_option_xz.c index 91da0730ac94..45163e735f19 100644 --- a/tar/test/test_option_xz.c +++ b/tar/test/test_option_xz.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_xz) { diff --git a/tar/test/test_option_z.c b/tar/test/test_option_z.c index 59744999fc5c..8e10e37ba22e 100644 --- a/tar/test/test_option_z.c +++ b/tar/test/test_option_z.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_z) { diff --git a/tar/test/test_option_zstd.c b/tar/test/test_option_zstd.c index 73965e33f3af..f9983670249c 100644 --- a/tar/test/test_option_zstd.c +++ b/tar/test/test_option_zstd.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_option_zstd) { diff --git a/tar/test/test_patterns.c b/tar/test/test_patterns.c index e1449008b6e1..64f8fffe90f9 100644 --- a/tar/test/test_patterns.c +++ b/tar/test/test_patterns.c @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_patterns.c,v 1.6 2008/08/21 22:28:00 kientzle Exp $"); DEFINE_TEST(test_patterns) { diff --git a/tar/test/test_print_longpath.c b/tar/test/test_print_longpath.c index 4bac1679cc97..a21651fa15eb 100644 --- a/tar/test/test_print_longpath.c +++ b/tar/test/test_print_longpath.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD$"); DEFINE_TEST(test_print_longpath) { diff --git a/tar/test/test_stdio.c b/tar/test/test_stdio.c index d6650a5eb20a..d046727a2dd3 100644 --- a/tar/test/test_stdio.c +++ b/tar/test/test_stdio.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_stdio.c,v 1.2 2008/05/26 17:10:10 kientzle Exp $"); DEFINE_TEST(test_stdio) { diff --git a/tar/test/test_strip_components.c b/tar/test/test_strip_components.c index 090fb0dbf913..9bf79ab7cf20 100644 --- a/tar/test/test_strip_components.c +++ b/tar/test/test_strip_components.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_strip_components.c,v 1.2 2008/11/10 05:24:13 kientzle Exp $"); DEFINE_TEST(test_strip_components) { diff --git a/tar/test/test_symlink_dir.c b/tar/test/test_symlink_dir.c index 5836647c1a23..4c5666204388 100644 --- a/tar/test/test_symlink_dir.c +++ b/tar/test/test_symlink_dir.c @@ -23,7 +23,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/test/test_symlink_dir.c,v 1.1 2008/09/14 02:16:04 kientzle Exp $"); /* * tar -x -P should follow existing symlinks for dirs, but not other diff --git a/tar/util.c b/tar/util.c index 403d7ff35c50..37c3a23231bd 100644 --- a/tar/util.c +++ b/tar/util.c @@ -24,7 +24,6 @@ */ #include "bsdtar_platform.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/util.c,v 1.23 2008/12/15 06:00:25 kientzle Exp $"); #ifdef HAVE_SYS_STAT_H #include @@ -471,7 +470,7 @@ edit_pathname(struct bsdtar *bsdtar, struct archive_entry *entry) const char *original_name = name; const char *hardlinkname = archive_entry_hardlink(entry); const char *original_hardlinkname = hardlinkname; -#if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) +#if defined(HAVE_REGEX_H) || defined(HAVE_PCREPOSIX_H) || defined(HAVE_PCRE2POSIX_H) char *subst_name; int r; diff --git a/tar/write.c b/tar/write.c index d3e4ca4e0f44..5c7b13ae682f 100644 --- a/tar/write.c +++ b/tar/write.c @@ -25,7 +25,6 @@ */ #include "bsdtar_platform.h" -__FBSDID("$FreeBSD: src/usr.bin/tar/write.c,v 1.79 2008/11/27 05:49:52 kientzle Exp $"); #ifdef HAVE_SYS_TYPES_H #include diff --git a/test_utils/test_common.h b/test_utils/test_common.h index 6250235c6ca9..8e1ec82436f8 100644 --- a/test_utils/test_common.h +++ b/test_utils/test_common.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ #ifndef TEST_COMMON_H @@ -134,16 +132,6 @@ #include #endif -/* Get a real definition for __FBSDID if we can */ -#if HAVE_SYS_CDEFS_H -#include -#endif - -/* If not, define it so as to avoid dangling semicolons. */ -#ifndef __FBSDID -#define __FBSDID(a) struct _undefined_hack -#endif - #ifndef O_BINARY #define O_BINARY 0 #endif @@ -178,6 +166,8 @@ /* Assert two integers are the same. Reports value of each one if not. */ #define assertEqualInt(v1,v2) \ assertion_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL) +#define assertEqualAddress(v1,v2) \ + assertion_equal_address(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL) /* Assert two strings are the same. Reports value of each one if not. */ #define assertEqualString(v1,v2) \ assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL, 0) @@ -291,6 +281,7 @@ int assertion_compare_fflags(const char *, int, const char *, const char *, int assertion_empty_file(const char *, int, const char *); int assertion_equal_file(const char *, int, const char *, const char *); int assertion_equal_int(const char *, int, long long, const char *, long long, const char *, void *); +int assertion_equal_address(const char *, int, const void *, const char *, const void *, const char *, void *); int assertion_equal_mem(const char *, int, const void *, const char *, const void *, const char *, size_t, const char *, void *); int assertion_memory_filled_with(const char *, int, const void *, const char *, size_t, const char *, char, const char *, void *); int assertion_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *, int); diff --git a/test_utils/test_main.c b/test_utils/test_main.c index e4b884ee3c44..6617732a335b 100644 --- a/test_utils/test_main.c +++ b/test_utils/test_main.c @@ -625,6 +625,21 @@ assertion_equal_int(const char *file, int line, return (0); } +/* Verify two pointers are equal. */ +int +assertion_equal_address(const char *file, int line, + const void *v1, const char *e1, const void *v2, const char *e2, void *extra) +{ + assertion_count(file, line); + if (v1 == v2) + return (1); + failure_start(file, line, "%s != %s", e1, e2); + logprintf(" %s=0x%llx\n", e1, (unsigned long long)(uintptr_t)v1); + logprintf(" %s=0x%llx\n", e2, (unsigned long long)(uintptr_t)v2); + failure_finish(extra); + return (0); +} + /* * Utility to convert a single UTF-8 sequence. */ @@ -1245,7 +1260,7 @@ assertion_file_contains_lines_any_order(const char *file, int line, c = *p; } if (actual_count) { - actual = calloc(sizeof(char *), actual_count); + actual = calloc(actual_count, sizeof(char *)); if (actual == NULL) { failure_start(pathname, line, "Can't allocate memory"); failure_finish(NULL); @@ -4175,7 +4190,6 @@ main(int argc, char **argv) free(refdir_alloc); free(testprogdir); usage(progname); - return (1); } for (i = 0; i < test_num; i++) { tests_run++; diff --git a/unzip/bsdunzip.1 b/unzip/bsdunzip.1 index dda01e7b84d7..a67ca2327066 100644 --- a/unzip/bsdunzip.1 +++ b/unzip/bsdunzip.1 @@ -23,8 +23,6 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $FreeBSD$ -.\" .Dd June 27, 2023 .Dt BSDUNZIP 1 .Os diff --git a/unzip/bsdunzip.c b/unzip/bsdunzip.c index 29c3a1670483..af3fb14c3636 100644 --- a/unzip/bsdunzip.c +++ b/unzip/bsdunzip.c @@ -27,8 +27,6 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD$ - * * This file would be much shorter if we didn't care about command-line * compatibility with Info-ZIP's UnZip, which requires us to duplicate * parts of libarchive in order to gain more detailed control of its @@ -59,6 +57,9 @@ #ifdef HAVE_FNMATCH_H #include #endif +#ifdef HAVE_LOCALE_H +#include +#endif #ifdef HAVE_STDARG_H #include #endif @@ -78,6 +79,9 @@ #include #endif #endif +#ifdef HAVE_GETOPT_OPTRESET +#include +#endif #include "bsdunzip.h" #include "passphrase.h" @@ -1209,6 +1213,11 @@ main(int argc, char *argv[]) lafe_setprogname(*argv, "bsdunzip"); +#if HAVE_SETLOCALE + if (setlocale(LC_ALL, "") == NULL) + lafe_warnc(0, "Failed to set default locale"); +#endif + if (isatty(STDOUT_FILENO)) tty = 1; @@ -1229,10 +1238,8 @@ main(int argc, char *argv[]) */ nopts = getopts(argc, argv); - if (version_opt == 1) { + if (version_opt == 1) version(); - exit(EXIT_SUCCESS); - } /* * When more of the zipinfo mode options are implemented, this diff --git a/unzip/bsdunzip_platform.h b/unzip/bsdunzip_platform.h index 76eca4f90902..d4fcbb1aeab4 100644 --- a/unzip/bsdunzip_platform.h +++ b/unzip/bsdunzip_platform.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD: src/usr.bin/tar/bsdtar_platform.h,v 1.26 2008/12/06 07:37:14 kientzle Exp $ */ /* @@ -42,16 +40,6 @@ #include "config.h" #endif -/* Get a real definition for __FBSDID if we can */ -#if HAVE_SYS_CDEFS_H -#include -#endif - -/* If not, define it so as to avoid dangling semicolons. */ -#ifndef __FBSDID -#define __FBSDID(a) struct _undefined_hack -#endif - #ifdef HAVE_LIBARCHIVE /* If we're using the platform libarchive, include system headers. */ #include @@ -64,12 +52,14 @@ /* How to mark functions that don't return. */ /* This facilitates use of some newer static code analysis tools. */ -#undef __LA_DEAD +#undef __LA_NORETURN #if defined(__GNUC__) && (__GNUC__ > 2 || \ - (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) -#define __LA_DEAD __attribute__((__noreturn__)) -#else -#define __LA_DEAD + (__GNUC__ == 2 && __GNUC_MINOR__ >= 5)) +#define __LA_NORETURN __attribute__((__noreturn__)) +#elif defined(_MSC_VER) +#define __LA_NORETURN __declspec(noreturn) +#else +#define __LA_NORETURN #endif #endif /* !BSDUNZIP_PLATFORM_H_INCLUDED */ diff --git a/unzip/cmdline.c b/unzip/cmdline.c index 76eb423de116..ab1aeb31fe18 100644 --- a/unzip/cmdline.c +++ b/unzip/cmdline.c @@ -28,8 +28,6 @@ */ #include "bsdunzip_platform.h" -__FBSDID("$FreeBSD$"); - #ifdef HAVE_ERRNO_H #include #endif @@ -115,6 +113,7 @@ bsdunzip_getopt(struct bsdunzip *bsdunzip) if (strcmp(bsdunzip->argv[0], "--") == 0) { ++bsdunzip->argv; --bsdunzip->argc; + bsdunzip_optind++; return (-1); } /* Get next word for parsing. */ diff --git a/unzip/test/CMakeLists.txt b/unzip/test/CMakeLists.txt index 20e730a9cdca..f269c25f85e6 100644 --- a/unzip/test/CMakeLists.txt +++ b/unzip/test/CMakeLists.txt @@ -11,6 +11,7 @@ IF(ENABLE_UNZIP AND ENABLE_TEST) test.h test_0.c test_basic.c + test_doubledash.c test_glob.c test_singlefile.c test_C.c @@ -27,6 +28,7 @@ IF(ENABLE_UNZIP AND ENABLE_TEST) test_x.c test_Z1.c test_P_encryption.c + test_I.c ) # diff --git a/unzip/test/test.h b/unzip/test/test.h index ba876afd8e24..822c3f08133f 100644 --- a/unzip/test/test.h +++ b/unzip/test/test.h @@ -21,8 +21,6 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ */ /* Every test program should #include "test.h" as the first thing. */ diff --git a/unzip/test/test_I.c b/unzip/test/test_I.c new file mode 100644 index 000000000000..a6bad85a011f --- /dev/null +++ b/unzip/test/test_I.c @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2023 Aaron Lindros + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" + +/* Test I arg - file name encoding */ +DEFINE_TEST(test_I) +{ + const char *reffile = "test_I.zip"; + int r; + + extract_reference_file(reffile); + r = systemf("%s -I UTF-8 %s >test.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertNonEmptyFile("test.out"); + assertEmptyFile("test.err"); + + assertTextFileContents("Hello, World!\n", "Γειά σου Κόσμε.txt"); +} diff --git a/unzip/test/test_I.zip.uu b/unzip/test/test_I.zip.uu new file mode 100644 index 000000000000..8a1e7afa5b92 --- /dev/null +++ b/unzip/test/test_I.zip.uu @@ -0,0 +1,8 @@ +begin 644 test_I.zip +M4$L#!`H```@``&@)AU>$GNBT#@````X````>`!P`SI/.MZ+0.````#@```!X`&``` +M`````````*2!`````,Z3SK7.Ntest.out 2>test.err", testprog, reffile); + assertEqualInt(0, r); + assertNonEmptyFile("test.out"); + assertEmptyFile("test.err"); + + assertTextFileContents("contents a\n", "test_basic/a"); + assertTextFileContents("contents b\n", "test_basic/b"); + assertTextFileContents("contents c\n", "test_basic/c"); + assertTextFileContents("contents CAPS\n", "test_basic/CAPS"); +}